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;
71 static inline struct dev_opts dev_opts_default()
73 return (struct dev_opts) {
74 .data_allowed = ~0U << 2,
79 void bch2_pick_bucket_size(struct format_opts, struct dev_opts *);
80 struct bch_sb *bch2_format(struct format_opts, struct dev_opts *, size_t);
82 void bch2_super_write(int, struct bch_sb *);
83 struct bch_sb *__bch2_super_read(int, u64);
85 void bch2_sb_print(struct bch_sb *, bool, unsigned, enum units);
87 /* ioctl interface: */
89 int bcachectl_open(void);
97 void bcache_fs_close(struct bchfs_handle);
98 struct bchfs_handle bcache_fs_open(const char *);
99 struct bchfs_handle bchu_fs_open_by_dev(const char *, unsigned *);
101 static inline void bchu_disk_add(struct bchfs_handle fs, char *dev)
103 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
105 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i);
108 static inline void bchu_disk_remove(struct bchfs_handle fs, unsigned dev_idx,
111 struct bch_ioctl_disk i = {
112 .flags = flags|BCH_BY_INDEX,
116 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i);
119 static inline void bchu_disk_online(struct bchfs_handle fs, char *dev)
121 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
123 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i);
126 static inline void bchu_disk_offline(struct bchfs_handle fs, unsigned dev_idx,
129 struct bch_ioctl_disk i = {
130 .flags = flags|BCH_BY_INDEX,
134 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i);
137 static inline void bchu_disk_set_state(struct bchfs_handle fs, unsigned dev,
138 unsigned new_state, unsigned flags)
140 struct bch_ioctl_disk_set_state i = {
141 .flags = flags|BCH_BY_INDEX,
142 .new_state = new_state,
146 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i);
149 static inline struct bch_ioctl_usage *bchu_usage(struct bchfs_handle fs)
151 struct bch_ioctl_usage *u = NULL;
152 unsigned nr_devices = 4;
155 u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
156 u->nr_devices = nr_devices;
158 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
162 die("BCH_IOCTL_USAGE error: %m");
167 static inline struct bch_sb *bchu_read_super(struct bchfs_handle fs, unsigned idx)
170 struct bch_sb *sb = NULL;
173 sb = xrealloc(sb, size);
174 struct bch_ioctl_read_super i = {
180 i.flags |= BCH_READ_DEV|BCH_BY_INDEX;
184 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_READ_SUPER, &i))
187 die("BCH_IOCTL_READ_SUPER error: %m");
192 static inline unsigned bchu_disk_get_idx(struct bchfs_handle fs, dev_t dev)
194 struct bch_ioctl_disk_get_idx i = { .dev = dev };
196 return xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_GET_IDX, &i);
199 static inline void bchu_disk_resize(struct bchfs_handle fs,
203 struct bch_ioctl_disk_resize i = {
204 .flags = BCH_BY_INDEX,
206 .nbuckets = nbuckets,
209 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i);
212 int bchu_data(struct bchfs_handle, struct bch_ioctl_data);
214 #endif /* _LIBBCACHE_H */