summaryrefslogtreecommitdiff
path: root/c_src/libbcachefs.h
diff options
context:
space:
mode:
Diffstat (limited to 'c_src/libbcachefs.h')
-rw-r--r--c_src/libbcachefs.h94
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;