diff options
Diffstat (limited to 'c_src/libbcachefs.h')
-rw-r--r-- | c_src/libbcachefs.h | 94 |
1 files changed, 69 insertions, 25 deletions
diff --git a/c_src/libbcachefs.h b/c_src/libbcachefs.h index b1ac1b0a..b50a3b16 100644 --- a/c_src/libbcachefs.h +++ b/c_src/libbcachefs.h @@ -31,6 +31,7 @@ void bch2_opt_strs_free(struct bch_opt_strs *); const struct bch_option *bch2_cmdline_opt_parse(int argc, char *argv[], unsigned opt_types); +void bch_remove_arg_from_argv(int *argc, char *argv[], int index); struct bch_opt_strs bch2_cmdline_opts_get(int *, char *[], unsigned); struct bch_opts bch2_parse_opts(struct bch_opt_strs); void bch2_opts_usage(unsigned); @@ -41,6 +42,7 @@ struct format_opts { unsigned version; unsigned superblock_size; bool encrypted; + char *passphrase_file; char *passphrase; char *source; bool no_sb_at_end; @@ -128,52 +130,77 @@ struct bchfs_handle bchu_fs_open_by_dev(const char *, int *); int bchu_dev_path_to_idx(struct bchfs_handle, const char *); +#define errmsg_ioctl(_ioctl_fd, _ioctl_nr, _ioctl_arg) \ +({ \ + char err[8192]; \ + (_ioctl_arg)->err.msg_ptr = (ulong) err; \ + (_ioctl_arg)->err.msg_len = sizeof(err); \ + int ret = ioctl(_ioctl_fd, _ioctl_nr, _ioctl_arg); \ + if (ret < 0 && errno != ENOTTY) \ + die(#_ioctl_nr " error: %s\n%s", bch2_err_str(-errno), err);\ + ret >= 0; \ +}) + static inline void bchu_disk_add(struct bchfs_handle fs, const char *dev) { - struct bch_ioctl_disk i = { .dev = (unsigned long) dev, }; + struct bch_ioctl_disk_v2 i = { .dev = (unsigned long) dev, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD_v2, &i)) { + struct bch_ioctl_disk i = { .dev = (unsigned long) dev, }; + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i); + } } static inline void bchu_disk_remove(struct bchfs_handle fs, unsigned dev_idx, unsigned flags) { - struct bch_ioctl_disk i = { - .flags = flags|BCH_BY_INDEX, - .dev = dev_idx, - }; + struct bch_ioctl_disk_v2 i = { .flags = flags|BCH_BY_INDEX, .dev = dev_idx, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE_v2, &i)) { + struct bch_ioctl_disk i = { .flags = flags|BCH_BY_INDEX, .dev = dev_idx, }; + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i); + } } static inline void bchu_disk_online(struct bchfs_handle fs, char *dev) { - struct bch_ioctl_disk i = { .dev = (unsigned long) dev, }; + struct bch_ioctl_disk_v2 i = { .dev = (unsigned long) dev, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE_v2, &i)) { + struct bch_ioctl_disk i = { .dev = (unsigned long) dev, }; + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i); + } } static inline void bchu_disk_offline(struct bchfs_handle fs, unsigned dev_idx, unsigned flags) { - struct bch_ioctl_disk i = { - .flags = flags|BCH_BY_INDEX, - .dev = dev_idx, - }; + struct bch_ioctl_disk_v2 i = { .flags = flags|BCH_BY_INDEX, .dev = dev_idx, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE_v2, &i)) { + struct bch_ioctl_disk i = { .flags = flags|BCH_BY_INDEX, .dev = dev_idx, }; + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i); + } } static inline void bchu_disk_set_state(struct bchfs_handle fs, unsigned dev, unsigned new_state, unsigned flags) { - struct bch_ioctl_disk_set_state i = { + struct bch_ioctl_disk_set_state_v2 i = { .flags = flags|BCH_BY_INDEX, .new_state = new_state, .dev = dev, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE_v2, &i)) { + struct bch_ioctl_disk_set_state i = { + .flags = flags|BCH_BY_INDEX, + .new_state = new_state, + .dev = dev, + }; + + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i); + } } static inline struct bch_ioctl_fs_usage *bchu_fs_usage(struct bchfs_handle fs) @@ -286,36 +313,53 @@ static inline void bchu_disk_resize(struct bchfs_handle fs, unsigned idx, u64 nbuckets) { - struct bch_ioctl_disk_resize i = { + struct bch_ioctl_disk_resize_v2 i = { .flags = BCH_BY_INDEX, .dev = idx, .nbuckets = nbuckets, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE_v2, &i)) { + struct bch_ioctl_disk_resize i = { + .flags = BCH_BY_INDEX, + .dev = idx, + .nbuckets = nbuckets, + }; + + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i); + } } static inline void bchu_disk_resize_journal(struct bchfs_handle fs, unsigned idx, u64 nbuckets) { - struct bch_ioctl_disk_resize i = { + struct bch_ioctl_disk_resize_v2 i = { .flags = BCH_BY_INDEX, .dev = idx, .nbuckets = nbuckets, }; - xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE_JOURNAL, &i); + if (!errmsg_ioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE_JOURNAL_v2, &i)) { + struct bch_ioctl_disk_resize i = { + .flags = BCH_BY_INDEX, + .dev = idx, + .nbuckets = nbuckets, + }; + + xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE_JOURNAL, &i); + } } int bchu_data(struct bchfs_handle, struct bch_ioctl_data); struct dev_name { - unsigned idx; - char *dev; - char *label; - uuid_t uuid; - unsigned durability; + unsigned idx; + char *dev; + char *label; + uuid_t uuid; + unsigned durability; + enum bch_member_state state; }; typedef DARRAY(struct dev_name) dev_names; |