diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-12-28 16:47:44 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-01-01 21:14:22 -0500 |
commit | 9cc3b7debbe27955d480f35f0d7aa8a97c51c3af (patch) | |
tree | de7515857db1bd2db4b9c3a32022bfaf15f1fb01 /libbcachefs.c | |
parent | 38f8daa2b17627488c51f2e0c150213bd1636e00 (diff) |
Unit handling cleanups
The option code has been switching to keeping things in display units -
bytes - and this transitions more libbcachefs.c code to bytes as well,
to match, and also fixes device add.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'libbcachefs.c')
-rw-r--r-- | libbcachefs.c | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/libbcachefs.c b/libbcachefs.c index 076fe667..393d3685 100644 --- a/libbcachefs.c +++ b/libbcachefs.c @@ -29,12 +29,6 @@ #define NSEC_PER_SEC 1000000000L -/* minimum size filesystem we can create, given a bucket size: */ -static u64 min_size(unsigned bucket_size) -{ - return BCH_MIN_NR_NBUCKETS * bucket_size; -} - static void init_layout(struct bch_sb_layout *l, unsigned block_size, unsigned sb_size, @@ -64,14 +58,20 @@ static void init_layout(struct bch_sb_layout *l, sb_start, sb_pos, sb_end, sb_size); } +/* minimum size filesystem we can create, given a bucket size: */ +static u64 min_size(unsigned bucket_size) +{ + return BCH_MIN_NR_NBUCKETS * bucket_size; +} + void bch2_pick_bucket_size(struct bch_opts opts, struct dev_opts *dev) { if (!dev->size) - dev->size = get_size(dev->path, dev->fd) >> 9; + dev->size = get_size(dev->path, dev->fd); if (!dev->bucket_size) { if (dev->size < min_size(opts.block_size)) - die("cannot format %s, too small (%llu sectors, min %llu)", + die("cannot format %s, too small (%llu bytes, min %llu)", dev->path, dev->size, min_size(opts.block_size)); /* Bucket size must be >= block size: */ @@ -83,16 +83,16 @@ void bch2_pick_bucket_size(struct bch_opts opts, struct dev_opts *dev) opts.btree_node_size); /* Want a bucket size of at least 128k, if possible: */ - dev->bucket_size = max(dev->bucket_size, 256U); + dev->bucket_size = max(dev->bucket_size, 128ULL << 10); if (dev->size >= min_size(dev->bucket_size)) { unsigned scale = max(1, - ilog2(dev->size / min_size(dev->bucket_size)) / 4); + ilog2(dev->size / min_size(dev->bucket_size)) / 4); scale = rounddown_pow_of_two(scale); /* max bucket size 1 mb */ - dev->bucket_size = min(dev->bucket_size * scale, 1U << 11); + dev->bucket_size = min(dev->bucket_size * scale, 1ULL << 20); } else { do { dev->bucket_size /= 2; @@ -100,21 +100,24 @@ void bch2_pick_bucket_size(struct bch_opts opts, struct dev_opts *dev) } } - dev->nbuckets = dev->size / dev->bucket_size; + dev->nbuckets = dev->size / dev->bucket_size; - if (dev->bucket_size << 9 < opts.block_size) - die("Bucket size (%u) cannot be smaller than block size (%u)", - dev->bucket_size << 9, opts.block_size); + if (dev->bucket_size < opts.block_size) + die("Bucket size (%llu) cannot be smaller than block size (%u)", + dev->bucket_size, opts.block_size); if (opt_defined(opts, btree_node_size) && - dev->bucket_size << 9 < opts.btree_node_size) - die("Bucket size (%u) cannot be smaller than btree node size (%u)", - dev->bucket_size << 9, opts.btree_node_size); + dev->bucket_size < opts.btree_node_size) + die("Bucket size (%llu) cannot be smaller than btree node size (%u)", + dev->bucket_size, opts.btree_node_size); if (dev->nbuckets < BCH_MIN_NR_NBUCKETS) - die("Not enough buckets: %llu, need %u (bucket size %u)", + die("Not enough buckets: %llu, need %u (bucket size %llu)", dev->nbuckets, BCH_MIN_NR_NBUCKETS, dev->bucket_size); + if (dev->bucket_size > (u32) U16_MAX << 9) + die("Bucket size (%llu) too big (max %u)", + dev->bucket_size, (u32) U16_MAX << 9); } static unsigned parse_target(struct bch_sb_handle *sb, @@ -174,7 +177,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, for (i = devs; i < devs + nr_devs; i++) fs_opts.btree_node_size = min_t(unsigned, fs_opts.btree_node_size, - i->bucket_size << 9); + i->bucket_size); } if (uuid_is_null(opts.uuid.b)) @@ -229,7 +232,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, uuid_generate(m->uuid.b); m->nbuckets = cpu_to_le64(i->nbuckets); m->first_bucket = 0; - m->bucket_size = cpu_to_le16(i->bucket_size); + m->bucket_size = cpu_to_le16(i->bucket_size >> 9); SET_BCH_MEMBER_DISCARD(m, i->discard); SET_BCH_MEMBER_DATA_ALLOWED(m, i->data_allowed); @@ -246,7 +249,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, idx = bch2_disk_path_find_or_create(&sb, i->label); if (idx < 0) - die("error creating disk path: %s", idx); + die("error creating disk path: %s", strerror(-idx)); SET_BCH_MEMBER_GROUP(m, idx + 1); } @@ -270,11 +273,13 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, } for (i = devs; i < devs + nr_devs; i++) { + u64 size_sectors = i->size >> 9; + sb.sb->dev_idx = i - devs; if (!i->sb_offset) { i->sb_offset = BCH_SB_SECTOR; - i->sb_end = i->size; + i->sb_end = size_sectors; } init_layout(&sb.sb->layout, fs_opts.block_size, @@ -290,9 +295,9 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, */ if (i->sb_offset == BCH_SB_SECTOR) { struct bch_sb_layout *l = &sb.sb->layout; - u64 backup_sb = i->size - (1 << l->sb_max_size_bits); + u64 backup_sb = size_sectors - (1 << l->sb_max_size_bits); - backup_sb = rounddown(backup_sb, i->bucket_size); + backup_sb = rounddown(backup_sb, i->bucket_size >> 9); l->sb_offset[l->nr_superblocks++] = cpu_to_le64(backup_sb); } @@ -300,7 +305,8 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, /* Zero start of disk */ static const char zeroes[BCH_SB_SECTOR << 9]; - xpwrite(i->fd, zeroes, BCH_SB_SECTOR << 9, 0); + xpwrite(i->fd, zeroes, BCH_SB_SECTOR << 9, 0, + "zeroing start of disk"); } bch2_super_write(i->fd, sb.sb); @@ -321,12 +327,14 @@ void bch2_super_write(int fd, struct bch_sb *sb) if (sb->offset == BCH_SB_SECTOR) { /* Write backup layout */ xpwrite(fd, &sb->layout, sizeof(sb->layout), - BCH_SB_LAYOUT_SECTOR << 9); + BCH_SB_LAYOUT_SECTOR << 9, + "backup layout"); } sb->csum = csum_vstruct(NULL, BCH_SB_CSUM_TYPE(sb), nonce, sb); xpwrite(fd, sb, vstruct_bytes(sb), - le64_to_cpu(sb->offset) << 9); + le64_to_cpu(sb->offset) << 9, + "superblock"); } fsync(fd); |