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.j...@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 --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);
-- 
2.7.0

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to