rados.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef CEPH_RADOS_H
  3. #define CEPH_RADOS_H
  4. /*
  5. * Data types for the Ceph distributed object storage layer RADOS
  6. * (Reliable Autonomic Distributed Object Store).
  7. */
  8. #include <linux/ceph/msgr.h>
  9. /*
  10. * fs id
  11. */
  12. struct ceph_fsid {
  13. unsigned char fsid[16];
  14. };
  15. static inline int ceph_fsid_compare(const struct ceph_fsid *a,
  16. const struct ceph_fsid *b)
  17. {
  18. return memcmp(a, b, sizeof(*a));
  19. }
  20. /*
  21. * ino, object, etc.
  22. */
  23. typedef __le64 ceph_snapid_t;
  24. #define CEPH_SNAPDIR ((__u64)(-1)) /* reserved for hidden .snap dir */
  25. #define CEPH_NOSNAP ((__u64)(-2)) /* "head", "live" revision */
  26. #define CEPH_MAXSNAP ((__u64)(-3)) /* largest valid snapid */
  27. struct ceph_timespec {
  28. __le32 tv_sec;
  29. __le32 tv_nsec;
  30. } __attribute__ ((packed));
  31. /*
  32. * object layout - how objects are mapped into PGs
  33. */
  34. #define CEPH_OBJECT_LAYOUT_HASH 1
  35. #define CEPH_OBJECT_LAYOUT_LINEAR 2
  36. #define CEPH_OBJECT_LAYOUT_HASHINO 3
  37. /*
  38. * pg layout -- how PGs are mapped onto (sets of) OSDs
  39. */
  40. #define CEPH_PG_LAYOUT_CRUSH 0
  41. #define CEPH_PG_LAYOUT_HASH 1
  42. #define CEPH_PG_LAYOUT_LINEAR 2
  43. #define CEPH_PG_LAYOUT_HYBRID 3
  44. #define CEPH_PG_MAX_SIZE 32 /* max # osds in a single pg */
  45. /*
  46. * placement group.
  47. * we encode this into one __le64.
  48. */
  49. struct ceph_pg_v1 {
  50. __le16 preferred; /* preferred primary osd */
  51. __le16 ps; /* placement seed */
  52. __le32 pool; /* object pool */
  53. } __attribute__ ((packed));
  54. /*
  55. * pg_pool is a set of pgs storing a pool of objects
  56. *
  57. * pg_num -- base number of pseudorandomly placed pgs
  58. *
  59. * pgp_num -- effective number when calculating pg placement. this
  60. * is used for pg_num increases. new pgs result in data being "split"
  61. * into new pgs. for this to proceed smoothly, new pgs are intiially
  62. * colocated with their parents; that is, pgp_num doesn't increase
  63. * until the new pgs have successfully split. only _then_ are the new
  64. * pgs placed independently.
  65. *
  66. * lpg_num -- localized pg count (per device). replicas are randomly
  67. * selected.
  68. *
  69. * lpgp_num -- as above.
  70. */
  71. #define CEPH_NOPOOL ((__u64) (-1)) /* pool id not defined */
  72. #define CEPH_POOL_TYPE_REP 1
  73. #define CEPH_POOL_TYPE_RAID4 2 /* never implemented */
  74. #define CEPH_POOL_TYPE_EC 3
  75. /*
  76. * stable_mod func is used to control number of placement groups.
  77. * similar to straight-up modulo, but produces a stable mapping as b
  78. * increases over time. b is the number of bins, and bmask is the
  79. * containing power of 2 minus 1.
  80. *
  81. * b <= bmask and bmask=(2**n)-1
  82. * e.g., b=12 -> bmask=15, b=123 -> bmask=127
  83. */
  84. static inline int ceph_stable_mod(int x, int b, int bmask)
  85. {
  86. if ((x & bmask) < b)
  87. return x & bmask;
  88. else
  89. return x & (bmask >> 1);
  90. }
  91. /*
  92. * object layout - how a given object should be stored.
  93. */
  94. struct ceph_object_layout {
  95. struct ceph_pg_v1 ol_pgid; /* raw pg, with _full_ ps precision. */
  96. __le32 ol_stripe_unit; /* for per-object parity, if any */
  97. } __attribute__ ((packed));
  98. /*
  99. * compound epoch+version, used by storage layer to serialize mutations
  100. */
  101. struct ceph_eversion {
  102. __le64 version;
  103. __le32 epoch;
  104. } __attribute__ ((packed));
  105. /*
  106. * osd map bits
  107. */
  108. /* status bits */
  109. #define CEPH_OSD_EXISTS (1<<0)
  110. #define CEPH_OSD_UP (1<<1)
  111. #define CEPH_OSD_AUTOOUT (1<<2) /* osd was automatically marked out */
  112. #define CEPH_OSD_NEW (1<<3) /* osd is new, never marked in */
  113. extern const char *ceph_osd_state_name(int s);
  114. /* osd weights. fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */
  115. #define CEPH_OSD_IN 0x10000
  116. #define CEPH_OSD_OUT 0
  117. /* osd primary-affinity. fixed point value: 0x10000 == baseline */
  118. #define CEPH_OSD_MAX_PRIMARY_AFFINITY 0x10000
  119. #define CEPH_OSD_DEFAULT_PRIMARY_AFFINITY 0x10000
  120. /*
  121. * osd map flag bits
  122. */
  123. #define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC),
  124. not set since ~luminous */
  125. #define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC),
  126. not set since ~luminous */
  127. #define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */
  128. #define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */
  129. #define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */
  130. #define CEPH_OSDMAP_NOUP (1<<5) /* block osd boot */
  131. #define CEPH_OSDMAP_NODOWN (1<<6) /* block osd mark-down/failure */
  132. #define CEPH_OSDMAP_NOOUT (1<<7) /* block osd auto mark-out */
  133. #define CEPH_OSDMAP_NOIN (1<<8) /* block osd auto mark-in */
  134. #define CEPH_OSDMAP_NOBACKFILL (1<<9) /* block osd backfill */
  135. #define CEPH_OSDMAP_NORECOVER (1<<10) /* block osd recovery and backfill */
  136. #define CEPH_OSDMAP_NOSCRUB (1<<11) /* block periodic scrub */
  137. #define CEPH_OSDMAP_NODEEP_SCRUB (1<<12) /* block periodic deep-scrub */
  138. #define CEPH_OSDMAP_NOTIERAGENT (1<<13) /* disable tiering agent */
  139. #define CEPH_OSDMAP_NOREBALANCE (1<<14) /* block osd backfill unless pg is degraded */
  140. #define CEPH_OSDMAP_SORTBITWISE (1<<15) /* use bitwise hobject_t sort */
  141. #define CEPH_OSDMAP_REQUIRE_JEWEL (1<<16) /* require jewel for booting osds */
  142. #define CEPH_OSDMAP_REQUIRE_KRAKEN (1<<17) /* require kraken for booting osds */
  143. #define CEPH_OSDMAP_REQUIRE_LUMINOUS (1<<18) /* require l for booting osds */
  144. #define CEPH_OSDMAP_RECOVERY_DELETES (1<<19) /* deletes performed during recovery instead of peering */
  145. /*
  146. * The error code to return when an OSD can't handle a write
  147. * because it is too large.
  148. */
  149. #define OSD_WRITETOOBIG EMSGSIZE
  150. /*
  151. * osd ops
  152. *
  153. * WARNING: do not use these op codes directly. Use the helpers
  154. * defined below instead. In certain cases, op code behavior was
  155. * redefined, resulting in special-cases in the helpers.
  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_CACHE 0x8000
  163. #define CEPH_OSD_OP_TYPE 0x0f00
  164. #define CEPH_OSD_OP_TYPE_LOCK 0x0100
  165. #define CEPH_OSD_OP_TYPE_DATA 0x0200
  166. #define CEPH_OSD_OP_TYPE_ATTR 0x0300
  167. #define CEPH_OSD_OP_TYPE_EXEC 0x0400
  168. #define CEPH_OSD_OP_TYPE_PG 0x0500
  169. #define CEPH_OSD_OP_TYPE_MULTI 0x0600 /* multiobject */
  170. #define __CEPH_OSD_OP1(mode, nr) \
  171. (CEPH_OSD_OP_MODE_##mode | (nr))
  172. #define __CEPH_OSD_OP(mode, type, nr) \
  173. (CEPH_OSD_OP_MODE_##mode | CEPH_OSD_OP_TYPE_##type | (nr))
  174. #define __CEPH_FORALL_OSD_OPS(f) \
  175. /** data **/ \
  176. /* read */ \
  177. f(READ, __CEPH_OSD_OP(RD, DATA, 1), "read") \
  178. f(STAT, __CEPH_OSD_OP(RD, DATA, 2), "stat") \
  179. f(MAPEXT, __CEPH_OSD_OP(RD, DATA, 3), "mapext") \
  180. \
  181. /* fancy read */ \
  182. f(MASKTRUNC, __CEPH_OSD_OP(RD, DATA, 4), "masktrunc") \
  183. f(SPARSE_READ, __CEPH_OSD_OP(RD, DATA, 5), "sparse-read") \
  184. \
  185. f(NOTIFY, __CEPH_OSD_OP(RD, DATA, 6), "notify") \
  186. f(NOTIFY_ACK, __CEPH_OSD_OP(RD, DATA, 7), "notify-ack") \
  187. \
  188. /* versioning */ \
  189. f(ASSERT_VER, __CEPH_OSD_OP(RD, DATA, 8), "assert-version") \
  190. \
  191. f(LIST_WATCHERS, __CEPH_OSD_OP(RD, DATA, 9), "list-watchers") \
  192. \
  193. f(LIST_SNAPS, __CEPH_OSD_OP(RD, DATA, 10), "list-snaps") \
  194. \
  195. /* sync */ \
  196. f(SYNC_READ, __CEPH_OSD_OP(RD, DATA, 11), "sync_read") \
  197. \
  198. /* write */ \
  199. f(WRITE, __CEPH_OSD_OP(WR, DATA, 1), "write") \
  200. f(WRITEFULL, __CEPH_OSD_OP(WR, DATA, 2), "writefull") \
  201. f(TRUNCATE, __CEPH_OSD_OP(WR, DATA, 3), "truncate") \
  202. f(ZERO, __CEPH_OSD_OP(WR, DATA, 4), "zero") \
  203. f(DELETE, __CEPH_OSD_OP(WR, DATA, 5), "delete") \
  204. \
  205. /* fancy write */ \
  206. f(APPEND, __CEPH_OSD_OP(WR, DATA, 6), "append") \
  207. f(SETTRUNC, __CEPH_OSD_OP(WR, DATA, 8), "settrunc") \
  208. f(TRIMTRUNC, __CEPH_OSD_OP(WR, DATA, 9), "trimtrunc") \
  209. \
  210. f(TMAPUP, __CEPH_OSD_OP(RMW, DATA, 10), "tmapup") \
  211. f(TMAPPUT, __CEPH_OSD_OP(WR, DATA, 11), "tmapput") \
  212. f(TMAPGET, __CEPH_OSD_OP(RD, DATA, 12), "tmapget") \
  213. \
  214. f(CREATE, __CEPH_OSD_OP(WR, DATA, 13), "create") \
  215. f(ROLLBACK, __CEPH_OSD_OP(WR, DATA, 14), "rollback") \
  216. \
  217. f(WATCH, __CEPH_OSD_OP(WR, DATA, 15), "watch") \
  218. \
  219. /* omap */ \
  220. f(OMAPGETKEYS, __CEPH_OSD_OP(RD, DATA, 17), "omap-get-keys") \
  221. f(OMAPGETVALS, __CEPH_OSD_OP(RD, DATA, 18), "omap-get-vals") \
  222. f(OMAPGETHEADER, __CEPH_OSD_OP(RD, DATA, 19), "omap-get-header") \
  223. f(OMAPGETVALSBYKEYS, __CEPH_OSD_OP(RD, DATA, 20), "omap-get-vals-by-keys") \
  224. f(OMAPSETVALS, __CEPH_OSD_OP(WR, DATA, 21), "omap-set-vals") \
  225. f(OMAPSETHEADER, __CEPH_OSD_OP(WR, DATA, 22), "omap-set-header") \
  226. f(OMAPCLEAR, __CEPH_OSD_OP(WR, DATA, 23), "omap-clear") \
  227. f(OMAPRMKEYS, __CEPH_OSD_OP(WR, DATA, 24), "omap-rm-keys") \
  228. f(OMAP_CMP, __CEPH_OSD_OP(RD, DATA, 25), "omap-cmp") \
  229. \
  230. /* tiering */ \
  231. f(COPY_FROM, __CEPH_OSD_OP(WR, DATA, 26), "copy-from") \
  232. f(COPY_FROM2, __CEPH_OSD_OP(WR, DATA, 45), "copy-from2") \
  233. f(COPY_GET_CLASSIC, __CEPH_OSD_OP(RD, DATA, 27), "copy-get-classic") \
  234. f(UNDIRTY, __CEPH_OSD_OP(WR, DATA, 28), "undirty") \
  235. f(ISDIRTY, __CEPH_OSD_OP(RD, DATA, 29), "isdirty") \
  236. f(COPY_GET, __CEPH_OSD_OP(RD, DATA, 30), "copy-get") \
  237. f(CACHE_FLUSH, __CEPH_OSD_OP(CACHE, DATA, 31), "cache-flush") \
  238. f(CACHE_EVICT, __CEPH_OSD_OP(CACHE, DATA, 32), "cache-evict") \
  239. f(CACHE_TRY_FLUSH, __CEPH_OSD_OP(CACHE, DATA, 33), "cache-try-flush") \
  240. \
  241. /* convert tmap to omap */ \
  242. f(TMAP2OMAP, __CEPH_OSD_OP(RMW, DATA, 34), "tmap2omap") \
  243. \
  244. /* hints */ \
  245. f(SETALLOCHINT, __CEPH_OSD_OP(WR, DATA, 35), "set-alloc-hint") \
  246. \
  247. /** multi **/ \
  248. f(CLONERANGE, __CEPH_OSD_OP(WR, MULTI, 1), "clonerange") \
  249. f(ASSERT_SRC_VERSION, __CEPH_OSD_OP(RD, MULTI, 2), "assert-src-version") \
  250. f(SRC_CMPXATTR, __CEPH_OSD_OP(RD, MULTI, 3), "src-cmpxattr") \
  251. \
  252. /** attrs **/ \
  253. /* read */ \
  254. f(GETXATTR, __CEPH_OSD_OP(RD, ATTR, 1), "getxattr") \
  255. f(GETXATTRS, __CEPH_OSD_OP(RD, ATTR, 2), "getxattrs") \
  256. f(CMPXATTR, __CEPH_OSD_OP(RD, ATTR, 3), "cmpxattr") \
  257. \
  258. /* write */ \
  259. f(SETXATTR, __CEPH_OSD_OP(WR, ATTR, 1), "setxattr") \
  260. f(SETXATTRS, __CEPH_OSD_OP(WR, ATTR, 2), "setxattrs") \
  261. f(RESETXATTRS, __CEPH_OSD_OP(WR, ATTR, 3), "resetxattrs") \
  262. f(RMXATTR, __CEPH_OSD_OP(WR, ATTR, 4), "rmxattr") \
  263. \
  264. /** subop **/ \
  265. f(PULL, __CEPH_OSD_OP1(SUB, 1), "pull") \
  266. f(PUSH, __CEPH_OSD_OP1(SUB, 2), "push") \
  267. f(BALANCEREADS, __CEPH_OSD_OP1(SUB, 3), "balance-reads") \
  268. f(UNBALANCEREADS, __CEPH_OSD_OP1(SUB, 4), "unbalance-reads") \
  269. f(SCRUB, __CEPH_OSD_OP1(SUB, 5), "scrub") \
  270. f(SCRUB_RESERVE, __CEPH_OSD_OP1(SUB, 6), "scrub-reserve") \
  271. f(SCRUB_UNRESERVE, __CEPH_OSD_OP1(SUB, 7), "scrub-unreserve") \
  272. f(SCRUB_STOP, __CEPH_OSD_OP1(SUB, 8), "scrub-stop") \
  273. f(SCRUB_MAP, __CEPH_OSD_OP1(SUB, 9), "scrub-map") \
  274. \
  275. /** lock **/ \
  276. f(WRLOCK, __CEPH_OSD_OP(WR, LOCK, 1), "wrlock") \
  277. f(WRUNLOCK, __CEPH_OSD_OP(WR, LOCK, 2), "wrunlock") \
  278. f(RDLOCK, __CEPH_OSD_OP(WR, LOCK, 3), "rdlock") \
  279. f(RDUNLOCK, __CEPH_OSD_OP(WR, LOCK, 4), "rdunlock") \
  280. f(UPLOCK, __CEPH_OSD_OP(WR, LOCK, 5), "uplock") \
  281. f(DNLOCK, __CEPH_OSD_OP(WR, LOCK, 6), "dnlock") \
  282. \
  283. /** exec **/ \
  284. /* note: the RD bit here is wrong; see special-case below in helper */ \
  285. f(CALL, __CEPH_OSD_OP(RD, EXEC, 1), "call") \
  286. \
  287. /** pg **/ \
  288. f(PGLS, __CEPH_OSD_OP(RD, PG, 1), "pgls") \
  289. f(PGLS_FILTER, __CEPH_OSD_OP(RD, PG, 2), "pgls-filter") \
  290. f(PG_HITSET_LS, __CEPH_OSD_OP(RD, PG, 3), "pg-hitset-ls") \
  291. f(PG_HITSET_GET, __CEPH_OSD_OP(RD, PG, 4), "pg-hitset-get")
  292. enum {
  293. #define GENERATE_ENUM_ENTRY(op, opcode, str) CEPH_OSD_OP_##op = (opcode),
  294. __CEPH_FORALL_OSD_OPS(GENERATE_ENUM_ENTRY)
  295. #undef GENERATE_ENUM_ENTRY
  296. };
  297. static inline int ceph_osd_op_type_lock(int op)
  298. {
  299. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_LOCK;
  300. }
  301. static inline int ceph_osd_op_type_data(int op)
  302. {
  303. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_DATA;
  304. }
  305. static inline int ceph_osd_op_type_attr(int op)
  306. {
  307. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_ATTR;
  308. }
  309. static inline int ceph_osd_op_type_exec(int op)
  310. {
  311. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_EXEC;
  312. }
  313. static inline int ceph_osd_op_type_pg(int op)
  314. {
  315. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_PG;
  316. }
  317. static inline int ceph_osd_op_type_multi(int op)
  318. {
  319. return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_MULTI;
  320. }
  321. static inline int ceph_osd_op_mode_subop(int op)
  322. {
  323. return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_SUB;
  324. }
  325. static inline int ceph_osd_op_mode_read(int op)
  326. {
  327. return (op & CEPH_OSD_OP_MODE_RD) &&
  328. op != CEPH_OSD_OP_CALL;
  329. }
  330. static inline int ceph_osd_op_mode_modify(int op)
  331. {
  332. return op & CEPH_OSD_OP_MODE_WR;
  333. }
  334. /*
  335. * note that the following tmap stuff is also defined in the ceph librados.h
  336. * any modification here needs to be updated there
  337. */
  338. #define CEPH_OSD_TMAP_HDR 'h'
  339. #define CEPH_OSD_TMAP_SET 's'
  340. #define CEPH_OSD_TMAP_CREATE 'c' /* create key */
  341. #define CEPH_OSD_TMAP_RM 'r'
  342. #define CEPH_OSD_TMAP_RMSLOPPY 'R'
  343. extern const char *ceph_osd_op_name(int op);
  344. /*
  345. * osd op flags
  346. *
  347. * An op may be READ, WRITE, or READ|WRITE.
  348. */
  349. enum {
  350. CEPH_OSD_FLAG_ACK = 0x0001, /* want (or is) "ack" ack */
  351. CEPH_OSD_FLAG_ONNVRAM = 0x0002, /* want (or is) "onnvram" ack */
  352. CEPH_OSD_FLAG_ONDISK = 0x0004, /* want (or is) "ondisk" ack */
  353. CEPH_OSD_FLAG_RETRY = 0x0008, /* resend attempt */
  354. CEPH_OSD_FLAG_READ = 0x0010, /* op may read */
  355. CEPH_OSD_FLAG_WRITE = 0x0020, /* op may write */
  356. CEPH_OSD_FLAG_ORDERSNAP = 0x0040, /* EOLDSNAP if snapc is out of order */
  357. CEPH_OSD_FLAG_PEERSTAT_OLD = 0x0080, /* DEPRECATED msg includes osd_peer_stat */
  358. CEPH_OSD_FLAG_BALANCE_READS = 0x0100,
  359. CEPH_OSD_FLAG_PARALLELEXEC = 0x0200, /* execute op in parallel */
  360. CEPH_OSD_FLAG_PGOP = 0x0400, /* pg op, no object */
  361. CEPH_OSD_FLAG_EXEC = 0x0800, /* op may exec */
  362. CEPH_OSD_FLAG_EXEC_PUBLIC = 0x1000, /* DEPRECATED op may exec (public) */
  363. CEPH_OSD_FLAG_LOCALIZE_READS = 0x2000, /* read from nearby replica, if any */
  364. CEPH_OSD_FLAG_RWORDERED = 0x4000, /* order wrt concurrent reads */
  365. CEPH_OSD_FLAG_IGNORE_CACHE = 0x8000, /* ignore cache logic */
  366. CEPH_OSD_FLAG_SKIPRWLOCKS = 0x10000, /* skip rw locks */
  367. CEPH_OSD_FLAG_IGNORE_OVERLAY = 0x20000, /* ignore pool overlay */
  368. CEPH_OSD_FLAG_FLUSH = 0x40000, /* this is part of flush */
  369. CEPH_OSD_FLAG_MAP_SNAP_CLONE = 0x80000, /* map snap direct to clone id */
  370. CEPH_OSD_FLAG_ENFORCE_SNAPC = 0x100000, /* use snapc provided even if
  371. pool uses pool snaps */
  372. CEPH_OSD_FLAG_REDIRECTED = 0x200000, /* op has been redirected */
  373. CEPH_OSD_FLAG_KNOWN_REDIR = 0x400000, /* redirect bit is authoritative */
  374. CEPH_OSD_FLAG_FULL_TRY = 0x800000, /* try op despite full flag */
  375. CEPH_OSD_FLAG_FULL_FORCE = 0x1000000, /* force op despite full flag */
  376. };
  377. enum {
  378. CEPH_OSD_OP_FLAG_EXCL = 1, /* EXCL object create */
  379. CEPH_OSD_OP_FLAG_FAILOK = 2, /* continue despite failure */
  380. CEPH_OSD_OP_FLAG_FADVISE_RANDOM = 0x4, /* the op is random */
  381. CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL = 0x8, /* the op is sequential */
  382. CEPH_OSD_OP_FLAG_FADVISE_WILLNEED = 0x10,/* data will be accessed in
  383. the near future */
  384. CEPH_OSD_OP_FLAG_FADVISE_DONTNEED = 0x20,/* data will not be accessed
  385. in the near future */
  386. CEPH_OSD_OP_FLAG_FADVISE_NOCACHE = 0x40,/* data will be accessed only
  387. once by this client */
  388. };
  389. #define EOLDSNAPC ERESTART /* ORDERSNAP flag set; writer has old snapc*/
  390. #define EBLOCKLISTED ESHUTDOWN /* blocklisted */
  391. /* xattr comparison */
  392. enum {
  393. CEPH_OSD_CMPXATTR_OP_NOP = 0,
  394. CEPH_OSD_CMPXATTR_OP_EQ = 1,
  395. CEPH_OSD_CMPXATTR_OP_NE = 2,
  396. CEPH_OSD_CMPXATTR_OP_GT = 3,
  397. CEPH_OSD_CMPXATTR_OP_GTE = 4,
  398. CEPH_OSD_CMPXATTR_OP_LT = 5,
  399. CEPH_OSD_CMPXATTR_OP_LTE = 6
  400. };
  401. enum {
  402. CEPH_OSD_CMPXATTR_MODE_STRING = 1,
  403. CEPH_OSD_CMPXATTR_MODE_U64 = 2
  404. };
  405. enum {
  406. CEPH_OSD_COPY_FROM_FLAG_FLUSH = 1, /* part of a flush operation */
  407. CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY = 2, /* ignore pool overlay */
  408. CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE = 4, /* ignore osd cache logic */
  409. CEPH_OSD_COPY_FROM_FLAG_MAP_SNAP_CLONE = 8, /* map snap direct to
  410. * cloneid */
  411. CEPH_OSD_COPY_FROM_FLAG_RWORDERED = 16, /* order with write */
  412. CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ = 32, /* send truncate_{seq,size} */
  413. };
  414. enum {
  415. CEPH_OSD_WATCH_OP_UNWATCH = 0,
  416. CEPH_OSD_WATCH_OP_LEGACY_WATCH = 1,
  417. /* note: use only ODD ids to prevent pre-giant code from
  418. interpreting the op as UNWATCH */
  419. CEPH_OSD_WATCH_OP_WATCH = 3,
  420. CEPH_OSD_WATCH_OP_RECONNECT = 5,
  421. CEPH_OSD_WATCH_OP_PING = 7,
  422. };
  423. const char *ceph_osd_watch_op_name(int o);
  424. enum {
  425. CEPH_OSD_ALLOC_HINT_FLAG_SEQUENTIAL_WRITE = 1,
  426. CEPH_OSD_ALLOC_HINT_FLAG_RANDOM_WRITE = 2,
  427. CEPH_OSD_ALLOC_HINT_FLAG_SEQUENTIAL_READ = 4,
  428. CEPH_OSD_ALLOC_HINT_FLAG_RANDOM_READ = 8,
  429. CEPH_OSD_ALLOC_HINT_FLAG_APPEND_ONLY = 16,
  430. CEPH_OSD_ALLOC_HINT_FLAG_IMMUTABLE = 32,
  431. CEPH_OSD_ALLOC_HINT_FLAG_SHORTLIVED = 64,
  432. CEPH_OSD_ALLOC_HINT_FLAG_LONGLIVED = 128,
  433. CEPH_OSD_ALLOC_HINT_FLAG_COMPRESSIBLE = 256,
  434. CEPH_OSD_ALLOC_HINT_FLAG_INCOMPRESSIBLE = 512,
  435. };
  436. enum {
  437. CEPH_OSD_BACKOFF_OP_BLOCK = 1,
  438. CEPH_OSD_BACKOFF_OP_ACK_BLOCK = 2,
  439. CEPH_OSD_BACKOFF_OP_UNBLOCK = 3,
  440. };
  441. /*
  442. * an individual object operation. each may be accompanied by some data
  443. * payload
  444. */
  445. struct ceph_osd_op {
  446. __le16 op; /* CEPH_OSD_OP_* */
  447. __le32 flags; /* CEPH_OSD_OP_FLAG_* */
  448. union {
  449. struct {
  450. __le64 offset, length;
  451. __le64 truncate_size;
  452. __le32 truncate_seq;
  453. } __attribute__ ((packed)) extent;
  454. struct {
  455. __le32 name_len;
  456. __le32 value_len;
  457. __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
  458. __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
  459. } __attribute__ ((packed)) xattr;
  460. struct {
  461. __u8 class_len;
  462. __u8 method_len;
  463. __u8 argc;
  464. __le32 indata_len;
  465. } __attribute__ ((packed)) cls;
  466. struct {
  467. __le64 cookie, count;
  468. } __attribute__ ((packed)) pgls;
  469. struct {
  470. __le64 snapid;
  471. } __attribute__ ((packed)) snap;
  472. struct {
  473. __le64 cookie;
  474. __le64 ver; /* no longer used */
  475. __u8 op; /* CEPH_OSD_WATCH_OP_* */
  476. __le32 gen; /* registration generation */
  477. } __attribute__ ((packed)) watch;
  478. struct {
  479. __le64 cookie;
  480. } __attribute__ ((packed)) notify;
  481. struct {
  482. __le64 offset, length;
  483. __le64 src_offset;
  484. } __attribute__ ((packed)) clonerange;
  485. struct {
  486. __le64 expected_object_size;
  487. __le64 expected_write_size;
  488. __le32 flags; /* CEPH_OSD_OP_ALLOC_HINT_FLAG_* */
  489. } __attribute__ ((packed)) alloc_hint;
  490. struct {
  491. __le64 snapid;
  492. __le64 src_version;
  493. __u8 flags; /* CEPH_OSD_COPY_FROM_FLAG_* */
  494. /*
  495. * CEPH_OSD_OP_FLAG_FADVISE_*: fadvise flags
  496. * for src object, flags for dest object are in
  497. * ceph_osd_op::flags.
  498. */
  499. __le32 src_fadvise_flags;
  500. } __attribute__ ((packed)) copy_from;
  501. };
  502. __le32 payload_len;
  503. } __attribute__ ((packed));
  504. #endif