]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - bcacheadm.c
bcacheadm fixes
[bcachefs-tools-debian] / bcacheadm.c
index 76ad0c6bda5b975a4fe62a96d5c2cb2ec4107245..11769d8499089fb1f2781245290fe56c009521b0 100644 (file)
@@ -95,6 +95,7 @@ bool status_all = false;
 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;
@@ -111,31 +112,31 @@ static int set_block_size(NihOption *option, const char *arg)
 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++;
@@ -198,6 +199,10 @@ static NihOption bcache_register_options[] = {
        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},
@@ -218,7 +223,8 @@ static NihOption status_options[] = {
 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},
@@ -233,7 +239,7 @@ static NihOption options[] = {
 
 
 /* commands */
-int make_bcache (NihCommand *command, char *const *args)
+int make_bcache(NihCommand *command, char *const *args)
 {
        int cache_dev_fd[devs];
 
@@ -336,69 +342,115 @@ int make_bcache (NihCommand *command, char *const *args)
        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)
@@ -410,42 +462,60 @@ static void stats_subdir(char* stats_dir)
        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[] = {
@@ -462,6 +532,10 @@ 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"),
@@ -496,4 +570,6 @@ int main(int argc, char *argv[])
                exit (1);
 
        nih_signal_reset();
+
+       return 0;
 }