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;
40 static inline struct format_opts format_opts_default()
42 return (struct format_opts) {
43 .on_error_action = BCH_ON_ERROR_RO,
44 .encoded_extent_max = 128,
45 .meta_csum_type = BCH_CSUM_OPT_CRC32C,
46 .data_csum_type = BCH_CSUM_OPT_CRC32C,
49 .meta_replicas_required = 1,
50 .data_replicas_required = 1,
57 u64 size; /* 512 byte sectors */
60 unsigned data_allowed;
69 static inline struct dev_opts dev_opts_default()
71 return (struct dev_opts) {
72 .data_allowed = ~0U << 2,
76 void bch2_pick_bucket_size(struct format_opts, struct dev_opts *);
77 struct bch_sb *bch2_format(struct format_opts, struct dev_opts *, size_t);
79 void bch2_super_write(int, struct bch_sb *);
80 struct bch_sb *__bch2_super_read(int, u64);
82 void bch2_sb_print(struct bch_sb *, bool, unsigned, enum units);
84 /* ioctl interface: */
86 int bcachectl_open(void);
94 void bcache_fs_close(struct bchfs_handle);
95 struct bchfs_handle bcache_fs_open(const char *);
96 struct bchfs_handle bchu_fs_open_by_dev(const char *, unsigned *);
98 static inline void bchu_disk_add(struct bchfs_handle fs, char *dev)
100 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
102 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i);
105 static inline void bchu_disk_remove(struct bchfs_handle fs, unsigned dev_idx,
108 struct bch_ioctl_disk i = {
109 .flags = flags|BCH_BY_INDEX,
113 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i);
116 static inline void bchu_disk_online(struct bchfs_handle fs, char *dev)
118 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
120 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i);
123 static inline void bchu_disk_offline(struct bchfs_handle fs, unsigned dev_idx,
126 struct bch_ioctl_disk i = {
127 .flags = flags|BCH_BY_INDEX,
131 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i);
134 static inline void bchu_disk_set_state(struct bchfs_handle fs, unsigned dev,
135 unsigned new_state, unsigned flags)
137 struct bch_ioctl_disk_set_state i = {
138 .flags = flags|BCH_BY_INDEX,
139 .new_state = new_state,
143 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i);
146 static inline struct bch_ioctl_usage *bchu_usage(struct bchfs_handle fs)
148 struct bch_ioctl_usage *u = NULL;
149 unsigned nr_devices = 4;
152 u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
153 u->nr_devices = nr_devices;
155 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
159 die("BCH_IOCTL_USAGE error: %m");
164 static inline struct bch_sb *bchu_read_super(struct bchfs_handle fs, unsigned idx)
167 struct bch_sb *sb = NULL;
170 sb = xrealloc(sb, size);
171 struct bch_ioctl_read_super i = {
177 i.flags |= BCH_READ_DEV|BCH_BY_INDEX;
181 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_READ_SUPER, &i))
184 die("BCH_IOCTL_READ_SUPER error: %m");
189 static inline unsigned bchu_disk_get_idx(struct bchfs_handle fs, dev_t dev)
191 struct bch_ioctl_disk_get_idx i = { .dev = dev };
193 return xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_GET_IDX, &i);
196 static inline void bchu_disk_resize(struct bchfs_handle fs,
200 struct bch_ioctl_disk_resize i = {
201 .flags = BCH_BY_INDEX,
203 .nbuckets = nbuckets,
206 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i);
209 int bchu_data(struct bchfs_handle, struct bch_ioctl_data);
211 #endif /* _LIBBCACHE_H */