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 unsigned meta_csum_type;
29 unsigned data_csum_type;
30 unsigned compression_type;
36 static inline struct format_opts format_opts_default()
38 return (struct format_opts) {
39 .on_error_action = BCH_ON_ERROR_RO,
40 .encoded_extent_max = 128,
41 .meta_csum_type = BCH_CSUM_OPT_CRC32C,
42 .data_csum_type = BCH_CSUM_OPT_CRC32C,
45 .meta_replicas_required = 1,
46 .data_replicas_required = 1,
53 u64 size; /* 512 byte sectors */
56 unsigned data_allowed;
65 static inline struct dev_opts dev_opts_default()
67 return (struct dev_opts) {
68 .data_allowed = ~0U << 2,
72 void bch2_pick_bucket_size(struct format_opts, struct dev_opts *);
73 struct bch_sb *bch2_format(struct format_opts, struct dev_opts *, size_t);
75 void bch2_super_write(int, struct bch_sb *);
76 struct bch_sb *__bch2_super_read(int, u64);
78 void bch2_sb_print(struct bch_sb *, bool, unsigned, enum units);
80 /* ioctl interface: */
82 int bcachectl_open(void);
90 void bcache_fs_close(struct bchfs_handle);
91 struct bchfs_handle bcache_fs_open(const char *);
92 struct bchfs_handle bchu_fs_open_by_dev(const char *, unsigned *);
94 static inline void bchu_disk_add(struct bchfs_handle fs, char *dev)
96 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
98 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ADD, &i);
101 static inline void bchu_disk_remove(struct bchfs_handle fs, unsigned dev_idx,
104 struct bch_ioctl_disk i = {
105 .flags = flags|BCH_BY_INDEX,
109 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_REMOVE, &i);
112 static inline void bchu_disk_online(struct bchfs_handle fs, char *dev)
114 struct bch_ioctl_disk i = { .dev = (__u64) dev, };
116 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_ONLINE, &i);
119 static inline void bchu_disk_offline(struct bchfs_handle fs, unsigned dev_idx,
122 struct bch_ioctl_disk i = {
123 .flags = flags|BCH_BY_INDEX,
127 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_OFFLINE, &i);
130 static inline void bchu_disk_set_state(struct bchfs_handle fs, unsigned dev,
131 unsigned new_state, unsigned flags)
133 struct bch_ioctl_disk_set_state i = {
134 .flags = flags|BCH_BY_INDEX,
135 .new_state = new_state,
139 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_SET_STATE, &i);
142 static inline struct bch_ioctl_usage *bchu_usage(struct bchfs_handle fs)
144 struct bch_ioctl_usage *u = NULL;
145 unsigned nr_devices = 4;
148 u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
149 u->nr_devices = nr_devices;
151 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
155 die("BCH_IOCTL_USAGE error: %m");
160 static inline struct bch_sb *bchu_read_super(struct bchfs_handle fs, unsigned idx)
163 struct bch_sb *sb = NULL;
166 sb = xrealloc(sb, size);
167 struct bch_ioctl_read_super i = {
173 i.flags |= BCH_READ_DEV|BCH_BY_INDEX;
177 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_READ_SUPER, &i))
180 die("BCH_IOCTL_READ_SUPER error: %m");
185 static inline unsigned bchu_disk_get_idx(struct bchfs_handle fs, dev_t dev)
187 struct bch_ioctl_disk_get_idx i = { .dev = dev };
189 return xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_GET_IDX, &i);
192 static inline void bchu_disk_resize(struct bchfs_handle fs,
196 struct bch_ioctl_disk_resize i = {
197 .flags = BCH_BY_INDEX,
199 .nbuckets = nbuckets,
202 xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i);
205 int bchu_data(struct bchfs_handle, struct bch_ioctl_data);
207 #endif /* _LIBBCACHE_H */