From b375ed97558725d0a4ba43578d193bcfc3ba9c1e Mon Sep 17 00:00:00 2001 From: Jacob Malevich Date: Tue, 25 Nov 2014 18:36:05 -0800 Subject: [PATCH] bcacheadm: add-devs and rm-dev options Option to add multiple devices and remove single devices. bcacheadm add-devs --set=uuid bcacheadm rm-dev Change-Id: I4f0a287c02dfad76d8263554e455c408191ea7ba Signed-off-by: Jacob Malevich --- bcache.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ bcache.h | 9 +++++++-- bcacheadm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/bcache.c b/bcache.c index 7484f3d0..4cc6949b 100644 --- a/bcache.c +++ b/bcache.c @@ -879,6 +879,7 @@ struct cache_sb *query_dev(char *dev, bool force_csum, printf("Can't open dev %s: %s\n", dev, strerror(errno)); exit(2); } + printf("opened sb for %s\n", dev); if (pread(fd, sb, bytes, SB_START) != bytes) { fprintf(stderr, "Couldn't read\n"); @@ -1117,6 +1118,62 @@ err: return err; } +char *add_devices(char *const *devs, char *uuid) +{ + int ret, bcachefd; + char *err = NULL; + + bcachefd = open("/dev/bcache", O_RDWR); + if (bcachefd < 0) { + err = "Can't open bcache device"; + goto err; + } + + struct bch_ioctl_add_disks ia; + ia.devs = devs; + ia.uuid = uuid; + + ret = ioctl(bcachefd, BCH_IOCTL_ADD_DISKS, &ia); + if (ret < 0) { + char tmp[128]; + snprintf(tmp, 128, "ioctl add disk error: %s\n", + strerror(ret)); + err = strdup(tmp); + } + +err: + close(bcachefd); + return err; +} + +char *remove_device(const char *dev, bool force) +{ + int ret, bcachefd; + char *err = NULL; + + bcachefd = open("/dev/bcache", O_RDWR); + if (bcachefd < 0) { + err = "Can't open bcache device"; + goto err; + } + + struct bch_ioctl_rm_disk ir; + ir.dev = dev; + ir.force = force ? 1 : 0; + + ret = ioctl(bcachefd, BCH_IOCTL_RM_DISK, &ir); + if (ret < 0) { + char tmp[128]; + snprintf(tmp, 128, "ioctl add disk error: %s\n", + strerror(ret)); + err = strdup(tmp); + } + +err: + close(bcachefd); + return err; +} + char *probe(char *dev, int udev) { struct cache_sb sb; diff --git a/bcache.h b/bcache.h index 99307e64..c0315677 100644 --- a/bcache.h +++ b/bcache.h @@ -30,6 +30,11 @@ typedef __s64 s64; (void) (&_max1 == &_max2); \ _max1 > _max2 ? _max1 : _max2; }) +struct add_msg { + char *const *devs; + char *uuid; + int tier; +}; extern const char * const cache_state[]; extern const char * const replacement_policies[]; @@ -67,8 +72,8 @@ char *probe(char *, int); void sb_state(struct cache_sb *, char *); char *read_stat_dir(DIR *, char *, char *, bool); char *find_matching_uuid(char *, char *, const char*); -//int add_device(char *); -//int remove_device(char *); +char *add_devices(char *const *, char *); +char *remove_device(const char *, bool); #define csum_set(i, type) \ ({ \ diff --git a/bcacheadm.c b/bcacheadm.c index 11769d84..11b578fe 100644 --- a/bcacheadm.c +++ b/bcacheadm.c @@ -76,6 +76,11 @@ char *metadata_replicas = 0; char *data_replicas = 0; char *tier = 0; +/* add-dev globals */ +char *add_dev_uuid = NULL; + +/* rm-dev globals */ +bool force_remove = false; /* query-dev globals */ bool force_csum = false; @@ -203,6 +208,16 @@ static NihOption bcache_unregister_options[] = { NIH_OPTION_LAST }; +static NihOption bcache_add_device_options[] = { + {'u', "set", N_("cacheset uuid"), NULL, "UUID", &add_dev_uuid, NULL}, + NIH_OPTION_LAST +}; + +static NihOption bcache_rm_device_options[] = { + {'f', "force", N_("force cache removal"), NULL, NULL, &force_remove, NULL}, + NIH_OPTION_LAST +}; + static NihOption query_devs_options[] = { {'f', "force_csum", N_("force_csum"), NULL, NULL, &force_csum, NULL}, {'u', "uuid-only", N_("only print out the uuid for the devices, not the whole superblock"), NULL, NULL, &uuid_only, NULL}, @@ -384,6 +399,35 @@ int bcache_unregister(NihCommand *command, char *const *args) return 0; } +int bcache_add_devices(NihCommand *command, char *const *args) +{ + char *err; + + if (!add_dev_uuid) + printf("Must specify a cacheset uuid to add the disk to\n"); + + err = add_devices(args, add_dev_uuid); + if (err) { + printf("bcache_add_devices error: %s\n", err); + return -1; + } + + return 0; +} + +int bcache_rm_device(NihCommand *command, char *const *args) +{ + char *err; + + err = remove_device(args[0], force_remove); + if (err) { + printf("bcache_rm_devices error: %s\n", err); + return -1; + } + + return 0; +} + int bcache_list_cachesets(NihCommand *command, char *const *args) { char *err = NULL; @@ -536,6 +580,14 @@ static NihCommand commands[] = { "Unregisters a list of devices", N_("Unregisters a list of devices"), NULL, bcache_unregister_options, bcache_unregister}, + {"add-devs", N_("add-devs --set=UUID --tier=# "), + "Adds a list of devices to a cacheset", + N_("Adds a list of devices to a cacheset"), + NULL, bcache_add_device_options, bcache_add_devices}, + {"rm-dev", N_("rm-dev "), + "Removes a device from its cacheset", + N_("Removes a device from its cacheset"), + NULL, bcache_rm_device_options, bcache_rm_device}, {"list-cachesets", N_("list-cachesets"), "Lists cachesets in /sys/fs/bcache", N_("Lists cachesets in /sys/fs/bcache"),