diff --git a/cmd_format.c b/cmd_format.c index 065efd9d..75efd521 100644 --- a/cmd_format.c +++ b/cmd_format.c @@ -57,6 +57,7 @@ x(0, bucket_size, "size", "Bucket size") \ x('g', group, "label", "Disk group")\ x(0, discard, NULL, NULL) \ x(0, data_allowed, "journal,btree,data", "Allowed types of data on this device")\ +x(0, durability, "#", "Number of times data written to this device will have been considered replicated")\ t("Device specific options must come before corresponding devices, e.g.") \ t(" bcachefs format --group cache /dev/sdb --tier 1 /dev/sdc") \ t("") \ @@ -96,6 +97,7 @@ static void usage(void) " --fs_size=size Size of filesystem on device\n" " --bucket=size Bucket size\n" " --discard Enable discards\n" + " --durability=# Device durability (0-4)\n" " -g, --group=label Disk group\n" "\n" " -q, --quiet Only print errors\n" @@ -261,6 +263,11 @@ int cmd_format(int argc, char *argv[]) read_flag_list_or_die(optarg, bch2_data_types, "data type"); break; + case O_durability: + if (kstrtouint(optarg, 10, &dev_opts.durability) || + dev_opts.durability > BCH_REPLICAS_MAX) + die("invalid durability"); + break; case O_no_opt: dev_opts.path = strdup(optarg); darray_append(devices, dev_opts); diff --git a/libbcachefs.c b/libbcachefs.c index cd277fa7..052ca35b 100644 --- a/libbcachefs.c +++ b/libbcachefs.c @@ -247,6 +247,7 @@ struct bch_sb *bch2_format(struct format_opts opts, SET_BCH_MEMBER_REPLACEMENT(m, CACHE_REPLACEMENT_LRU); SET_BCH_MEMBER_DISCARD(m, i->discard); SET_BCH_MEMBER_DATA_ALLOWED(m, i->data_allowed); + SET_BCH_MEMBER_DURABILITY(m, i->durability + 1); } /* Disk groups */ diff --git a/libbcachefs.h b/libbcachefs.h index deaa2875..8537a048 100644 --- a/libbcachefs.h +++ b/libbcachefs.h @@ -59,6 +59,7 @@ struct dev_opts { unsigned bucket_size; const char *group; unsigned data_allowed; + unsigned durability; bool discard; u64 nbuckets; @@ -71,6 +72,7 @@ static inline struct dev_opts dev_opts_default() { return (struct dev_opts) { .data_allowed = ~0U << 2, + .durability = 1, }; }