path: root/super-recover.c
diff options
authorAnand Jain <>2014-10-15 08:46:14 +0800
committerDavid Sterba <>2014-10-16 12:02:00 +0200
commit38cfeef1033e254c0a1446fe6f4bbe6f30e1f5db (patch)
tree404b772310abf1360446aa4b431669e06f5756bb /super-recover.c
parent6345bbd5b4f41cd5f4bf090b9f17e6c9c9afcf62 (diff)
btrfs-progs: introduce a proper structure on which cli will call register-device ioctl
As of now commands mentioned below (with in [..]) are calling call register-device ioctl BTRFS_IOC_SCAN_DEV for all the devices in the system. Some issues with it: BTRFS_IOC_SCAN_DEV: ioctl is a write operation, we don't want command like btrfs-debug-tree threads to do that.. eg: ---- $ cat /proc/fs/btrfs/devlist | egrep fsid | wc -l 0 $ btrfs-debug-tree /dev/sde (num_device > 1) $ cat /proc/fs/btrfs/devlist | egrep fsid | wc -l 5 ---- btrfs_scan_fs_devices() ends up calling this ioctl only when num_device > 1. That's inconsistency with in feature/bug. We don't have to register _all_ the btrfs devices (again) in the system without user consent. Why its inconsistent: function btrfs_scan_fs_devices() calls btrfs_scan_lblkid only when num_devices is > 1, which in turn calls BTRFS_IOC_SCAN_DEV ioctl, if conditions are met. But main issue is we have too many consumers of btrfs_scan_fs_devices() the names below with in [] is the cli leading to this function. open_ctree_broken() [btrfs-find-root] recover_prepare() [btrfs rescue super-recover] __open_ctree_fd (updates always except when flag OPEN_CTREE_RECOVER_SUPER is set and flag OPEN_CTREE_RECOVER_SUPER is set only by 'btrfs rescue super- recover' but still this thread sneaks through the open_ctree function to call register-device-ioctl as show below). open_ctree_fs_info [btrfs-debug-tree] [btrfs-image -r] [btrfs check] open_fs [btrfs restore] open_ctree [calc-size] [btrfs-corrupt-block] [btrfs-image] (create) [btrfs-map-logical] [btrfs-select-super] [btrfstune] [btrfs-zero-log] [tester] [mkfs] [quick-test.c] [btrfs label set unmounted] [btrfs get label unmounted] [btrfs rescue super-recover] open_ctree_fd [btrfs-convert] Fix: In an effort to make register-device consistent, all calls to btrfs_scan_fs_devices() will have 5th parameter set to 0. that means we don't need 5th parameter at all. And with this function not calling the register ioctl at all, finally we will have following two cli to call the ioctl BTRFS_IOC_SCAN_DEV. btrfs dev scan and mkfs.btrfs Threads needing to update kernel about a device would have to use btrfs_register_one_device() separately. Signed-off-by: Anand Jain <> Signed-off-by: David Sterba <>
Diffstat (limited to 'super-recover.c')
1 files changed, 1 insertions, 1 deletions
diff --git a/super-recover.c b/super-recover.c
index 419b86ae..adb2c442 100644
--- a/super-recover.c
+++ b/super-recover.c
@@ -282,7 +282,7 @@ int btrfs_recover_superblocks(const char *dname,
- ret = btrfs_scan_fs_devices(fd, dname, &recover.fs_devices, 0, 0, 1);
+ ret = btrfs_scan_fs_devices(fd, dname, &recover.fs_devices, 0, 1);
if (ret) {
ret = 1;