Re: [PATCH v13] btrfs: introduce feature to forget a btrfs device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





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.




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux