diff options
author | koverstreet <kent.overstreet@gmail.com> | 2025-08-22 00:36:23 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-22 00:36:23 -0500 |
commit | 611661aa39277477408947c71c9cc99986ce0d70 (patch) | |
tree | efdaf61de17af7a63759d32006cbc4e552d55954 | |
parent | 62d625391c9a34c9ecb7ab123091b323c1204004 (diff) | |
parent | 5747daac9d9e05ba1fa0ad199d23e5ddfec1a15c (diff) |
Slightly improve size of seeded filesystems
-rw-r--r-- | c_src/libbcachefs.c | 18 | ||||
-rw-r--r-- | c_src/posix_to_bcachefs.c | 9 |
2 files changed, 15 insertions, 12 deletions
diff --git a/c_src/libbcachefs.c b/c_src/libbcachefs.c index a7fc572a..ed84be1b 100644 --- a/c_src/libbcachefs.c +++ b/c_src/libbcachefs.c @@ -201,18 +201,20 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, dev_opts_list devs) { struct bch_sb_handle sb = { NULL }; - unsigned max_dev_block_size = 0; - - darray_for_each(devs, i) - max_dev_block_size = max(max_dev_block_size, get_blocksize(i->bdev->bd_fd)); /* calculate block size: */ - if (!opt_defined(fs_opts, block_size)) + if (!opt_defined(fs_opts, block_size)) { + unsigned max_dev_block_size = 0; + + darray_for_each(devs, i) + max_dev_block_size = max(max_dev_block_size, get_blocksize(i->bdev->bd_fd)); + opt_set(fs_opts, block_size, max_dev_block_size); + } - if (fs_opts.block_size < max_dev_block_size) - die("blocksize too small: %u, must be greater than device blocksize %u", - fs_opts.block_size, max_dev_block_size); + if (fs_opts.block_size < 512) + die("blocksize too small: %u, must be greater than one sector (512 bytes)", + fs_opts.block_size); /* get device size, if it wasn't specified: */ darray_for_each(devs, i) diff --git a/c_src/posix_to_bcachefs.c b/c_src/posix_to_bcachefs.c index ca44db32..62f10b3d 100644 --- a/c_src/posix_to_bcachefs.c +++ b/c_src/posix_to_bcachefs.c @@ -255,7 +255,7 @@ static void read_data(struct bch_fs *c, static void write_data(struct bch_fs *c, struct bch_inode_unpacked *dst_inode, - u64 dst_offset, void *buf, size_t len) + u64 dst_offset, void *buf, size_t len, u64 new_i_size) { struct bch_write_op op; struct bio_vec bv[WRITE_DATA_BUF / PAGE_SIZE]; @@ -273,6 +273,7 @@ static void write_data(struct bch_fs *c, op.subvol = 1; op.pos = SPOS(dst_inode->bi_inum, dst_offset >> 9, U32_MAX); op.flags |= BCH_WRITE_sync|BCH_WRITE_only_specified_devs; + op.new_i_size = new_i_size; int ret = bch2_disk_reservation_get(c, &op.res, len >> 9, c->opts.data_replicas, 0); @@ -299,7 +300,7 @@ static void copy_data(struct bch_fs *c, xpread(src_fd, src_buf, len, start); memset(src_buf + len, 0, pad); - write_data(c, dst_inode, start, src_buf, len + pad); + write_data(c, dst_inode, start, src_buf, len + pad, start + len); start += len; } } @@ -380,7 +381,7 @@ static void copy_link(struct bch_fs *c, for (unsigned i = ret; i < round_up(ret, block_bytes(c)); i++) src_buf[i] = 0; - write_data(c, dst, 0, src_buf, round_up(ret, block_bytes(c))); + write_data(c, dst, 0, src_buf, round_up(ret, block_bytes(c)), ret); } static void link_file_data(struct bch_fs *c, @@ -534,7 +535,7 @@ static void copy_sync_file_range(struct bch_fs *c, while ((m = seek_mismatch_aligned(src_buf, dst_buf, m.end, b, c->opts.block_size)).end) { write_data(c, dst, r.start + m.start, - src_buf + m.start, m.end - m.start); + src_buf + m.start, m.end - m.start, min_t(u64, m.end, src_size)); s->total_wrote += m.end - m.start; } |