bcacheadm: add-devs and rm-dev options

Option to add multiple devices and remove single devices.

bcacheadm add-devs --set=uuid <list of devices>
bcacheadm rm-dev <dev>

Change-Id: I4f0a287c02dfad76d8263554e455c408191ea7ba
Signed-off-by: Jacob Malevich <jam@daterainc.com>
This commit is contained in:
Jacob Malevich 2014-11-25 18:36:05 -08:00
parent 7916b2eb3b
commit b375ed9755
3 changed files with 116 additions and 2 deletions

View File

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

View File

@ -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) \
({ \

View File

@ -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=# <list of devices>"),
"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 <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"),