summaryrefslogtreecommitdiff
path: root/bcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'bcache.c')
-rw-r--r--bcache.c408
1 files changed, 10 insertions, 398 deletions
diff --git a/bcache.c b/bcache.c
index e2de70b9..cd2ea1ab 100644
--- a/bcache.c
+++ b/bcache.c
@@ -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;
}