diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2015-05-08 18:13:38 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2015-05-10 21:36:46 -0700 |
commit | fb22ceda3e061ea38ce78d95371ad7ceaca90c3c (patch) | |
tree | 6840c9545f6670650c64c7413220fd4f6709ab21 /bcache.c | |
parent | da1fff87001af2eadc3b2f3ccc81f3f8190b00e2 (diff) |
rewrite
Diffstat (limited to 'bcache.c')
-rw-r--r-- | bcache.c | 408 |
1 files changed, 10 insertions, 398 deletions
@@ -852,55 +852,6 @@ char *dev_name(const char *ugly_path) { return strdup(buf); } -static void list_cacheset_devs(char *cset_dir, char *cset_name, bool parse_dev_name) -{ - DIR *cachedir, *dir; - struct stat cache_stat; - char entry[MAX_PATH]; - struct dirent *ent; - snprintf(entry, MAX_PATH, "%s/%s", cset_dir, cset_name); - - if((dir = opendir(entry)) != NULL) { - while((ent = readdir(dir)) != NULL) { - char buf[MAX_PATH]; - int len; - char *tmp; - - /* - * We are looking for all cache# directories - * do a strlen < 9 to skip over other entries - * that also start with "cache" - */ - if(strncmp(ent->d_name, "cache", 5) || - !(strlen(ent->d_name) < 9)) - continue; - - snprintf(entry, MAX_PATH, "%s/%s/%s", - cset_dir, - cset_name, - ent->d_name); - - if((cachedir = opendir(entry)) == NULL) - continue; - - if(stat(entry, &cache_stat)) - continue; - - if((len = readlink(entry, buf, sizeof(buf) - 1)) != - -1) { - buf[len] = '\0'; - if(parse_dev_name) { - tmp = dev_name(buf); - printf("/dev%s\n", tmp); - free(tmp); - } else { - printf("\t%s\n", buf); - } - } - } - } -} - char *find_matching_uuid(char *stats_dir, char *subdir, const char *stats_dev_uuid) { /* Do a query-dev --uuid only to get the uuid @@ -973,360 +924,21 @@ char *find_matching_uuid(char *stats_dir, char *subdir, const char *stats_dev_uu return err; } -char *list_cachesets(char *cset_dir, bool list_devs) -{ - struct dirent *ent; - DIR *dir; - char *err = NULL; - - dir = opendir(cset_dir); - if (!dir) { - err = "Failed to open cacheset dir"; - goto err; - } - - while ((ent = readdir(dir)) != NULL) { - struct stat statbuf; - char entry[MAX_PATH]; - - if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) - continue; - - snprintf(entry, MAX_PATH, "%s/%s", cset_dir, ent->d_name); - if(stat(entry, &statbuf) == -1) { - err = "Failed to stat cacheset subdir"; - goto err; - } - - if (S_ISDIR(statbuf.st_mode)) { - printf("%s\n", ent->d_name); - - if(list_devs) { - list_cacheset_devs(cset_dir, ent->d_name, true); - } - } - } - -err: - closedir(dir); - return err; -} - -char *register_bcache(char *const *devs) -{ - int ret, bcachefd; - char *err = NULL; - - bcachefd = open("/dev/bcache", O_RDWR); - if (bcachefd < 0) { - err = "Can't open bcache device"; - goto err; - } - - ret = ioctl(bcachefd, BCH_IOCTL_REGISTER, devs); - if (ret < 0) { - char tmp[64]; - snprintf(tmp, 64, "ioctl register error: %s\n", - strerror(ret)); - err = strdup(tmp); - goto err; - } - -err: - if (bcachefd) - close(bcachefd); - return err; -} - -char *unregister_bcache(char *const *devs) -{ - int ret, bcachefd; - char *err = NULL; - - bcachefd = open("/dev/bcache_extent0", O_RDWR); - if (bcachefd < 0) { - err = "Can't open bcache device"; - goto err; - } - - ret = ioctl(bcachefd, BCH_IOCTL_STOP); - if (ret < 0) { - char tmp[64]; - snprintf(tmp, 64, "ioctl unregister error: %s\n", - strerror(ret)); - err = strdup(tmp); - goto err; - } - -err: - close(bcachefd); - return err; -} - -char *add_devices(char *const *devs) -{ - int ret, bcachefd; - char *err = NULL; - - bcachefd = open("/dev/bcache_extent0", O_RDWR); - if (bcachefd < 0) { - err = "Can't open bcache device"; - goto err; - } - - struct bch_ioctl_add_disks ia; - ia.devs = devs; - - 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_extent0", 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 *device_set_failed(const char *dev_uuid) { - int ret, bcachefd; - char *err = NULL; - uuid_le dev; - struct bch_ioctl_disk_failed df; - - bcachefd = open("/dev/bcache_extent0", O_RDWR); - if (bcachefd < 0) { - err = "Can't open bcache device"; - goto err; - } - - uuid_parse(dev_uuid, dev.b); - df.dev_uuid = dev; - - ret = ioctl(bcachefd, BCH_IOCTL_SET_DISK_FAILED, &df); - if (ret < 0) { - char tmp[128]; - snprintf(tmp, 128, "ioctl set disk failed error %s\n", - strerror(ret)); - err = strdup(tmp); - } - -err: - close(bcachefd); - return err; -} - -char *probe(char *dev, int udev) +int bcachectl_open(void) { - struct cache_sb sb; - char uuid[40]; - blkid_probe pr; - char *err = NULL; - - int fd = open(dev, O_RDONLY); - if (fd == -1) { - err = "Got file descriptor -1 trying to open dev"; - goto err; - } - - if (!(pr = blkid_new_probe())) { - err = "Failed trying to get a blkid for new probe"; - goto err; - } - - if (blkid_probe_set_device(pr, fd, 0, 0)) { - err = "Failed blkid probe set device"; - goto err; - } - - /* probe partitions too */ - if (blkid_probe_enable_partitions(pr, true)) { - err = "Enable probe partitions"; - goto err; - } - - /* bail if anything was found - * probe-bcache isn't needed once blkid recognizes bcache */ - if (!blkid_do_probe(pr)) { - err = "blkid recognizes bcache"; - goto err; - } + int fd = open("/dev/bcache-ctl", O_RDWR); + if (fd < 0) + die("Can't open bcache device: %s", strerror(errno)); - if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb)) { - err = "Failed to read superblock"; - goto err; - } - - if (memcmp(&sb.magic, &BCACHE_MAGIC, sizeof(sb.magic))) { - err = "Bcache magic incorrect"; - goto err; - } - - uuid_unparse(sb.disk_uuid.b, uuid); - - if (udev) - printf("ID_FS_UUID=%s\n" - "ID_FS_UUID_ENC=%s\n" - "ID_FS_TYPE=bcache\n", - uuid, uuid); - else - printf("%s: UUID=\"\" TYPE=\"bcache\"\n", uuid); - - return 0; - -err: - return err; -} - -char *read_stat_dir(DIR *dir, char *stats_dir, char *stat_name, char *ret) -{ - struct stat statbuf; - char entry[MAX_PATH]; - char *err = NULL; - - snprintf(entry, MAX_PATH, "%s/%s", stats_dir, stat_name); - if(stat(entry, &statbuf) == -1) { - char tmp[MAX_PATH]; - snprintf(tmp, MAX_PATH, "Failed to stat %s\n", entry); - err = strdup(tmp); - goto err; - } - - if (S_ISREG(statbuf.st_mode)) { - FILE *fp = NULL; - - fp = fopen(entry, "r"); - if(!fp) { - /* If we can't open the file, this is probably because - * of permissions, just move to the next file */ - return NULL; - } - - while(fgets(ret, MAX_PATH, fp)); - fclose(fp); - } -err: - return err; + return fd; } -char *bcache_get_capacity(const char *cset_dir, const char *capacity_uuid, - bool show_devs) +unsigned nr_args(char *const *args) { - char *err = NULL; - char bucket_size_path[MAX_PATH]; - char nbuckets_path[MAX_PATH]; - char avail_buckets_path[MAX_PATH]; - char cache_path[MAX_PATH]; - - double bucket_sizes[MAX_DEVS]; - double nbuckets[MAX_DEVS]; - double avail_buckets[MAX_DEVS]; - char *dev_names[MAX_DEVS]; - int dev_count = 0, i; - double total_cap = 0, total_free = 0; - int precision = 2; - - - while (true) { - char buf[MAX_PATH]; - int len; - DIR *cache_dir; - - snprintf(bucket_size_path, sizeof(bucket_size_path), "%s/%s/%s%d/%s", cset_dir, - capacity_uuid, "cache", dev_count, "bucket_size_bytes"); - snprintf(nbuckets_path, sizeof(nbuckets_path), "%s/%s/%s%d/%s", cset_dir, - capacity_uuid, "cache", dev_count, "nbuckets"); - snprintf(avail_buckets_path, sizeof(avail_buckets_path), "%s/%s/%s%d/%s", cset_dir, - capacity_uuid, "cache", dev_count, "available_buckets"); - snprintf(cache_path, sizeof(cache_path), "%s/%s/%s%d", cset_dir, capacity_uuid, - "cache", dev_count); - - if((cache_dir = opendir(cache_path)) == NULL) - break; - - err = read_stat_dir(cache_dir, cache_path, - "bucket_size_bytes", buf); - if (err) - goto err; - else - bucket_sizes[dev_count] = atof(buf); + unsigned i; - err = read_stat_dir(cache_dir, cache_path, - "nbuckets", buf); - if (err) - goto err; - else - nbuckets[dev_count] = atof(buf); - - err = read_stat_dir(cache_dir, cache_path, - "available_buckets", buf); - if (err) - goto err; - else - avail_buckets[dev_count] = atof(buf); - - if((len = readlink(cache_path, buf, sizeof(buf) - 1)) != -1) { - buf[len] = '\0'; - dev_names[dev_count] = dev_name(buf); - } - - dev_count++; - } - - printf("%-15s%-25s%-25s\n", "Device Name", "Capacity (512 Blocks)", "Free (512 Blocks)"); + for (i = 0; args[i]; i++) + ; - if (show_devs) { - for (i = 0; i < dev_count; i++) { - printf("%s%-11s%-25.*f%-25.*f\n", "/dev", dev_names[i], - precision, - (bucket_sizes[i] * nbuckets[i]) / 512, - precision, - (bucket_sizes[i] * avail_buckets[i]) / 512); - } - } - - for (i = 0; i < dev_count; i++) { - total_cap += (bucket_sizes[i] * nbuckets[i]) / 512; - total_free += (bucket_sizes[i] * avail_buckets[i]) / 512; - - } - - printf("%-15s%-25.*f%-25.*f\n", "Total", precision, total_cap, - precision, total_free); - -err: - for (i = 0; i < dev_count; i++) - if (dev_names[i]) - free(dev_names[i]); - return err; + return i; } |