summaryrefslogtreecommitdiff
path: root/make-bcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'make-bcache.c')
-rw-r--r--make-bcache.c259
1 files changed, 0 insertions, 259 deletions
diff --git a/make-bcache.c b/make-bcache.c
deleted file mode 100644
index 8a94461..0000000
--- a/make-bcache.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Author: Kent Overstreet <kmo@daterainc.com>
- *
- * GPLv2
- */
-
-#define _FILE_OFFSET_BITS 64
-#define __USE_FILE_OFFSET 64
-#define _XOPEN_SOURCE 600
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <limits.h>
-#include <linux/fs.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <uuid/uuid.h>
-
-#include "bcache.h"
-
-void usage()
-{
- fprintf(stderr,
- "Usage: make-bcache [options] device\n"
- " -C, --cache Format a cache device\n"
- " -B, --bdev Format a backing device\n"
- " --wipe-bcache destroy existing bcache data if present\n"
- " -l, --label label\n"
- " --cset-uuid UUID for the cache set\n"
- " --csum-type One of (none|crc32c|crc64)\n"
-
- " -b, --bucket bucket size\n"
- " -w, --block block size (hard sector size of SSD, often 2k)\n"
-
- " --replication-set replication set of subsequent devices\n"
- " --meta-replicas number of metadata replicas\n"
- " --data-replicas number of data replicas\n"
- " --tier tier of subsequent devices\n"
- " --cache_replacement_policy one of (lru|fifo|random)\n"
- " --discard enable discards\n"
-
- " --writeback enable writeback\n"
- " -o, --data-offset data offset in sectors\n"
- " -h, --help display this help and exit\n");
- exit(EXIT_FAILURE);
-}
-
-int main(int argc, char **argv)
-{
- int c, bdev = -1;
- size_t i, nr_backing_devices = 0;
-
- unsigned block_size = 0;
- unsigned bucket_sizes[argc];
- int num_bucket_sizes = 0;
- int writeback = 0, discard = 0, wipe_bcache = 0;
- unsigned replication_set = 0, tier = 0, replacement_policy = 0;
- uint64_t data_offset = BDEV_DATA_START_DEFAULT;
- char *label = NULL;
-
- const char *cache_devices[argc];
- int cache_dev_fd[argc];
-
- const char *backing_devices[argc];
- int backing_dev_fd[argc];
- const char *backing_dev_labels[argc];
-
- enum long_opts {
- CACHE_SET_UUID = 256,
- CSUM_TYPE,
- REPLICATION_SET,
- META_REPLICAS,
- DATA_REPLICAS,
- };
-
- const struct option opts[] = {
- { "cache", 0, NULL, 'C' },
- { "bdev", 0, NULL, 'B' },
- { "wipe-bcache", 0, &wipe_bcache, 1 },
- { "label", 1, NULL, 'l' },
- { "cset-uuid", 1, NULL, CACHE_SET_UUID },
- { "csum-type", 1, NULL, CSUM_TYPE },
-
- { "bucket", 1, NULL, 'b' },
- { "block", 1, NULL, 'w' },
-
- { "replication-set", 1, NULL, REPLICATION_SET },
- { "meta-replicas", 1, NULL, META_REPLICAS},
- { "data-replicas", 1, NULL, DATA_REPLICAS },
- { "tier", 1, NULL, 't' },
- { "cache_replacement_policy", 1, NULL, 'p' },
- { "discard", 0, &discard, 1 },
-
- { "writeback", 0, &writeback, 1 },
- { "data_offset", 1, NULL, 'o' },
-
- { "help", 0, NULL, 'h' },
- { NULL, 0, NULL, 0 },
- };
-
- struct cache_sb *cache_set_sb = calloc(1, sizeof(*cache_set_sb) +
- sizeof(struct cache_member) * argc);
-
- uuid_generate(cache_set_sb->set_uuid.b);
- SET_CACHE_PREFERRED_CSUM_TYPE(cache_set_sb, BCH_CSUM_CRC32C);
- SET_CACHE_SET_META_REPLICAS_WANT(cache_set_sb, 1);
- SET_CACHE_SET_DATA_REPLICAS_WANT(cache_set_sb, 1);
- bucket_sizes[0] = 1024;
-
- while ((c = getopt_long(argc, argv,
- "-hCBU:w:b:l:",
- opts, NULL)) != -1) {
-
- switch (c) {
- case 'C':
- bdev = 0;
- break;
- case 'B':
- bdev = 1;
- break;
- case 'l':
- label = optarg;
- memcpy(cache_set_sb->label, label,
- sizeof(cache_set_sb->label));
- break;
- case CACHE_SET_UUID:
- if (uuid_parse(optarg, cache_set_sb->set_uuid.b)) {
- fprintf(stderr, "Bad uuid\n");
- exit(EXIT_FAILURE);
- }
- break;
- case CSUM_TYPE:
- SET_CACHE_PREFERRED_CSUM_TYPE(cache_set_sb,
- read_string_list_or_die(optarg, csum_types,
- "csum type"));
- break;
-
- case 'b':
- bucket_sizes[num_bucket_sizes] = hatoi_validate(optarg, "bucket size");
- num_bucket_sizes++;
- break;
- case 'w':
- block_size = hatoi_validate(optarg, "block size");
- break;
-
- case REPLICATION_SET:
- replication_set = strtoul_or_die(optarg,
- CACHE_REPLICATION_SET_MAX,
- "replication set");
- break;
- case META_REPLICAS:
- SET_CACHE_SET_META_REPLICAS_WANT(cache_set_sb,
- strtoul_or_die(optarg,
- CACHE_SET_META_REPLICAS_WANT_MAX,
- "meta replicas"));
- break;
- case DATA_REPLICAS:
- SET_CACHE_SET_DATA_REPLICAS_WANT(cache_set_sb,
- strtoul_or_die(optarg,
- CACHE_SET_DATA_REPLICAS_WANT_MAX,
- "data replicas"));
- break;
- case 't':
- tier = strtoul_or_die(optarg, CACHE_TIERS, "tier");
- break;
- case 'p':
- replacement_policy = read_string_list_or_die(optarg,
- replacement_policies,
- "cache replacement policy");
- break;
-
- case 'o':
- data_offset = atoll(optarg);
- if (data_offset < BDEV_DATA_START_DEFAULT) {
- fprintf(stderr, "Bad data offset; minimum %d sectors\n",
- BDEV_DATA_START_DEFAULT);
- exit(EXIT_FAILURE);
- }
- break;
- case 'h':
- usage();
- break;
- case 1:
- if (bdev == -1) {
- fprintf(stderr, "Please specify -C or -B\n");
- exit(EXIT_FAILURE);
- }
-
- if (bdev) {
- backing_dev_labels[nr_backing_devices] = label;
- backing_devices[nr_backing_devices++] = optarg;
- } else {
- cache_devices[cache_set_sb->nr_in_set] = optarg;
- next_cache_device(cache_set_sb,
- replication_set,
- tier,
- replacement_policy,
- discard);
- }
-
- break;
- }
- }
-
- if (!cache_set_sb->nr_in_set && !nr_backing_devices) {
- fprintf(stderr, "Please supply a device\n");
- usage();
- }
-
- i = 0;
- do {
- if (bucket_sizes[i] < block_size) {
- fprintf(stderr, "Bucket size cannot be smaller than block size\n");
- exit(EXIT_FAILURE);
- }
- i++;
- } while (i < num_bucket_sizes);
-
- if (!block_size) {
- for (i = 0; i < cache_set_sb->nr_in_set; i++)
- block_size = max(block_size,
- get_blocksize(cache_devices[i]));
-
- for (i = 0; i < nr_backing_devices; i++)
- block_size = max(block_size,
- get_blocksize(backing_devices[i]));
- }
-
- for (i = 0; i < cache_set_sb->nr_in_set; i++)
- cache_dev_fd[i] = dev_open(cache_devices[i], wipe_bcache);
-
- for (i = 0; i < nr_backing_devices; i++)
- backing_dev_fd[i] = dev_open(backing_devices[i], wipe_bcache);
-
- write_cache_sbs(cache_dev_fd, cache_set_sb, block_size,
- bucket_sizes, num_bucket_sizes);
-
- for (i = 0; i < nr_backing_devices; i++)
- write_backingdev_sb(backing_dev_fd[i],
- block_size, bucket_sizes,
- writeback
- ? CACHE_MODE_WRITEBACK
- : CACHE_MODE_WRITETHROUGH,
- data_offset,
- backing_dev_labels[i],
- cache_set_sb->user_uuid,
- cache_set_sb->set_uuid);
-
- return 0;
-}