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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
|
#ifndef __LIBCEPHFSD_PROXY_REQUESTS_H__
#define __LIBCEPHFSD_PROXY_REQUESTS_H__
#include "proxy.h"
#include "proxy_link.h"
/* Macros to add and get data from communication buffers. */
#define CEPH_BUFF_ADD(_data, _ptr, _size) \
do { \
_data##_iov[_data##_count].iov_base = (void *)(_ptr); \
_data##_iov[_data##_count].iov_len = (_size); \
_data##_count++; \
} while (0)
#define CEPH_DATA_ADD(_data, _field, _ptr, _size) \
do { \
(_data)._field = (_size); \
CEPH_BUFF_ADD(_data, _ptr, (_data)._field); \
} while (0)
#define CEPH_STR_ADD(_data, _field, _str) \
do { \
if ((_str) != NULL) { \
CEPH_DATA_ADD(_data, _field, _str, strlen(_str) + 1); \
} else { \
(_data)._field = 0; \
} \
} while (0)
#define CEPH_STR_GET(_data, _field, _ptr) \
({ \
const void *__ptr = (_ptr); \
if ((_data)._field == 0) { \
__ptr = NULL; \
} \
__ptr; \
})
#define CEPH_DATA(_name, _data, _data_count) \
proxy_##_name##_##_data##_t _data; \
struct iovec _data##_iov[_data_count + 1]; \
int32_t _data##_count = 0; \
CEPH_BUFF_ADD(_data, &_data, sizeof(_data))
#define CEPH_REQ(_name, _req, _req_count, _ans, _ans_count) \
CEPH_DATA(_name, _req, _req_count); \
CEPH_DATA(_name, _ans, _ans_count)
#define CEPH_CALL(_sd, _op, _req, _ans) \
proxy_link_request((_sd), _op, _req##_iov, _req##_count, _ans##_iov, \
_ans##_count)
#define CEPH_RET(_sd, _res, _ans) \
proxy_link_ans_send((_sd), (_res), _ans##_iov, _ans##_count)
enum {
LIBCEPHFSD_OP_NULL = 0,
LIBCEPHFSD_OP_VERSION,
LIBCEPHFSD_OP_USERPERM_NEW,
LIBCEPHFSD_OP_USERPERM_DESTROY,
LIBCEPHFSD_OP_CREATE,
LIBCEPHFSD_OP_RELEASE,
LIBCEPHFSD_OP_CONF_READ_FILE,
LIBCEPHFSD_OP_CONF_GET,
LIBCEPHFSD_OP_CONF_SET,
LIBCEPHFSD_OP_INIT,
LIBCEPHFSD_OP_SELECT_FILESYSTEM,
LIBCEPHFSD_OP_MOUNT,
LIBCEPHFSD_OP_UNMOUNT,
LIBCEPHFSD_OP_LL_STATFS,
LIBCEPHFSD_OP_LL_LOOKUP,
LIBCEPHFSD_OP_LL_LOOKUP_INODE,
LIBCEPHFSD_OP_LL_LOOKUP_ROOT,
LIBCEPHFSD_OP_LL_PUT,
LIBCEPHFSD_OP_LL_WALK,
LIBCEPHFSD_OP_CHDIR,
LIBCEPHFSD_OP_GETCWD,
LIBCEPHFSD_OP_READDIR,
LIBCEPHFSD_OP_REWINDDIR,
LIBCEPHFSD_OP_LL_OPEN,
LIBCEPHFSD_OP_LL_CREATE,
LIBCEPHFSD_OP_LL_MKNOD,
LIBCEPHFSD_OP_LL_CLOSE,
LIBCEPHFSD_OP_LL_RENAME,
LIBCEPHFSD_OP_LL_LSEEK,
LIBCEPHFSD_OP_LL_READ,
LIBCEPHFSD_OP_LL_WRITE,
LIBCEPHFSD_OP_LL_LINK,
LIBCEPHFSD_OP_LL_UNLINK,
LIBCEPHFSD_OP_LL_GETATTR,
LIBCEPHFSD_OP_LL_SETATTR,
LIBCEPHFSD_OP_LL_FALLOCATE,
LIBCEPHFSD_OP_LL_FSYNC,
LIBCEPHFSD_OP_LL_LISTXATTR,
LIBCEPHFSD_OP_LL_GETXATTR,
LIBCEPHFSD_OP_LL_SETXATTR,
LIBCEPHFSD_OP_LL_REMOVEXATTR,
LIBCEPHFSD_OP_LL_READLINK,
LIBCEPHFSD_OP_LL_SYMLINK,
LIBCEPHFSD_OP_LL_OPENDIR,
LIBCEPHFSD_OP_LL_MKDIR,
LIBCEPHFSD_OP_LL_RMDIR,
LIBCEPHFSD_OP_LL_RELEASEDIR,
LIBCEPHFSD_OP_MOUNT_PERMS,
LIBCEPHFSD_OP_TOTAL_OPS
};
#define CEPH_TYPE_REQ(_name, _fields...) \
struct _proxy_##_name##_req; \
typedef struct _proxy_##_name##_req proxy_##_name##_req_t; \
struct _proxy_##_name##_req { \
_fields \
}
#define CEPH_TYPE_ANS(_name, _fields...) \
struct _proxy_##_name##_ans; \
typedef struct _proxy_##_name##_ans proxy_##_name##_ans_t; \
struct _proxy_##_name##_ans { \
_fields \
}
#define FIELDS(_fields...) _fields
#define REQ(_fields...) FIELDS(proxy_link_req_t header; _fields)
#define REQ_CMOUNT(_fields...) REQ(uint64_t cmount; _fields)
#define ANS(_fields...) FIELDS(proxy_link_ans_t header; _fields)
#define ANS_CMOUNT(_fields...) ANS(uint64_t cmount; _fields)
#define CEPH_TYPE(_name, _req, _ans) \
CEPH_TYPE_REQ(_name, _req); \
CEPH_TYPE_ANS(_name, _ans)
/* Declaration of types used to transder requests and answers. */
CEPH_TYPE(hello, FIELDS(uint32_t id;), FIELDS(int16_t major; int16_t minor;));
CEPH_TYPE(ceph_version, REQ(),
ANS(int32_t major; int32_t minor; int32_t patch; int16_t text;));
CEPH_TYPE(ceph_userperm_new, REQ(uint32_t uid; uint32_t gid; uint32_t groups;),
ANS(uint64_t userperm;));
CEPH_TYPE(ceph_userperm_destroy, REQ(uint64_t userperm;), ANS());
CEPH_TYPE(ceph_create, REQ(int16_t id;), ANS_CMOUNT());
CEPH_TYPE(ceph_release, REQ_CMOUNT(), ANS());
CEPH_TYPE(ceph_conf_read_file, REQ_CMOUNT(uint16_t path;), ANS());
CEPH_TYPE(ceph_conf_get, REQ_CMOUNT(uint32_t size; uint16_t option;),
ANS(uint16_t value;));
CEPH_TYPE(ceph_conf_set, REQ_CMOUNT(uint16_t option; uint16_t value;), ANS());
CEPH_TYPE(ceph_init, REQ_CMOUNT(), ANS());
CEPH_TYPE(ceph_select_filesystem, REQ_CMOUNT(uint16_t fs;), ANS());
CEPH_TYPE(ceph_mount, REQ_CMOUNT(uint16_t root;), ANS());
CEPH_TYPE(ceph_unmount, REQ_CMOUNT(), ANS());
CEPH_TYPE(ceph_ll_statfs, REQ_CMOUNT(uint64_t inode;), ANS());
CEPH_TYPE(ceph_ll_lookup,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; uint32_t want;
uint32_t flags; uint16_t name;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_lookup_inode, REQ_CMOUNT(struct inodeno_t ino;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_lookup_root, REQ_CMOUNT(), ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_put, REQ_CMOUNT(uint64_t inode;), ANS());
CEPH_TYPE(ceph_ll_walk,
REQ_CMOUNT(uint64_t userperm; uint32_t want; uint32_t flags;
uint16_t path;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_chdir, REQ_CMOUNT(uint16_t path;), ANS());
CEPH_TYPE(ceph_getcwd, REQ_CMOUNT(), ANS(uint16_t path;));
CEPH_TYPE(ceph_readdir, REQ_CMOUNT(uint64_t dir;), ANS(bool eod;));
CEPH_TYPE(ceph_rewinddir, REQ_CMOUNT(uint64_t dir;), ANS());
CEPH_TYPE(ceph_ll_open,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; int32_t flags;),
ANS(uint64_t fh;));
CEPH_TYPE(ceph_ll_create,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; mode_t mode;
int32_t oflags; uint32_t want; uint32_t flags;
uint16_t name;),
ANS(uint64_t inode; uint64_t fh;));
CEPH_TYPE(ceph_ll_mknod,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; mode_t mode;
dev_t rdev; uint32_t want; uint32_t flags; uint16_t name;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_close, REQ_CMOUNT(uint64_t fh;), ANS());
CEPH_TYPE(ceph_ll_rename,
REQ_CMOUNT(uint64_t userperm; uint64_t old_parent;
uint64_t new_parent; uint16_t old_name;
uint16_t new_name;),
ANS());
CEPH_TYPE(ceph_ll_lseek, REQ_CMOUNT(uint64_t fh; off_t offset; int32_t whence;),
ANS(off_t offset;));
CEPH_TYPE(ceph_ll_read, REQ_CMOUNT(uint64_t fh; int64_t offset; uint64_t len;),
ANS());
CEPH_TYPE(ceph_ll_write, REQ_CMOUNT(uint64_t fh; int64_t offset; uint64_t len;),
ANS());
CEPH_TYPE(ceph_ll_link,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; uint64_t parent;
uint16_t name;),
ANS());
CEPH_TYPE(ceph_ll_unlink,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; uint16_t name;),
ANS());
CEPH_TYPE(ceph_ll_getattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; uint32_t want;
uint32_t flags;),
ANS());
CEPH_TYPE(ceph_ll_setattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; int32_t mask;), ANS());
CEPH_TYPE(ceph_ll_fallocate,
REQ_CMOUNT(uint64_t fh; int64_t offset; int64_t length;
int32_t mode;),
ANS());
CEPH_TYPE(ceph_ll_fsync, REQ_CMOUNT(uint64_t fh; int32_t dataonly;), ANS());
CEPH_TYPE(ceph_ll_listxattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; size_t size;),
ANS(size_t size;));
CEPH_TYPE(ceph_ll_getxattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; size_t size;
uint16_t name;),
ANS());
CEPH_TYPE(ceph_ll_setxattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; size_t size;
int32_t flags; uint16_t name;),
ANS());
CEPH_TYPE(ceph_ll_removexattr,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; uint16_t name;), ANS());
CEPH_TYPE(ceph_ll_readlink,
REQ_CMOUNT(uint64_t userperm; uint64_t inode; size_t size;), ANS());
CEPH_TYPE(ceph_ll_symlink,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; uint32_t want;
uint32_t flags; uint16_t name; uint16_t target;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_opendir, REQ_CMOUNT(uint64_t userperm; uint64_t inode;),
ANS(uint64_t dir;));
CEPH_TYPE(ceph_ll_mkdir,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; mode_t mode;
uint32_t want; uint32_t flags; uint16_t name;),
ANS(uint64_t inode;));
CEPH_TYPE(ceph_ll_rmdir,
REQ_CMOUNT(uint64_t userperm; uint64_t parent; uint16_t name;),
ANS());
CEPH_TYPE(ceph_ll_releasedir, REQ_CMOUNT(uint64_t dir;), ANS());
CEPH_TYPE(ceph_mount_perms, REQ_CMOUNT(), ANS(uint64_t userperm;));
typedef union _proxy_req {
proxy_link_req_t header;
proxy_ceph_version_req_t version;
proxy_ceph_userperm_new_req_t userperm_new;
proxy_ceph_userperm_destroy_req_t userperm_destroy;
proxy_ceph_create_req_t create;
proxy_ceph_release_req_t release;
proxy_ceph_conf_read_file_req_t conf_read_file;
proxy_ceph_conf_get_req_t conf_get;
proxy_ceph_conf_set_req_t conf_set;
proxy_ceph_init_req_t init;
proxy_ceph_select_filesystem_req_t select_filesystem;
proxy_ceph_mount_req_t mount;
proxy_ceph_unmount_req_t unmount;
proxy_ceph_ll_statfs_req_t ll_statfs;
proxy_ceph_ll_lookup_req_t ll_lookup;
proxy_ceph_ll_lookup_inode_req_t ll_lookup_inode;
proxy_ceph_ll_lookup_root_req_t ll_lookup_root;
proxy_ceph_ll_put_req_t ll_put;
proxy_ceph_ll_walk_req_t ll_walk;
proxy_ceph_chdir_req_t chdir;
proxy_ceph_getcwd_req_t getcwd;
proxy_ceph_readdir_req_t readdir;
proxy_ceph_rewinddir_req_t rewinddir;
proxy_ceph_ll_open_req_t ll_open;
proxy_ceph_ll_create_req_t ll_create;
proxy_ceph_ll_mknod_req_t ll_mknod;
proxy_ceph_ll_close_req_t ll_close;
proxy_ceph_ll_rename_req_t ll_rename;
proxy_ceph_ll_lseek_req_t ll_lseek;
proxy_ceph_ll_read_req_t ll_read;
proxy_ceph_ll_write_req_t ll_write;
proxy_ceph_ll_link_req_t ll_link;
proxy_ceph_ll_unlink_req_t ll_unlink;
proxy_ceph_ll_getattr_req_t ll_getattr;
proxy_ceph_ll_setattr_req_t ll_setattr;
proxy_ceph_ll_fallocate_req_t ll_fallocate;
proxy_ceph_ll_fsync_req_t ll_fsync;
proxy_ceph_ll_listxattr_req_t ll_listxattr;
proxy_ceph_ll_getxattr_req_t ll_getxattr;
proxy_ceph_ll_setxattr_req_t ll_setxattr;
proxy_ceph_ll_removexattr_req_t ll_removexattr;
proxy_ceph_ll_readlink_req_t ll_readlink;
proxy_ceph_ll_symlink_req_t ll_symlink;
proxy_ceph_ll_opendir_req_t ll_opendir;
proxy_ceph_ll_mkdir_req_t ll_mkdir;
proxy_ceph_ll_rmdir_req_t ll_rmdir;
proxy_ceph_ll_releasedir_req_t ll_releasedir;
proxy_ceph_mount_perms_req_t mount_perms;
} proxy_req_t;
#endif
|