diff mbox

[v5,2/2] btrfs-progs: add feature to deregister all devices

Message ID 20171207145255.27686-2-anand.jain@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Anand Jain Dec. 7, 2017, 2:52 p.m. UTC
This patch adds default no option to deregister all unmounted
devices in the kernel at once. For example:
  btrfs device deregister

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
v1-4: NA.
v5: New patch in v5.

 cmds-device.c | 31 +++++++++++++++++++++++++++++--
 ioctl.h       |  6 +++++-
 2 files changed, 34 insertions(+), 3 deletions(-)
diff mbox

Patch

diff --git a/cmds-device.c b/cmds-device.c
index 8244ff9802be..6b9c3616b641 100644
--- a/cmds-device.c
+++ b/cmds-device.c
@@ -331,10 +331,30 @@  out:
 
 static const char * const cmd_device_deregister_usage[] = {
 	"btrfs device deregister [<device>]",
-	"Deregister device in btrfs kernel module.",
+	"Deregister one or all scanned device(s) in the kernel.",
 	NULL
 };
 
+static int btrfs_deregister_devices(void)
+{
+	struct btrfs_ioctl_vol_args args;
+	int fd;
+	int ret;
+
+	fd = open("/dev/btrfs-control", O_RDWR);
+	if (fd < 0)
+		return -errno;
+
+	memset(&args, 0, sizeof(args));
+	args.ioctl_flag = BTRFS_IOCTL_PURGE_ALL_DEVS;
+	ret = ioctl(fd, BTRFS_IOC_DEREGISTER_DEV, &args);
+	if (ret)
+		ret = -errno;
+	close(fd);
+	return ret;
+
+}
+
 static int btrfs_deregister_one_device(char *path)
 {
 	struct btrfs_ioctl_vol_args args;
@@ -359,9 +379,16 @@  static int cmd_device_deregister(int argc, char **argv)
 	char *path;
 	int ret = 0;
 
-	if (check_argc_exact(argc - optind, 1))
+	if (check_argc_max(argc - optind, 1))
 		usage(cmd_device_deregister_usage);
 
+	if (argc == 1) {
+		ret = btrfs_deregister_devices();
+		if (ret)
+			error("Can't deregister: %s", strerror(-ret));
+		return ret;
+	}
+
 	if (is_block_device(argv[1]) != 1) {
 		error("Not a block device: %s", argv[1]);
 		return -ENOENT;
diff --git a/ioctl.h b/ioctl.h
index 3cdb88eb5bb2..a36055b453e2 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -41,8 +41,12 @@  extern "C" {
 
 /* this should be 4k */
 #define BTRFS_PATH_NAME_MAX 4087
+#define BTRFS_IOCTL_PURGE_ALL_DEVS	(1ULL << 0)
 struct btrfs_ioctl_vol_args {
-	__s64 fd;
+	union {
+		__s64 fd;
+		__u64 ioctl_flag;
+	};
 	char name[BTRFS_PATH_NAME_MAX + 1];
 };
 BUILD_ASSERT(sizeof(struct btrfs_ioctl_vol_args) == 4096);