4 #include <linux/uuid.h>
7 #include "libbcachefs/bcachefs_format.h"
8 #include "libbcachefs/bcachefs_ioctl.h"
9 #include "tools-util.h"
10 #include "libbcachefs/vstructs.h"
16 unsigned on_error_action;
19 unsigned btree_node_size;
20 unsigned encoded_extent_max;
22 unsigned meta_replicas;
23 unsigned data_replicas;
25 unsigned meta_replicas_required;
26 unsigned data_replicas_required;
28 const char *foreground_target;
29 const char *background_target;
30 const char *promote_target;
32 unsigned meta_csum_type;
33 unsigned data_csum_type;
34 unsigned compression_type;
35 unsigned background_compression_type;
41 static inline struct format_opts format_opts_default()
43 return (struct format_opts) {
44 .on_error_action = BCH_ON_ERROR_RO,
45 .encoded_extent_max = 128,
46 .meta_csum_type = BCH_CSUM_OPT_CRC32C,
47 .data_csum_type = BCH_CSUM_OPT_CRC32C,
50 .meta_replicas_required = 1,
51 .data_replicas_required = 1,
58 u64 size; /* 512 byte sectors */
61 unsigned data_allowed;
70 static inline struct dev_opts dev_opts_default()
72 return (struct dev_opts) {
73 .data_allowed = ~0U << 2,
77 void bch2_pick_bucket_size(struct format_opts, struct dev_opts *);
78 struct bch_sb *bch2_format(struct format_opts, struct dev_opts *, size_t);
80 void bch2_super_write(int, struct bch_sb *);
81 struct bch_sb *__bch2_super_read(int, u64);
83 void bch2_sb_print(struct bch_sb *, bool, unsigned, enum units);
85 /* ioctl interface: */
87 int bcachectl_open(void);
95 void bcache_fs_close(struct bchfs_handle);
96 struct bchfs_handle bcache_fs_open(const char *);
97 struct bchfs_handle bchu_fs_open_by_dev(const char *, unsigned *);
99 static inline void bchu_disk_add(struct bchfs_handle fs, char *dev)
101 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
103 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i);
106 static inline void bchu_disk_remove(struct bchfs_handle fs, unsigned dev_idx,
109 struct bch_ioctl_disk i = {
110 .flags = flags|BCH_BY_INDEX,
114 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i);
117 static inline void bchu_disk_online(struct bchfs_handle fs, char *dev)
119 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
121 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i);
124 static inline void bchu_disk_offline(struct bchfs_handle fs, unsigned dev_idx,
127 struct bch_ioctl_disk i = {
128 .flags = flags|BCH_BY_INDEX,
132 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i);
135 static inline void bchu_disk_set_state(struct bchfs_handle fs, unsigned dev,
136 unsigned new_state, unsigned flags)
138 struct bch_ioctl_disk_set_state i = {
139 .flags = flags|BCH_BY_INDEX,
140 .new_state = new_state,
144 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i);
147 static inline struct bch_ioctl_usage *bchu_usage(struct bchfs_handle fs)
149 struct bch_ioctl_usage *u = NULL;
150 unsigned nr_devices = 4;
153 u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
154 u->nr_devices = nr_devices;
156 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
160 die("BCH_IOCTL_USAGE error: %m");
165 static inline struct bch_sb *bchu_read_super(struct bchfs_handle fs, unsigned idx)
168 struct bch_sb *sb = NULL;
171 sb = xrealloc(sb, size);
172 struct bch_ioctl_read_super i = {
178 i.flags |= BCH_READ_DEV|BCH_BY_INDEX;
182 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_READ_SUPER, &i))
185 die("BCH_IOCTL_READ_SUPER error: %m");
190 static inline unsigned bchu_disk_get_idx(struct bchfs_handle fs, dev_t dev)
192 struct bch_ioctl_disk_get_idx i = { .dev = dev };
194 return xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_GET_IDX, &i);
197 static inline void bchu_disk_resize(struct bchfs_handle fs,
201 struct bch_ioctl_disk_resize i = {
202 .flags = BCH_BY_INDEX,
204 .nbuckets = nbuckets,
207 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i);
210 int bchu_data(struct bchfs_handle, struct bch_ioctl_data);
212 #endif /* _LIBBCACHE_H */