-
Notifications
You must be signed in to change notification settings - Fork 94
/
libbcachefs.h
214 lines (168 loc) · 4.53 KB
/
libbcachefs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#ifndef _LIBBCACHE_H
#define _LIBBCACHE_H
#include <linux/uuid.h>
#include <stdbool.h>
#include "libbcachefs/bcachefs_format.h"
#include "libbcachefs/bcachefs_ioctl.h"
#include "tools-util.h"
#include "libbcachefs/vstructs.h"
struct format_opts {
char *label;
uuid_le uuid;
unsigned on_error_action;
unsigned block_size;
unsigned btree_node_size;
unsigned encoded_extent_max;
unsigned meta_replicas;
unsigned data_replicas;
unsigned meta_replicas_required;
unsigned data_replicas_required;
const char *foreground_target;
const char *background_target;
const char *promote_target;
unsigned meta_csum_type;
unsigned data_csum_type;
unsigned compression_type;
unsigned background_compression_type;
bool encrypted;
char *passphrase;
};
static inline struct format_opts format_opts_default()
{
return (struct format_opts) {
.on_error_action = BCH_ON_ERROR_RO,
.encoded_extent_max = 128,
.meta_csum_type = BCH_CSUM_OPT_CRC32C,
.data_csum_type = BCH_CSUM_OPT_CRC32C,
.meta_replicas = 1,
.data_replicas = 1,
.meta_replicas_required = 1,
.data_replicas_required = 1,
};
}
struct dev_opts {
int fd;
char *path;
u64 size; /* 512 byte sectors */
unsigned bucket_size;
const char *group;
unsigned data_allowed;
unsigned durability;
bool discard;
u64 nbuckets;
u64 sb_offset;
u64 sb_end;
};
static inline struct dev_opts dev_opts_default()
{
return (struct dev_opts) {
.data_allowed = ~0U << 2,
.durability = 1,
};
}
void bch2_pick_bucket_size(struct format_opts, struct dev_opts *);
struct bch_sb *bch2_format(struct format_opts, struct dev_opts *, size_t);
void bch2_super_write(int, struct bch_sb *);
struct bch_sb *__bch2_super_read(int, u64);
void bch2_sb_print(struct bch_sb *, bool, unsigned, enum units);
/* ioctl interface: */
int bcachectl_open(void);
struct bchfs_handle {
uuid_le uuid;
int ioctl_fd;
int sysfs_fd;
};
void bcache_fs_close(struct bchfs_handle);
struct bchfs_handle bcache_fs_open(const char *);
struct bchfs_handle bchu_fs_open_by_dev(const char *, unsigned *);
static inline void bchu_disk_add(struct bchfs_handle fs, char *dev)
{
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,
};
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, };
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,
};
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 = {
.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_usage *bchu_usage(struct bchfs_handle fs)
{
struct bch_ioctl_usage *u = NULL;
unsigned nr_devices = 4;
while (1) {
u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
u->nr_devices = nr_devices;
if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
return u;
if (errno != ENOSPC)
die("BCH_IOCTL_USAGE error: %m");
nr_devices *= 2;
}
}
static inline struct bch_sb *bchu_read_super(struct bchfs_handle fs, unsigned idx)
{
size_t size = 4096;
struct bch_sb *sb = NULL;
while (1) {
sb = xrealloc(sb, size);
struct bch_ioctl_read_super i = {
.size = size,
.sb = (unsigned long) sb,
};
if (idx != -1) {
i.flags |= BCH_READ_DEV|BCH_BY_INDEX;
i.dev = idx;
}
if (!ioctl(fs.ioctl_fd, BCH_IOCTL_READ_SUPER, &i))
return sb;
if (errno != ERANGE)
die("BCH_IOCTL_READ_SUPER error: %m");
size *= 2;
}
}
static inline unsigned bchu_disk_get_idx(struct bchfs_handle fs, dev_t dev)
{
struct bch_ioctl_disk_get_idx i = { .dev = dev };
return xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_GET_IDX, &i);
}
static inline void bchu_disk_resize(struct bchfs_handle fs,
unsigned idx,
u64 nbuckets)
{
struct bch_ioctl_disk_resize i = {
.flags = BCH_BY_INDEX,
.dev = idx,
.nbuckets = nbuckets,
};
xioctl(fs.ioctl_fd, BCH_IOCTL_DISK_RESIZE, &i);
}
int bchu_data(struct bchfs_handle, struct bch_ioctl_data);
#endif /* _LIBBCACHE_H */