bool stats_all = false;
bool stats_list = false;
static const char *stats_uuid = NULL;
+static const char *stats_dev_uuid = NULL;
static const char *stats_cache_num = NULL;
bool stats_five_min = false;
bool stats_hour = false;
static int set_cache(NihOption *option, const char *arg)
{
bdev = 0;
- cache_devices[nr_cache_devices] = (char *)malloc(sizeof(char *) *
- strlen(arg) + 1);
- strcpy(cache_devices[nr_cache_devices], arg);
+ cache_devices[nr_cache_devices] = strdup(arg);
if(!tier)
tier_mapping[nr_cache_devices] = 0;
- else
- tier_mapping[nr_cache_devices] = atoi(tier);
+ else {
+ int ntier = atoi(tier);
+ if(ntier == 0 || ntier == 1)
+ tier_mapping[nr_cache_devices] = ntier;
+ else
+ printf("Invalid tier\n");
+ }
devs++;
nr_cache_devices++;
+
+ return 0;
}
static int set_bdev(NihOption *option, const char *arg)
{
bdev = 1;
- if(label) {
- backing_dev_labels[nr_backing_devices] =
- (char *)malloc(sizeof(char *) * strlen(label) + 1);
- strcpy(backing_dev_labels[nr_backing_devices], label);
- }
+ if(label)
+ backing_dev_labels[nr_backing_devices] = strdup(label);
- backing_devices[nr_backing_devices] = (char *)malloc(sizeof(char *) *
- strlen(arg) + 1);
- strcpy(backing_devices[nr_backing_devices], arg);
+ backing_devices[nr_backing_devices] = strdup(arg);
nr_backing_devices++;
devs++;
NIH_OPTION_LAST
};
+static NihOption bcache_unregister_options[] = {
+ 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},
static NihOption stats_options[] = {
{'a', "all", N_("all"), NULL, NULL, &stats_all, NULL},
{'l', "list", N_("list"), NULL, NULL, &stats_list, NULL},
- {'u', "uuid", N_("cache_set UUID"), NULL, "UUID", &stats_uuid, NULL},
+ {'u', "set", N_("cache_set UUID"), NULL, "UUID", &stats_uuid, NULL},
+ {'d', "dev", N_("dev UUID"), NULL, "UUID", &stats_dev_uuid, NULL},
{'c', "cache", N_("cache number (starts from 0)"), NULL, "CACHE#", &stats_cache_num, NULL},
{0, "five-min-stats", N_("stats accumulated in last 5 minutes"), NULL, NULL, &stats_five_min, NULL},
{0, "hour-stats", N_("stats accumulated in last hour"), NULL, NULL, &stats_hour, NULL},
/* commands */
-int make_bcache (NihCommand *command, char *const *args)
+int make_bcache(NihCommand *command, char *const *args)
{
int cache_dev_fd[devs];
return 0;
}
-int probe_bcache (NihCommand *command, char *const *args)
+int probe_bcache(NihCommand *command, char *const *args)
{
int i;
+ char *err = NULL;
for (i = 0; args[i] != NULL; i++) {
- probe(args[i], udev);
+ err = probe(args[i], udev);
+ if(err) {
+ printf("probe_bcache error: %s\n", err);
+ return -1;
+ }
}
return 0;
}
-int bcache_register (NihCommand *command, char *const *args)
+int bcache_register(NihCommand *command, char *const *args)
{
- int ret = register_bcache(args);
+ char *err = NULL;
+
+ err = register_bcache(args);
+ if (err) {
+ printf("bcache_register error: %s\n", err);
+ return -1;
+ }
- return ret;
+ return 0;
}
-int bcache_list_cachesets (NihCommand *command, char *const *args)
+int bcache_unregister(NihCommand *command, char *const *args)
{
- return list_cachesets(cset_dir, list_devs);
+ char *err = NULL;
+
+ err = unregister_bcache(args);
+ if (err) {
+ printf("bcache_unregister error: %s\n", err);
+ return -1;
+ }
+
+ return 0;
}
-int bcache_query_devs (NihCommand *command, char *const *args)
+int bcache_list_cachesets(NihCommand *command, char *const *args)
+{
+ char *err = NULL;
+ err = list_cachesets(cset_dir, list_devs);
+ if (err) {
+ printf("bcache_list_cachesets error :%s\n", err);
+ return -1;
+ }
+
+ return 0;
+}
+
+int bcache_query_devs(NihCommand *command, char *const *args)
{
int i;
+ for (i = 0; args[i] != NULL; i++) {
+ char dev_uuid[40];
+ query_dev(args[i], force_csum, true, uuid_only, dev_uuid);
+ if(uuid_only)
+ printf("%s\n", dev_uuid);
+ }
- for (i = 0; args[i] != NULL; i++)
- query_dev(args[i], force_csum, true, uuid_only);
+ return 0;
}
-int bcache_status (NihCommand *command, char *const *args)
+int bcache_status(NihCommand *command, char *const *args)
{
int i;
struct cache_sb *sb_tier0 = NULL, *sb_tier1 = NULL;
char *dev0 = NULL, *dev1 = NULL;
for (i = 0; args[i] != NULL; i++) {
- struct cache_sb *sb = query_dev(args[i], false, false, false);
+ struct cache_sb *sb = query_dev(args[i], false, false, false, NULL);
struct cache_member *m = ((struct cache_member *) sb->d) +
sb->nr_this_dev;
long long unsigned cache_tier = CACHE_TIER(m);
- if (!cache_tier)
+ if (!cache_tier) {
if (!sb_tier0 || sb->seq > sb_tier0->seq) {
sb_tier0 = sb;
dev0 = args[i];
}
- else if (cache_tier == 1)
+ } else if (cache_tier == 1) {
if (!sb_tier1 || sb->seq > sb_tier1->seq) {
sb_tier1 = sb;
dev1 = args[i];
}
+ }
}
+
if (sb_tier0) sb_state(sb_tier0, dev0);
if (sb_tier1) sb_state(sb_tier1, dev1);
+
+ return 0;
}
-static void stats_subdir(char* stats_dir)
+static char *stats_subdir(char* stats_dir)
{
char tmp[50] = "/";
- if(stats_cache_num) {
+ char *err = NULL;
+ if(stats_dev_uuid) {
+ strcat(tmp, "cache");
+ err = find_matching_uuid(stats_dir, tmp, stats_dev_uuid);
+ if(err)
+ goto err;
+ } else if(stats_cache_num) {
strcat(tmp, "cache");
strcat(tmp, stats_cache_num);
} else if (stats_five_min)
else if (stats_total)
strcat(tmp, "stats_total");
else
- return;
+ return err;
strcat(stats_dir, tmp);
+
+err:
+ return err;
}
-int bcache_stats (NihCommand *command, char *const *args)
+int bcache_stats(NihCommand *command, char *const *args)
{
int i;
- char stats_dir[200];
+ char stats_dir[MAX_PATH];
DIR *dir = NULL;
struct dirent *ent = NULL;
+ char *err = NULL;
if (stats_uuid) {
- strcpy(stats_dir, cset_dir);
- strcat(stats_dir, "/");
- strcat(stats_dir, stats_uuid);
- stats_subdir(stats_dir);
+ snprintf(stats_dir, MAX_PATH, "%s/%s", cset_dir, stats_uuid);
+ err = stats_subdir(stats_dir);
+ if(err)
+ goto err;
+
dir = opendir(stats_dir);
if (!dir) {
- fprintf(stderr, "Failed to open dir %s\n", cset_dir);
- return 1;
+ err = "Failed to open dir";
+ goto err;
}
} else {
- printf("Must provide a cacheset uuid\n");
- exit(EXIT_FAILURE);
+ err = "Must provide a cacheset uuid";
+ goto err;
}
- if(stats_list || stats_all)
- while ((ent = readdir(dir)) != NULL)
- read_stat_dir(dir, stats_dir, ent->d_name, stats_all);
+ if(stats_list || stats_all) {
+ while ((ent = readdir(dir)) != NULL) {
+ err = read_stat_dir(dir, stats_dir, ent->d_name, stats_all);
+ if (err)
+ goto err;
+ }
+ }
- for (i = 0; args[i] != NULL; i++)
- read_stat_dir(dir, stats_dir, args[i], true);
+ for (i = 0; args[i] != NULL; i++) {
+ err = read_stat_dir(dir, stats_dir, args[i], true);
+ if (err)
+ goto err;
+ }
+
+ closedir(dir);
+ return 0;
+err:
closedir(dir);
+ printf("bcache_stats error: %s\n", err);
+ return -1;
}
static NihCommand commands[] = {
"Registers a list of devices",
N_("Registers a list of devices"),
NULL, bcache_register_options, bcache_register},
+ {"unregister", N_("unregister <list of devices>"),
+ "Unregisters a list of devices",
+ N_("Unregisters a list of devices"),
+ NULL, bcache_unregister_options, bcache_unregister},
{"list-cachesets", N_("list-cachesets"),
"Lists cachesets in /sys/fs/bcache",
N_("Lists cachesets in /sys/fs/bcache"),
exit (1);
nih_signal_reset();
+
+ return 0;
}