Btrfs-progs: fix wrong arg sb_bytenr for btrfs_scan_fs_devices()
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Wed, 17 Jul 2013 16:03:40 +0000 (00:03 +0800)
committerDavid Sterba <dsterba@suse.cz>
Fri, 9 Aug 2013 12:32:37 +0000 (14:32 +0200)
For most time, In open_ctree_*(), we use the first superblock
(BTRFS_SUPER_INFO_OFFSET). However, for btrfs-convert, we don't,
we should pass the correct sb_bytenr to btrfs_scan_fs_devices() rather
than always use BTRFS_SUPER_INFO_OFFSET.This patch fix the following
regression:

mkfs.ext2 <dev>
btrfs-convert <dev>

warning, device 1 is missing
Check tree block failed, want=2670592, have=0
read block failed check_tree_block
Couldn't read chunk root
Segmentation fault (core dumped)

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
btrfs-find-root.c
cmds-chunk.c
disk-io.c
disk-io.h

index 989535f..f63789d 100644 (file)
@@ -82,7 +82,7 @@ static struct btrfs_root *open_ctree_broken(int fd, const char *device)
                return NULL;
        }
 
-       ret = btrfs_scan_fs_devices(fd, device, &fs_devices);
+       ret = btrfs_scan_fs_devices(fd, device, &fs_devices, 0);
        if (ret)
                goto out;
 
index 03314de..6ada328 100644 (file)
@@ -1291,7 +1291,7 @@ static int recover_prepare(struct recover_control *rc, char *path)
                goto fail_free_sb;
        }
 
-       ret = btrfs_scan_fs_devices(fd, path, &fs_devices);
+       ret = btrfs_scan_fs_devices(fd, path, &fs_devices, 0);
        if (ret)
                goto fail_free_sb;
 
index 970f38a..a19b58a 100644 (file)
--- a/disk-io.c
+++ b/disk-io.c
@@ -909,13 +909,16 @@ void btrfs_cleanup_all_caches(struct btrfs_fs_info *fs_info)
 }
 
 int btrfs_scan_fs_devices(int fd, const char *path,
-                         struct btrfs_fs_devices **fs_devices)
+                         struct btrfs_fs_devices **fs_devices,
+                         u64 sb_bytenr)
 {
        u64 total_devs;
        int ret;
+       if (!sb_bytenr)
+               sb_bytenr = BTRFS_SUPER_INFO_OFFSET;
 
        ret = btrfs_scan_one_device(fd, path, fs_devices,
-                                   &total_devs, BTRFS_SUPER_INFO_OFFSET);
+                                   &total_devs, sb_bytenr);
        if (ret) {
                fprintf(stderr, "No valid Btrfs found on %s\n", path);
                return ret;
@@ -1001,7 +1004,7 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
        if (restore)
                fs_info->on_restoring = 1;
 
-       ret = btrfs_scan_fs_devices(fp, path, &fs_devices);
+       ret = btrfs_scan_fs_devices(fp, path, &fs_devices, sb_bytenr);
        if (ret)
                goto out;
 
index effaa9f..bc749c3 100644 (file)
--- a/disk-io.h
+++ b/disk-io.h
@@ -59,7 +59,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info,
 void btrfs_release_all_roots(struct btrfs_fs_info *fs_info);
 void btrfs_cleanup_all_caches(struct btrfs_fs_info *fs_info);
 int btrfs_scan_fs_devices(int fd, const char *path,
-                         struct btrfs_fs_devices **fs_devices);
+                         struct btrfs_fs_devices **fs_devices, u64 sb_bytenr);
 int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info);
 
 struct btrfs_root *open_ctree(const char *filename, u64 sb_bytenr, int writes);