X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs.c;h=b9c3d57a67fb898b61f644d22a60e8d03174529d;hb=4ac5ad0832d5d0e3ddeec7bbb19d4b8e924700c6;hp=16bcd0c6e836432aad00ced8e808048bd60664a9;hpb=e783d814e83b2309930e1f6459212da6da8c8a54;p=bcachefs-tools-debian diff --git a/libbcachefs.c b/libbcachefs.c index 16bcd0c..b9c3d57 100644 --- a/libbcachefs.c +++ b/libbcachefs.c @@ -149,6 +149,12 @@ struct bch_sb *bch2_format(struct format_opts opts, min(opts.btree_node_size, i->bucket_size); } + if (!is_power_of_2(opts.block_size)) + die("block size must be power of 2"); + + if (!is_power_of_2(opts.btree_node_size)) + die("btree node size must be power of 2"); + if (uuid_is_null(opts.uuid.b)) uuid_generate(opts.uuid.b); @@ -157,7 +163,7 @@ struct bch_sb *bch2_format(struct format_opts opts, sizeof(struct bch_member) * nr_devs + sizeof(struct bch_sb_field_crypt)); - sb->version = cpu_to_le64(BCACHE_SB_VERSION_CDEV_V4); + sb->version = cpu_to_le64(BCH_SB_VERSION_MAX); sb->magic = BCACHE_MAGIC; sb->block_size = cpu_to_le16(opts.block_size); sb->user_uuid = opts.uuid; @@ -176,17 +182,18 @@ struct bch_sb *bch2_format(struct format_opts opts, SET_BCH_SB_BTREE_NODE_SIZE(sb, opts.btree_node_size); SET_BCH_SB_GC_RESERVE(sb, 8); SET_BCH_SB_META_REPLICAS_WANT(sb, opts.meta_replicas); - SET_BCH_SB_META_REPLICAS_HAVE(sb, opts.meta_replicas); SET_BCH_SB_META_REPLICAS_REQ(sb, opts.meta_replicas_required); SET_BCH_SB_DATA_REPLICAS_WANT(sb, opts.data_replicas); - SET_BCH_SB_DATA_REPLICAS_HAVE(sb, opts.data_replicas); SET_BCH_SB_DATA_REPLICAS_REQ(sb, opts.data_replicas_required); SET_BCH_SB_ERROR_ACTION(sb, opts.on_error_action); SET_BCH_SB_STR_HASH_TYPE(sb, BCH_STR_HASH_SIPHASH); + SET_BCH_SB_ENCODED_EXTENT_MAX_BITS(sb, ilog2(opts.encoded_extent_max)); + + SET_BCH_SB_POSIX_ACL(sb, 1); struct timespec now; if (clock_gettime(CLOCK_REALTIME, &now)) - die("error getting current time: %s", strerror(errno)); + die("error getting current time: %m"); sb->time_base_lo = cpu_to_le64(now.tv_sec * NSEC_PER_SEC + now.tv_nsec); sb->time_precision = cpu_to_le32(1); @@ -223,6 +230,7 @@ struct bch_sb *bch2_format(struct format_opts opts, SET_BCH_MEMBER_TIER(m, i->tier); SET_BCH_MEMBER_REPLACEMENT(m, CACHE_REPLACEMENT_LRU); SET_BCH_MEMBER_DISCARD(m, i->discard); + SET_BCH_MEMBER_DATA_ALLOWED(m, i->data_allowed); } for (i = devs; i < devs + nr_devs; i++) { @@ -249,7 +257,8 @@ void bch2_super_write(int fd, struct bch_sb *sb) { struct nonce nonce = { 0 }; - for (unsigned i = 0; i < sb->layout.nr_superblocks; i++) { + unsigned i; + for (i = 0; i < sb->layout.nr_superblocks; i++) { sb->offset = sb->layout.sb_offset[i]; if (sb->offset == BCH_SB_SECTOR) { @@ -284,18 +293,27 @@ struct bch_sb *__bch2_super_read(int fd, u64 sector) return ret; } -struct bch_sb *bch2_super_read(const char *path) +static unsigned get_dev_has_data(struct bch_sb *sb, unsigned dev) { - int fd = xopen(path, O_RDONLY); - struct bch_sb *sb = __bch2_super_read(fd, BCH_SB_SECTOR); - close(fd); - return sb; + struct bch_sb_field_replicas *replicas; + struct bch_replicas_entry *r; + unsigned i, data_has = 0; + + replicas = bch2_sb_get_replicas(sb); + + if (replicas) + for_each_replicas_entry(replicas, r) + for (i = 0; i < r->nr; i++) + if (r->devs[i] == dev) + data_has |= 1 << r->data_type; + + return data_has; } void bch2_super_print(struct bch_sb *sb, int units) { struct bch_sb_field_members *mi; - char user_uuid_str[40], internal_uuid_str[40], member_uuid_str[40]; + char user_uuid_str[40], internal_uuid_str[40]; char label[BCH_SB_LABEL_SIZE + 1]; unsigned i; @@ -339,9 +357,9 @@ void bch2_super_print(struct bch_sb *sb, int units) BCH_SB_CLEAN(sb), - BCH_SB_META_REPLICAS_HAVE(sb), + 0LLU, //BCH_SB_META_REPLICAS_HAVE(sb), BCH_SB_META_REPLICAS_WANT(sb), - BCH_SB_DATA_REPLICAS_HAVE(sb), + 0LLU, //BCH_SB_DATA_REPLICAS_HAVE(sb), BCH_SB_DATA_REPLICAS_WANT(sb), BCH_SB_META_CSUM_TYPE(sb) < BCH_CSUM_NR @@ -375,8 +393,24 @@ void bch2_super_print(struct bch_sb *sb, int units) for (i = 0; i < sb->nr_devices; i++) { struct bch_member *m = mi->members + i; time_t last_mount = le64_to_cpu(m->last_mount); + char member_uuid_str[40]; + char data_allowed_str[100]; + char data_has_str[100]; uuid_unparse(m->uuid.b, member_uuid_str); + bch2_scnprint_flag_list(data_allowed_str, + sizeof(data_allowed_str), + bch2_data_types, + BCH_MEMBER_DATA_ALLOWED(m)); + if (!data_allowed_str[0]) + strcpy(data_allowed_str, "(none)"); + + bch2_scnprint_flag_list(data_has_str, + sizeof(data_has_str), + bch2_data_types, + get_dev_has_data(sb, i)); + if (!data_has_str[0]) + strcpy(data_has_str, "(none)"); printf("\n" "Device %u:\n" @@ -388,8 +422,10 @@ void bch2_super_print(struct bch_sb *sb, int units) " Last mount: %s\n" " State: %s\n" " Tier: %llu\n" - " Has metadata: %llu\n" - " Has data: %llu\n" + " Data allowed: %s\n" + + " Has data: %s\n" + " Replacement policy: %s\n" " Discard: %llu\n", i, member_uuid_str, @@ -405,8 +441,8 @@ void bch2_super_print(struct bch_sb *sb, int units) : "unknown", BCH_MEMBER_TIER(m), - BCH_MEMBER_HAS_METADATA(m), - BCH_MEMBER_HAS_DATA(m), + data_allowed_str, + data_has_str, BCH_MEMBER_REPLACEMENT(m) < CACHE_REPLACEMENT_NR ? bch2_cache_replacement_policies[BCH_MEMBER_REPLACEMENT(m)]