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);
-------------------
next 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.