On 01/03/2019 11:24 PM, David Sterba wrote:
On Thu, Jan 03, 2019 at 04:01:37PM +0800, Anand Jain wrote:Support for a new command 'btrfs dev forget [dev]' is proposed here to undo the effects of 'btrfs dev scan [dev]'. For this purpose this patch proposes to use ioctl #5 as it was empty. IOW(BTRFS_IOCTL_MAGIC, 5, ..) This patch adds new ioctl BTRFS_IOC_FORGET_DEV which can be sent from the /dev/btrfs-control to forget one or all devices, (devices which are not mounted) from the btrfs kernel. The argument it takes is struct btrfs_ioctl_vol_args, and ::name can be set to specify the device path. And all unmounted devices can be removed from the kernel if no device path is provided. Again, the devices are removed only if the relevant fsid aren't mounted. This new cli can provide.. . Release of unwanted btrfs_fs_devices and btrfs_devices memory if the device is not going to be mounted. . Ability to mount the device in degraded mode when one of the other device is corrupted like in split brain raid1. . Running test cases which requires btrfs.ko-reload if the rootfs is btrfs. Signed-off-by: Anand Jain <anand.jain@xxxxxxxxxx> Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx> --- v12->v13: btrfs.ko returns error on failing to find the given device. For no argument (btrfs device scan --forget) if there is no device to forget then it shall just return success. v11->v12: fix coding style add spacing before after ":". v1->v11: Pls ref to the cover-letter. (sorry about that). fs/btrfs/super.c | 3 +++ fs/btrfs/volumes.c | 55 +++++++++++++++++++++++++++++++++++----------- fs/btrfs/volumes.h | 1 + include/uapi/linux/btrfs.h | 2 ++ 4 files changed, 48 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 33cc9aba9c94..a4e8beec0fc5 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -2247,6 +2247,9 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, ret = PTR_ERR_OR_ZERO(device); mutex_unlock(&uuid_mutex); break; + case BTRFS_IOC_FORGET_DEV: + ret = btrfs_forget_devices(vol->name); + break; case BTRFS_IOC_DEVICES_READY: mutex_lock(&uuid_mutex); device = btrfs_scan_one_device(vol->name, FMODE_READ, diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 2576b1a379c9..2ab42bfe5d3c 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -734,6 +734,19 @@ static void pending_bios_fn(struct btrfs_work *work) run_scheduled_bios(device); }+static bool device_path_matched(const char *path, struct btrfs_device *device)+{ + int found; + + rcu_read_lock(); + found = strcmp(rcu_str_deref(device->name), path); + rcu_read_unlock(); + + if (!found) + return true; + return false; +} + /* * Search and remove all stale (devices which are not mounted) devices. * When both inputs are NULL, it will search and release all stale devices. @@ -742,44 +755,47 @@ static void pending_bios_fn(struct btrfs_work *work) * skip_dev: Optional. Will skip this device when searching for the stale * devices. */ -static void btrfs_free_stale_devices(const char *path, +static int btrfs_free_stale_devices(const char *path, struct btrfs_device *skip_device) { struct btrfs_fs_devices *fs_devices, *tmp_fs_devices; struct btrfs_device *device, *tmp_device; + int ret; + + if (path) + ret = -ENXIO; + else + ret = 0;Can you please split this change to another patch? It's a preparatory work for the new ioctl. The return value meaning should be also documented in the function comment.
Pls find v14. I have also use -ENOENT instead of -ENXIO and documented the return value in the function header.
