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