diff options
Diffstat (limited to 'bcacheadm.c')
-rw-r--r-- | bcacheadm.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/bcacheadm.c b/bcacheadm.c index 0e4a873..9229363 100644 --- a/bcacheadm.c +++ b/bcacheadm.c @@ -41,14 +41,16 @@ int bdev = -1; int devs = 0; char *cache_devices[MAX_DEVS]; int tier_mapping[MAX_DEVS]; +unsigned replacement_policy_mapping[MAX_DEVS]; char *backing_devices[MAX_DEVS]; char *backing_dev_labels[MAX_DEVS]; size_t i, nr_backing_devices = 0, nr_cache_devices = 0; unsigned block_size = 0; unsigned bucket_sizes[MAX_DEVS]; int num_bucket_sizes = 0; -int writeback = 0, discard = 0, wipe_bcache = 0; -unsigned replication_set = 0, replacement_policy = 0; +int writeback = 0, writearound = 0, discard = 0, wipe_bcache = 0; +unsigned replication_set = 0; +char *replacement_policy = 0; uint64_t data_offset = BDEV_DATA_START_DEFAULT; char *label = NULL; struct cache_sb *cache_set_sb = NULL; @@ -117,7 +119,26 @@ static int set_cache(NihOption *option, const char *arg) if(ntier == 0 || ntier == 1) tier_mapping[nr_cache_devices] = ntier; else - printf("Invalid tier\n"); + printf("Invalid tier %s\n", tier); + } + + if (!replacement_policy) + replacement_policy_mapping[nr_cache_devices] = 0; + else { + int i = 0; + + while (replacement_policies[i] != NULL) { + if (!strcmp(replacement_policy, + replacement_policies[i])) { + replacement_policy_mapping[nr_cache_devices] = i; + break; + } + i++; + } + + if (replacement_policies[i] == NULL) + printf("Invalid replacement policy: %s\n", + replacement_policy); } devs++; @@ -183,6 +204,7 @@ static NihOption make_bcache_options[] = { {0, "wipe-bcache", N_("destroy existing bcache data if present"), NULL, NULL, &wipe_bcache, NULL}, {0, "discard", N_("enable discards"), NULL, NULL, &discard, NULL}, {0, "writeback", N_("enable writeback"), NULL, NULL, &writeback, NULL}, + {0, "writearound", N_("enable writearound"), NULL, NULL, &writearound, NULL}, NIH_OPTION_LAST }; @@ -270,6 +292,8 @@ int make_bcache(NihCommand *command, char *const *args) int backing_dev_fd[devs]; + unsigned cache_mode; + cache_set_sb = calloc(1, sizeof(*cache_set_sb) + sizeof(struct cache_member) * devs); @@ -322,7 +346,7 @@ int make_bcache(NihCommand *command, char *const *args) next_cache_device(cache_set_sb, replication_set, tier_mapping[i], - replacement_policy, + replacement_policy_mapping[i], discard); if (!cache_set_sb->nr_in_set && !nr_backing_devices) { @@ -359,10 +383,17 @@ int make_bcache(NihCommand *command, char *const *args) write_cache_sbs(cache_dev_fd, cache_set_sb, block_size, bucket_sizes, num_bucket_sizes); + if (writeback) + cache_mode = CACHE_MODE_WRITEBACK; + else if (writearound) + cache_mode = CACHE_MODE_WRITEAROUND; + else + cache_mode = CACHE_MODE_WRITETHROUGH; + for (i = 0; i < nr_backing_devices; i++) write_backingdev_sb(backing_dev_fd[i], block_size, bucket_sizes, - writeback, data_offset, + cache_mode, data_offset, backing_dev_labels[i], cache_set_sb->set_uuid); |