ceph: on-wire types
[pandora-kernel.git] / fs / ceph / rados.h
1 #ifndef __RADOS_H
2 #define __RADOS_H
3
4 /*
5  * Data types for the Ceph distributed object storage layer RADOS
6  * (Reliable Autonomic Distributed Object Store).
7  */
8
9 #include "msgr.h"
10
11 /*
12  * fs id
13  */
14 struct ceph_fsid {
15         unsigned char fsid[16];
16 };
17
18 static inline int ceph_fsid_compare(const struct ceph_fsid *a,
19                                     const struct ceph_fsid *b)
20 {
21         return memcmp(a, b, sizeof(*a));
22 }
23
24 /*
25  * ino, object, etc.
26  */
27 typedef __le64 ceph_snapid_t;
28 #define CEPH_SNAPDIR ((__u64)(-1))  /* reserved for hidden .snap dir */
29 #define CEPH_NOSNAP  ((__u64)(-2))  /* "head", "live" revision */
30 #define CEPH_MAXSNAP ((__u64)(-3))  /* largest valid snapid */
31
32 struct ceph_timespec {
33         __le32 tv_sec;
34         __le32 tv_nsec;
35 } __attribute__ ((packed));
36
37
38 /*
39  * object layout - how objects are mapped into PGs
40  */
41 #define CEPH_OBJECT_LAYOUT_HASH     1
42 #define CEPH_OBJECT_LAYOUT_LINEAR   2
43 #define CEPH_OBJECT_LAYOUT_HASHINO  3
44
45 /*
46  * pg layout -- how PGs are mapped onto (sets of) OSDs
47  */
48 #define CEPH_PG_LAYOUT_CRUSH  0
49 #define CEPH_PG_LAYOUT_HASH   1
50 #define CEPH_PG_LAYOUT_LINEAR 2
51 #define CEPH_PG_LAYOUT_HYBRID 3
52
53
54 /*
55  * placement group.
56  * we encode this into one __le64.
57  */
58 union ceph_pg {
59         __u64 pg64;
60         struct {
61                 __s16 preferred; /* preferred primary osd */
62                 __u16 ps;        /* placement seed */
63                 __u32 pool;      /* object pool */
64         } __attribute__ ((packed)) pg;
65 } __attribute__ ((packed));
66
67 /*
68  * pg_pool is a set of pgs storing a pool of objects
69  *
70  *  pg_num -- base number of pseudorandomly placed pgs
71  *
72  *  pgp_num -- effective number when calculating pg placement.  this
73  * is used for pg_num increases.  new pgs result in data being "split"
74  * into new pgs.  for this to proceed smoothly, new pgs are intiially
75  * colocated with their parents; that is, pgp_num doesn't increase
76  * until the new pgs have successfully split.  only _then_ are the new
77  * pgs placed independently.
78  *
79  *  lpg_num -- localized pg count (per device).  replicas are randomly
80  * selected.
81  *
82  *  lpgp_num -- as above.
83  */
84 #define CEPH_PG_TYPE_REP     1
85 #define CEPH_PG_TYPE_RAID4   2
86 struct ceph_pg_pool {
87         __u8 type;                /* CEPH_PG_TYPE_* */
88         __u8 size;                /* number of osds in each pg */
89         __u8 crush_ruleset;       /* crush placement rule */
90         __le32 pg_num, pgp_num;   /* number of pg's */
91         __le32 lpg_num, lpgp_num; /* number of localized pg's */
92         __le32 last_change;       /* most recent epoch changed */
93         __le64 snap_seq;          /* seq for per-pool snapshot */
94         __le32 snap_epoch;        /* epoch of last snap */
95         __le32 num_snaps;
96         __le32 num_removed_snap_intervals;
97 } __attribute__ ((packed));
98
99 /*
100  * stable_mod func is used to control number of placement groups.
101  * similar to straight-up modulo, but produces a stable mapping as b
102  * increases over time.  b is the number of bins, and bmask is the
103  * containing power of 2 minus 1.
104  *
105  * b <= bmask and bmask=(2**n)-1
106  * e.g., b=12 -> bmask=15, b=123 -> bmask=127
107  */
108 static inline int ceph_stable_mod(int x, int b, int bmask)
109 {
110         if ((x & bmask) < b)
111                 return x & bmask;
112         else
113                 return x & (bmask >> 1);
114 }
115
116 /*
117  * object layout - how a given object should be stored.
118  */
119 struct ceph_object_layout {
120         __le64 ol_pgid;           /* raw pg, with _full_ ps precision. */
121         __le32 ol_stripe_unit;    /* for per-object parity, if any */
122 } __attribute__ ((packed));
123
124 /*
125  * compound epoch+version, used by storage layer to serialize mutations
126  */
127 struct ceph_eversion {
128         __le32 epoch;
129         __le64 version;
130 } __attribute__ ((packed));
131
132 /*
133  * osd map bits
134  */
135
136 /* status bits */
137 #define CEPH_OSD_EXISTS 1
138 #define CEPH_OSD_UP     2
139
140 /* osd weights.  fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */
141 #define CEPH_OSD_IN  0x10000
142 #define CEPH_OSD_OUT 0
143
144
145 /*
146  * osd map flag bits
147  */
148 #define CEPH_OSDMAP_NEARFULL (1<<0)  /* sync writes (near ENOSPC) */
149 #define CEPH_OSDMAP_FULL     (1<<1)  /* no data writes (ENOSPC) */
150 #define CEPH_OSDMAP_PAUSERD  (1<<2)  /* pause all reads */
151 #define CEPH_OSDMAP_PAUSEWR  (1<<3)  /* pause all writes */
152 #define CEPH_OSDMAP_PAUSEREC (1<<4)  /* pause recovery */
153
154 /*
155  * osd ops
156  */
157 #define CEPH_OSD_OP_MODE       0xf000
158 #define CEPH_OSD_OP_MODE_RD    0x1000
159 #define CEPH_OSD_OP_MODE_WR    0x2000
160 #define CEPH_OSD_OP_MODE_RMW   0x3000
161 #define CEPH_OSD_OP_MODE_SUB   0x4000
162 #define CEPH_OSD_OP_MODE_EXEC  0x8000
163
164 #define CEPH_OSD_OP_TYPE       0x0f00
165 #define CEPH_OSD_OP_TYPE_LOCK  0x0100
166 #define CEPH_OSD_OP_TYPE_DATA  0x0200
167 #define CEPH_OSD_OP_TYPE_ATTR  0x0300
168 #define CEPH_OSD_OP_TYPE_EXEC  0x0400
169 #define CEPH_OSD_OP_TYPE_PG    0x0500
170
171 enum {
172         /** data **/
173         /* read */
174         CEPH_OSD_OP_READ      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1,
175         CEPH_OSD_OP_STAT      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2,
176
177         /* fancy read */
178         CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4,
179
180         /* write */
181         CEPH_OSD_OP_WRITE     = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1,
182         CEPH_OSD_OP_WRITEFULL = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 2,
183         CEPH_OSD_OP_TRUNCATE  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 3,
184         CEPH_OSD_OP_ZERO      = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 4,
185         CEPH_OSD_OP_DELETE    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 5,
186
187         /* fancy write */
188         CEPH_OSD_OP_APPEND    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 6,
189         CEPH_OSD_OP_STARTSYNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 7,
190         CEPH_OSD_OP_SETTRUNC  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 8,
191         CEPH_OSD_OP_TRIMTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 9,
192
193         CEPH_OSD_OP_TMAPUP  = CEPH_OSD_OP_MODE_RMW | CEPH_OSD_OP_TYPE_DATA | 10,
194         CEPH_OSD_OP_TMAPPUT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 11,
195         CEPH_OSD_OP_TMAPGET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 12,
196
197         CEPH_OSD_OP_CREATE  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13,
198
199         /** attrs **/
200         /* read */
201         CEPH_OSD_OP_GETXATTR  = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1,
202         CEPH_OSD_OP_GETXATTRS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 2,
203
204         /* write */
205         CEPH_OSD_OP_SETXATTR  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 1,
206         CEPH_OSD_OP_SETXATTRS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 2,
207         CEPH_OSD_OP_RESETXATTRS = CEPH_OSD_OP_MODE_WR|CEPH_OSD_OP_TYPE_ATTR | 3,
208         CEPH_OSD_OP_RMXATTR   = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4,
209
210         /** subop **/
211         CEPH_OSD_OP_PULL           = CEPH_OSD_OP_MODE_SUB | 1,
212         CEPH_OSD_OP_PUSH           = CEPH_OSD_OP_MODE_SUB | 2,
213         CEPH_OSD_OP_BALANCEREADS   = CEPH_OSD_OP_MODE_SUB | 3,
214         CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4,
215         CEPH_OSD_OP_SCRUB          = CEPH_OSD_OP_MODE_SUB | 5,
216
217         /** lock **/
218         CEPH_OSD_OP_WRLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1,
219         CEPH_OSD_OP_WRUNLOCK  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 2,
220         CEPH_OSD_OP_RDLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 3,
221         CEPH_OSD_OP_RDUNLOCK  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 4,
222         CEPH_OSD_OP_UPLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 5,
223         CEPH_OSD_OP_DNLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6,
224
225         /** exec **/
226         CEPH_OSD_OP_CALL    = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1,
227
228         /** pg **/
229         CEPH_OSD_OP_PGLS      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1,
230 };
231
232 static inline int ceph_osd_op_type_lock(int op)
233 {
234         return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_LOCK;
235 }
236 static inline int ceph_osd_op_type_data(int op)
237 {
238         return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_DATA;
239 }
240 static inline int ceph_osd_op_type_attr(int op)
241 {
242         return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_ATTR;
243 }
244 static inline int ceph_osd_op_type_exec(int op)
245 {
246         return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_EXEC;
247 }
248 static inline int ceph_osd_op_type_pg(int op)
249 {
250         return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_PG;
251 }
252
253 static inline int ceph_osd_op_mode_subop(int op)
254 {
255         return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_SUB;
256 }
257 static inline int ceph_osd_op_mode_read(int op)
258 {
259         return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_RD;
260 }
261 static inline int ceph_osd_op_mode_modify(int op)
262 {
263         return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_WR;
264 }
265
266 #define CEPH_OSD_TMAP_HDR 'h'
267 #define CEPH_OSD_TMAP_SET 's'
268 #define CEPH_OSD_TMAP_RM  'r'
269
270 extern const char *ceph_osd_op_name(int op);
271
272
273 /*
274  * osd op flags
275  *
276  * An op may be READ, WRITE, or READ|WRITE.
277  */
278 enum {
279         CEPH_OSD_FLAG_ACK = 1,          /* want (or is) "ack" ack */
280         CEPH_OSD_FLAG_ONNVRAM = 2,      /* want (or is) "onnvram" ack */
281         CEPH_OSD_FLAG_ONDISK = 4,       /* want (or is) "ondisk" ack */
282         CEPH_OSD_FLAG_RETRY = 8,        /* resend attempt */
283         CEPH_OSD_FLAG_READ = 16,        /* op may read */
284         CEPH_OSD_FLAG_WRITE = 32,       /* op may write */
285         CEPH_OSD_FLAG_ORDERSNAP = 64,   /* EOLDSNAP if snapc is out of order */
286         CEPH_OSD_FLAG_PEERSTAT = 128,   /* msg includes osd_peer_stat */
287         CEPH_OSD_FLAG_BALANCE_READS = 256,
288         CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */
289         CEPH_OSD_FLAG_PGOP = 1024,      /* pg op, no object */
290 };
291
292 enum {
293         CEPH_OSD_OP_FLAG_EXCL = 1,      /* EXCL object create */
294 };
295
296 #define EOLDSNAPC    ERESTART  /* ORDERSNAP flag set; writer has old snapc*/
297 #define EBLACKLISTED ESHUTDOWN /* blacklisted */
298
299 /*
300  * an individual object operation.  each may be accompanied by some data
301  * payload
302  */
303 struct ceph_osd_op {
304         __le16 op;           /* CEPH_OSD_OP_* */
305         __le32 flags;        /* CEPH_OSD_FLAG_* */
306         union {
307                 struct {
308                         __le64 offset, length;
309                 } __attribute__ ((packed)) extent;
310                 struct {
311                         __le32 name_len;
312                         __le32 value_len;
313                 } __attribute__ ((packed)) xattr;
314                 struct {
315                         __le64 truncate_size;
316                         __le32 truncate_seq;
317                 } __attribute__ ((packed)) trunc;
318                 struct {
319                         __u8 class_len;
320                         __u8 method_len;
321                         __u8 argc;
322                         __le32 indata_len;
323                 } __attribute__ ((packed)) cls;
324                 struct {
325                         __le64 cookie, count;
326                 } __attribute__ ((packed)) pgls;
327         };
328         __le32 payload_len;
329 } __attribute__ ((packed));
330
331 /*
332  * osd request message header.  each request may include multiple
333  * ceph_osd_op object operations.
334  */
335 struct ceph_osd_request_head {
336         __le64 tid;                        /* transaction id */
337         __le32 client_inc;                 /* client incarnation */
338         struct ceph_object_layout layout;  /* pgid */
339         __le32 osdmap_epoch;               /* client's osdmap epoch */
340
341         __le32 flags;
342
343         struct ceph_timespec mtime;        /* for mutations only */
344         struct ceph_eversion reassert_version; /* if we are replaying op */
345
346         __le32 object_len;     /* length of object name */
347
348         __le64 snapid;         /* snapid to read */
349         __le64 snap_seq;       /* writer's snap context */
350         __le32 num_snaps;
351
352         __le16 num_ops;
353         struct ceph_osd_op ops[];  /* followed by ops[], obj, ticket, snaps */
354 } __attribute__ ((packed));
355
356 struct ceph_osd_reply_head {
357         __le64 tid;                       /* transaction id */
358         __le32 client_inc;                /* client incarnation */
359         __le32 flags;
360         struct ceph_object_layout layout;
361         __le32 osdmap_epoch;
362         struct ceph_eversion reassert_version; /* for replaying uncommitted */
363
364         __le32 result;                    /* result code */
365
366         __le32 object_len;                /* length of object name */
367         __le32 num_ops;
368         struct ceph_osd_op ops[0];  /* ops[], object */
369 } __attribute__ ((packed));
370
371
372 #endif