diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-04-28 16:22:54 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-06-20 17:16:33 -0400 |
commit | 3f66d905c037e3fe31f7ca41a0c0039674b18696 (patch) | |
tree | 7629edaa442377edf5081c0e3c4faf6b00d14214 | |
parent | 10ed83353be8c8fcfb89b2e700fb8f2be0f8673c (diff) |
bch2_format_for_device_add()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | c_src/cmd_device.c | 22 | ||||
-rw-r--r-- | c_src/libbcachefs.c | 21 | ||||
-rw-r--r-- | c_src/libbcachefs.h | 7 |
3 files changed, 30 insertions, 20 deletions
diff --git a/c_src/cmd_device.c b/c_src/cmd_device.c index 800ccca4..e7c40d0a 100644 --- a/c_src/cmd_device.c +++ b/c_src/cmd_device.c @@ -49,7 +49,6 @@ static int cmd_device_add(int argc, char *argv[]) { "help", no_argument, NULL, 'h' }, { NULL } }; - struct format_opts format_opts = format_opts_default(); struct dev_opts dev_opts = dev_opts_default(); bool force = false; @@ -106,26 +105,13 @@ static int cmd_device_add(int argc, char *argv[]) struct bchfs_handle fs = bcache_fs_open(fs_path); - int ret = open_for_format(&dev_opts, 0, force); + int ret = open_for_format(&dev_opts, 0, force) ?: + bch2_format_for_device_add(&dev_opts, + read_file_u64(fs.sysfs_fd, "options/block_size"), + read_file_u64(fs.sysfs_fd, "options/btree_node_size")); if (ret) die("Error opening %s: %s", dev_opts.path, strerror(-ret)); - struct bch_opt_strs fs_opt_strs; - memset(&fs_opt_strs, 0, sizeof(fs_opt_strs)); - - struct bch_opts fs_opts = bch2_parse_opts(fs_opt_strs); - - opt_set(fs_opts, block_size, - read_file_u64(fs.sysfs_fd, "options/block_size")); - opt_set(fs_opts, btree_node_size, - read_file_u64(fs.sysfs_fd, "options/btree_node_size")); - - dev_opts_list devs = {}; - darray_push(&devs, dev_opts); - - struct bch_sb *sb = bch2_format(fs_opt_strs, fs_opts, format_opts, devs); - darray_exit(&devs); - free(sb); bchu_disk_add(fs, dev_opts.path); /* A whole bunch of nonsense to get blkid to update its cache, so diff --git a/c_src/libbcachefs.c b/c_src/libbcachefs.c index 5df37d1f..81ad8cf1 100644 --- a/c_src/libbcachefs.c +++ b/c_src/libbcachefs.c @@ -342,6 +342,27 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, return sb.sb; } +int bch2_format_for_device_add(struct dev_opts *dev, + unsigned block_size, unsigned btree_node_size) +{ + struct bch_opt_strs fs_opt_strs; + memset(&fs_opt_strs, 0, sizeof(fs_opt_strs)); + + struct bch_opts fs_opts = bch2_parse_opts(fs_opt_strs); + opt_set(fs_opts, block_size, block_size); + opt_set(fs_opts, btree_node_size, btree_node_size); + + dev_opts_list devs = {}; + darray_push(&devs, *dev); + + struct format_opts format_opts = format_opts_default(); + struct bch_sb *sb = bch2_format(fs_opt_strs, fs_opts, format_opts, devs); + darray_exit(&devs); + free(sb); + + return 0; +} + void bch2_super_write(int fd, struct bch_sb *sb) { struct nonce nonce = { 0 }; diff --git a/c_src/libbcachefs.h b/c_src/libbcachefs.h index 809a8c87..b1ac1b0a 100644 --- a/c_src/libbcachefs.h +++ b/c_src/libbcachefs.h @@ -71,7 +71,7 @@ static inline struct format_opts format_opts_default() struct dev_opts { struct file *file; struct block_device *bdev; - char *path; + const char *path; u64 sb_offset; u64 sb_end; @@ -102,6 +102,9 @@ struct bch_sb *bch2_format(struct bch_opt_strs, struct format_opts, dev_opts_list devs); +int bch2_format_for_device_add(struct dev_opts *, + unsigned, unsigned); + void bch2_super_write(int, struct bch_sb *); struct bch_sb *__bch2_super_read(int, u64); @@ -125,7 +128,7 @@ struct bchfs_handle bchu_fs_open_by_dev(const char *, int *); int bchu_dev_path_to_idx(struct bchfs_handle, const char *); -static inline void bchu_disk_add(struct bchfs_handle fs, char *dev) +static inline void bchu_disk_add(struct bchfs_handle fs, const char *dev) { struct bch_ioctl_disk i = { .dev = (unsigned long) dev, }; |