btrfs-progs: restore passing of super_bytenr to device scan
PATCH 1/1 btrfs-progs: restore passing of super_bytenr to device scan
Commit 615f2867 (Btrfs-progs: cleanup similar code in open_ctree_* and close_ctree) introduced a regression in btrfs-convert.
open_ctree takes a sb_bytenr argument to specify where to find the superblock. Under normal conditions, this will be at BTRFS_SUPER_INFO_OFFSET, and that commit assumed as much under all conditions.
make_btrfs allows the caller to specify which blocks to use for certain blocks (including the superblock) and this is used by btrfs-convert to avoid overwriting the source file system's superblock until the conversion is complete.
When btrfs-convert goes to open the newly initialized file system, it fails with: "No valid btrfs found" since its superblock wasn't written to the normal location.
This patch restores the passing down of super_bytesnr to btrfs_scan_one_device.
--- btrfs-find-root.c | 2 +- cmds-chunk.c | 2 +- disk-io.c | 10 +++++++--- disk-io.h | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-)
btrfs-find-root.c +1 -1
@@ -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;
cmds-chunk.c +1 -1
@@ -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;
disk-io.c +7 -3
@@ -909,13 +909,17 @@ 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 super_bytenr) {u64 total_devs;int ret; +if (super_bytenr ==0 ) + super_bytenr =BTRFS_SUPER_INFO_OFFSET ; + ret =btrfs_scan_one_device (fd, path, fs_devices, - &total_devs,BTRFS_SUPER_INFO_OFFSET ); + &total_devs, super_bytenr);if (ret) {fprintf (stderr,"No valid Btrfs found on %s\n" , path);return ret;
@@ -1001,7 +1005,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;
disk-io.h +2 -1
@@ -59,7 +59,8 @@ 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 super_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);
Signature · 1 line
1.8.1.4
add to the list
Quoted 118 lines
Helo,
I have sent a patch for this before:
https://patchwork.kernel.org/patch/2828820/
Thanks,
WangQuoted 108 lines
Commit
615f2867(Btrfs-progs: cleanup similar code in open_ctree_* andclose_ctree) introduced a regression in btrfs-convert.
open_ctreetakes asb_bytenrargument to specify where to find the superblock. Under normal conditions, this will be atBTRFS_SUPER_INFO_OFFSET, and that commit assumed as much under all conditions.
make_btrfsallows the caller to specify which blocks to use for certain blocks (including the superblock) and this is used by btrfs-convert to avoid overwriting the source file system's superblock until the conversion is complete.When btrfs-convert goes to open the newly initialized file system, it fails with: "No valid btrfs found" since its superblock wasn't written to the normal location.
This patch restores the passing down of
super_bytesnrtobtrfs_scan_one_device.Signed-off-by Jeff Mahoney <[email protected]>---
btrfs-find-root.c | 2 +- cmds-chunk.c | 2 +- disk-io.c | 10 +++++++--- disk-io.h | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-)btrfs-find-root.c +1
-1@@ -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;cmds-chunk.c +1
-1@@ -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;disk-io.c +7
-3@@ -909,13 +909,17 @@ 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 super_bytenr) {u64 total_devs;int ret; +if (super_bytenr ==0 ) + super_bytenr =BTRFS_SUPER_INFO_OFFSET ; + ret =btrfs_scan_one_device (fd, path, fs_devices, - &total_devs,BTRFS_SUPER_INFO_OFFSET ); + &total_devs, super_bytenr);if (ret) {fprintf (stderr,"No valid Btrfs found on %s\n" , path);return ret;@@ -1001,7 +1005,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;disk-io.h +2
-1@@ -59,7 +59,8 @@ 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 super_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);Signature · 7 lines
1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi,
Quoted 2 lines · Jeff Mahoney
Commit
615f2867(Btrfs-progs: cleanup similar code in open_ctree_* andclose_ctree) introduced a regression in btrfs-convert.
Wang has fixed this problem.
[PATCH] Btrfs-progs: fix wrong arg sb_bytenr for btrfs_scan_fs_devices()
Thanks
Miao
Quoted 98 lines
open_ctreetakes asb_bytenrargument to specify where to find the superblock. Under normal conditions, this will be atBTRFS_SUPER_INFO_OFFSET, and that commit assumed as much under all conditions.
make_btrfsallows the caller to specify which blocks to use for certain blocks (including the superblock) and this is used by btrfs-convert to avoid overwriting the source file system's superblock until the conversion is complete.When btrfs-convert goes to open the newly initialized file system, it fails with: "No valid btrfs found" since its superblock wasn't written to the normal location.
This patch restores the passing down of
super_bytesnrtobtrfs_scan_one_device.Signed-off-by Jeff Mahoney <[email protected]>--- btrfs-find-root.c | 2 +- cmds-chunk.c | 2 +- disk-io.c | 10 +++++++--- disk-io.h | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-)btrfs-find-root.c +1
-1@@ -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;cmds-chunk.c +1
-1@@ -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;disk-io.c +7
-3@@ -909,13 +909,17 @@ 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 super_bytenr) {u64 total_devs;int ret; +if (super_bytenr ==0 ) + super_bytenr =BTRFS_SUPER_INFO_OFFSET ; + ret =btrfs_scan_one_device (fd, path, fs_devices, - &total_devs,BTRFS_SUPER_INFO_OFFSET ); + &total_devs, super_bytenr);if (ret) {fprintf (stderr,"No valid Btrfs found on %s\n" , path);return ret;@@ -1001,7 +1005,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;disk-io.h +2
-1@@ -59,7 +59,8 @@ 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 super_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);