summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--btrfs-find-root.c2
-rw-r--r--btrfs-image.c9
-rw-r--r--chunk-recover.c2
-rw-r--r--disk-io.c8
-rw-r--r--disk-io.h3
-rw-r--r--super-recover.c2
6 files changed, 16 insertions, 10 deletions
diff --git a/btrfs-find-root.c b/btrfs-find-root.c
index 3edb8332..c6e6b82f 100644
--- a/btrfs-find-root.c
+++ b/btrfs-find-root.c
@@ -79,7 +79,7 @@ static struct btrfs_root *open_ctree_broken(int fd, const char *device)
return NULL;
}
- ret = btrfs_scan_fs_devices(fd, device, &fs_devices, 0, 1);
+ ret = btrfs_scan_fs_devices(fd, device, &fs_devices, 0, 1, 0);
if (ret)
goto out;
diff --git a/btrfs-image.c b/btrfs-image.c
index 3c78388a..04ec4734 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -2557,16 +2557,19 @@ static int restore_metadump(const char *input, FILE *out, int old_restore,
ret = wait_for_worker(&mdrestore);
if (!ret && !multi_devices && !old_restore) {
+ struct btrfs_root *root;
struct stat st;
- info = open_ctree_fs_info(target, 0, 0,
+ root = open_ctree_fd(fileno(out), target, 0,
OPEN_CTREE_PARTIAL |
- OPEN_CTREE_WRITES);
- if (!info) {
+ OPEN_CTREE_WRITES |
+ OPEN_CTREE_NO_DEVICES);
+ if (!root) {
fprintf(stderr, "unable to open %s\n", target);
ret = -EIO;
goto out;
}
+ info = root->fs_info;
if (stat(target, &st)) {
fprintf(stderr, "statting %s failed\n", target);
diff --git a/chunk-recover.c b/chunk-recover.c
index 94efc438..832b3b1b 100644
--- a/chunk-recover.c
+++ b/chunk-recover.c
@@ -1520,7 +1520,7 @@ static int recover_prepare(struct recover_control *rc, char *path)
goto fail_free_sb;
}
- ret = btrfs_scan_fs_devices(fd, path, &fs_devices, 0, 1);
+ ret = btrfs_scan_fs_devices(fd, path, &fs_devices, 0, 1, 0);
if (ret)
goto fail_free_sb;
diff --git a/disk-io.c b/disk-io.c
index ca39f173..0aec56e0 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1006,7 +1006,8 @@ 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,
- u64 sb_bytenr, int super_recover)
+ u64 sb_bytenr, int super_recover,
+ int skip_devices)
{
u64 total_devs;
u64 dev_size;
@@ -1033,7 +1034,7 @@ int btrfs_scan_fs_devices(int fd, const char *path,
return ret;
}
- if (total_devs != 1) {
+ if (!skip_devices && total_devs != 1) {
ret = btrfs_scan_lblkid();
if (ret)
return ret;
@@ -1114,7 +1115,8 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
fs_info->on_restoring = 1;
ret = btrfs_scan_fs_devices(fp, path, &fs_devices, sb_bytenr,
- (flags & OPEN_CTREE_RECOVER_SUPER));
+ (flags & OPEN_CTREE_RECOVER_SUPER),
+ (flags & OPEN_CTREE_NO_DEVICES));
if (ret)
goto out;
diff --git a/disk-io.h b/disk-io.h
index f963a96a..53df8f06 100644
--- a/disk-io.h
+++ b/disk-io.h
@@ -33,6 +33,7 @@ enum btrfs_open_ctree_flags {
OPEN_CTREE_RESTORE = (1 << 4),
OPEN_CTREE_NO_BLOCK_GROUPS = (1 << 5),
OPEN_CTREE_EXCLUSIVE = (1 << 6),
+ OPEN_CTREE_NO_DEVICES = (1 << 7),
};
static inline u64 btrfs_sb_offset(int mirror)
@@ -68,7 +69,7 @@ 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, u64 sb_bytenr,
- int super_recover);
+ int super_recover, int skip_devices);
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,
diff --git a/super-recover.c b/super-recover.c
index 197fc4bd..e2c31294 100644
--- a/super-recover.c
+++ b/super-recover.c
@@ -279,7 +279,7 @@ int btrfs_recover_superblocks(const char *dname,
}
init_recover_superblock(&recover);
- ret = btrfs_scan_fs_devices(fd, dname, &recover.fs_devices, 0, 1);
+ ret = btrfs_scan_fs_devices(fd, dname, &recover.fs_devices, 0, 1, 0);
close(fd);
if (ret) {
ret = 1;