All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anand Jain <Anand.Jain@oracle.com>
To: linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: btrfs_scan_one_device return error code
Date: Thu, 14 Mar 2013 16:31:17 +0800	[thread overview]
Message-ID: <51418AD5.6090207@oracle.com> (raw)


Hi,

  /dev/sdc does not contain btrfs SB at all..

---
  # btrfs dev scan /dev/sdc
  Scanning for Btrfs filesystems in '/dev/sdc'
  ERROR: unable to scan the device '/dev/sdc' - Invalid argument
---

  here appropriate error is something like
  no btrfs found on dev

  However btrfs_scan_one_device (kernel) returns -EINVAL
  for other errors too

  Does the below fix sound reasonable ?

Thanks, Anand

--------------
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 6b9cff4..d6deae0 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -808,7 +808,7 @@ int btrfs_scan_one_device(const char *path, fmode_t 
flags, void *holder,
         struct block_device *bdev;
         struct page *page;
         void *p;
-       int ret = -EINVAL;
+       int ret = 0;
         u64 devid;
         u64 transid;
         u64 total_devices;
@@ -833,24 +833,32 @@ int btrfs_scan_one_device(const char *path, 
fmode_t flags, void *holder,
         }

         /* make sure our super fits in the device */
-       if (bytenr + PAGE_CACHE_SIZE >= i_size_read(bdev->bd_inode))
+       if (bytenr + PAGE_CACHE_SIZE >= i_size_read(bdev->bd_inode)) {
+               ret = -ENOSPC;
                 goto error_bdev_put;
+       }

         /* make sure our super fits in the page */
-       if (sizeof(*disk_super) > PAGE_CACHE_SIZE)
+       if (sizeof(*disk_super) > PAGE_CACHE_SIZE) {
+               ret = -ENOMEM;
                 goto error_bdev_put;
+       }

         /* make sure our super doesn't straddle pages on disk */
         index = bytenr >> PAGE_CACHE_SHIFT;
-       if ((bytenr + sizeof(*disk_super) - 1) >> PAGE_CACHE_SHIFT != index)
+       if ((bytenr + sizeof(*disk_super) - 1) >> PAGE_CACHE_SHIFT != 
index) {
+               ret = -ENOMEM;
                 goto error_bdev_put;
+       }

         /* pull in the page with our super */
         page = read_cache_page_gfp(bdev->bd_inode->i_mapping,
                                    index, GFP_NOFS);

-       if (IS_ERR_OR_NULL(page))
+       if (IS_ERR_OR_NULL(page)) {
+               ret = -EIO;
                 goto error_bdev_put;
+       }

         p = kmap(page);

@@ -858,8 +866,10 @@ int btrfs_scan_one_device(const char *path, fmode_t 
flags, void *holder,
         disk_super = p + (bytenr & ~PAGE_CACHE_MASK);

         if (btrfs_super_bytenr(disk_super) != bytenr ||
-           disk_super->magic != cpu_to_le64(BTRFS_MAGIC))
+           disk_super->magic != cpu_to_le64(BTRFS_MAGIC)) {
+               ret = -EINVAL;
                 goto error_unmap;
+       }

         devid = btrfs_stack_device_id(&disk_super->dev_item);
         transid = btrfs_super_generation(disk_super);
-------------------

             reply	other threads:[~2013-03-14  8:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-14  8:31 Anand Jain [this message]
2013-03-14 14:20 ` btrfs_scan_one_device return error code Eric Sandeen
2013-03-18  3:18   ` Anand Jain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51418AD5.6090207@oracle.com \
    --to=anand.jain@oracle.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.