@@ -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;
@@ -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);
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(-)