Add support for setting cache tier field

This commit is contained in:
Kent Overstreet 2014-03-20 13:46:04 -07:00
parent a1aa5961dc
commit 214dd0cb2d
2 changed files with 24 additions and 7 deletions

View File

@ -104,6 +104,9 @@ BITMASK(CACHE_REPLACEMENT, struct cache_sb, flags, 2, 3);
#define CACHE_REPLACEMENT_FIFO 1U #define CACHE_REPLACEMENT_FIFO 1U
#define CACHE_REPLACEMENT_RANDOM 2U #define CACHE_REPLACEMENT_RANDOM 2U
BITMASK(CACHE_TIER, struct cache_sb, flags, 2, 5);
#define CACHE_TIERS 4U
BITMASK(BDEV_CACHE_MODE, struct cache_sb, flags, 0, 4); BITMASK(BDEV_CACHE_MODE, struct cache_sb, flags, 0, 4);
#define CACHE_MODE_WRITETHROUGH 0U #define CACHE_MODE_WRITETHROUGH 0U
#define CACHE_MODE_WRITEBACK 1U #define CACHE_MODE_WRITEBACK 1U

View File

@ -169,9 +169,8 @@ const char * const cache_replacement_policies[] = {
static void write_sb(char *dev, unsigned block_size, unsigned bucket_size, static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
bool writeback, bool discard, bool wipe_bcache, bool writeback, bool discard, bool wipe_bcache,
unsigned cache_replacement_policy, unsigned cache_replacement_policy, uint64_t data_offset,
uint64_t data_offset, uuid_t set_uuid, unsigned tier, bool bdev,
uuid_t set_uuid, bool bdev,
uint16_t nr_in_set, uint16_t nr_this_dev) uint16_t nr_in_set, uint16_t nr_this_dev)
{ {
int fd; int fd;
@ -256,6 +255,7 @@ static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
SET_CACHE_DISCARD(&sb, discard); SET_CACHE_DISCARD(&sb, discard);
SET_CACHE_REPLACEMENT(&sb, cache_replacement_policy); SET_CACHE_REPLACEMENT(&sb, cache_replacement_policy);
SET_CACHE_TIER(&sb, tier);
printf("UUID: %s\n" printf("UUID: %s\n"
"Set UUID: %s\n" "Set UUID: %s\n"
@ -341,6 +341,8 @@ int main(int argc, char **argv)
{ {
int c, bdev = -1; int c, bdev = -1;
unsigned i, ncache_devices = 0, nbacking_devices = 0; unsigned i, ncache_devices = 0, nbacking_devices = 0;
unsigned long tier = 0;
unsigned cache_device_tier[argc];
char *cache_devices[argc]; char *cache_devices[argc];
char *backing_devices[argc]; char *backing_devices[argc];
@ -363,6 +365,7 @@ int main(int argc, char **argv)
{ "cache_replacement_policy", 1, NULL, 'p' }, { "cache_replacement_policy", 1, NULL, 'p' },
{ "data_offset", 1, NULL, 'o' }, { "data_offset", 1, NULL, 'o' },
{ "cset-uuid", 1, NULL, 'u' }, { "cset-uuid", 1, NULL, 'u' },
{ "tier", 1, NULL, 't' },
{ "help", 0, NULL, 'h' }, { "help", 0, NULL, 'h' },
{ NULL, 0, NULL, 0 }, { NULL, 0, NULL, 0 },
}; };
@ -409,6 +412,13 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
break; break;
case 't':
tier = strtoul(optarg, NULL, 10);
if (tier >= CACHE_TIERS) {
fprintf(stderr, "Invalid tier %lu\n", tier);
exit(EXIT_FAILURE);
}
break;
case 'h': case 'h':
usage(); usage();
break; break;
@ -418,10 +428,13 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (bdev) if (bdev) {
backing_devices[nbacking_devices++] = optarg; backing_devices[nbacking_devices++] = optarg;
else } else {
cache_device_tier[ncache_devices] = tier;
cache_devices[ncache_devices++] = optarg; cache_devices[ncache_devices++] = optarg;
}
break; break;
} }
@ -449,13 +462,14 @@ int main(int argc, char **argv)
write_sb(cache_devices[i], block_size, bucket_size, write_sb(cache_devices[i], block_size, bucket_size,
writeback, discard, wipe_bcache, writeback, discard, wipe_bcache,
cache_replacement_policy, data_offset, cache_replacement_policy, data_offset,
set_uuid, false, ncache_devices, i); set_uuid, cache_device_tier[i], false,
ncache_devices, i);
for (i = 0; i < nbacking_devices; i++) for (i = 0; i < nbacking_devices; i++)
write_sb(backing_devices[i], block_size, bucket_size, write_sb(backing_devices[i], block_size, bucket_size,
writeback, discard, wipe_bcache, writeback, discard, wipe_bcache,
cache_replacement_policy, data_offset, cache_replacement_policy, data_offset,
set_uuid, true, nbacking_devices, i); set_uuid, 0, true, nbacking_devices, i);
return 0; return 0;
} }