926 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * ceph_fs.h - Ceph constants and data types to share between kernel and4 * user space.5 *6 * Most types in this file are defined as little-endian, and are7 * primarily intended to describe data structures that pass over the8 * wire or that are stored on disk.9 *10 * LGPL211 */12 13#ifndef CEPH_FS_H14#define CEPH_FS_H15 16#include <linux/ceph/msgr.h>17#include <linux/ceph/rados.h>18 19/*20 * subprotocol versions. when specific messages types or high-level21 * protocols change, bump the affected components. we keep rev22 * internal cluster protocols separately from the public,23 * client-facing protocol.24 */25#define CEPH_OSDC_PROTOCOL 24 /* server/client */26#define CEPH_MDSC_PROTOCOL 32 /* server/client */27#define CEPH_MONC_PROTOCOL 15 /* server/client */28 29 30#define CEPH_INO_ROOT 131#define CEPH_INO_CEPH 2 /* hidden .ceph dir */32#define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */33 34/* arbitrary limit on max # of monitors (cluster of 3 is typical) */35#define CEPH_MAX_MON 3136 37/*38 * legacy ceph_file_layoute39 */40struct ceph_file_layout_legacy {41 /* file -> object mapping */42 __le32 fl_stripe_unit; /* stripe unit, in bytes. must be multiple43 of page size. */44 __le32 fl_stripe_count; /* over this many objects */45 __le32 fl_object_size; /* until objects are this big, then move to46 new objects */47 __le32 fl_cas_hash; /* UNUSED. 0 = none; 1 = sha256 */48 49 /* pg -> disk layout */50 __le32 fl_object_stripe_unit; /* UNUSED. for per-object parity, if any */51 52 /* object -> pg layout */53 __le32 fl_unused; /* unused; used to be preferred primary for pg (-1 for none) */54 __le32 fl_pg_pool; /* namespace, crush ruleset, rep level */55} __attribute__ ((packed));56 57struct ceph_string;58/*59 * ceph_file_layout - describe data layout for a file/inode60 */61struct ceph_file_layout {62 /* file -> object mapping */63 u32 stripe_unit; /* stripe unit, in bytes */64 u32 stripe_count; /* over this many objects */65 u32 object_size; /* until objects are this big */66 s64 pool_id; /* rados pool id */67 struct ceph_string __rcu *pool_ns; /* rados pool namespace */68};69 70extern int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);71extern void ceph_file_layout_from_legacy(struct ceph_file_layout *fl,72 struct ceph_file_layout_legacy *legacy);73extern void ceph_file_layout_to_legacy(struct ceph_file_layout *fl,74 struct ceph_file_layout_legacy *legacy);75 76#define CEPH_MIN_STRIPE_UNIT 6553677 78struct ceph_dir_layout {79 __u8 dl_dir_hash; /* see ceph_hash.h for ids */80 __u8 dl_unused1;81 __u16 dl_unused2;82 __u32 dl_unused3;83} __attribute__ ((packed));84 85/* crypto algorithms */86#define CEPH_CRYPTO_NONE 0x087#define CEPH_CRYPTO_AES 0x188 89#define CEPH_AES_IV "cephsageyudagreg"90 91/* security/authentication protocols */92#define CEPH_AUTH_UNKNOWN 0x093#define CEPH_AUTH_NONE 0x194#define CEPH_AUTH_CEPHX 0x295 96#define CEPH_AUTH_MODE_NONE 097#define CEPH_AUTH_MODE_AUTHORIZER 198#define CEPH_AUTH_MODE_MON 1099 100/* msgr2 protocol modes */101#define CEPH_CON_MODE_UNKNOWN 0x0102#define CEPH_CON_MODE_CRC 0x1103#define CEPH_CON_MODE_SECURE 0x2104 105#define CEPH_AUTH_UID_DEFAULT ((__u64) -1)106 107const char *ceph_auth_proto_name(int proto);108const char *ceph_con_mode_name(int mode);109 110/*********************************************111 * message layer112 */113 114/*115 * message types116 */117 118/* misc */119#define CEPH_MSG_SHUTDOWN 1120#define CEPH_MSG_PING 2121 122/* client <-> monitor */123#define CEPH_MSG_MON_MAP 4124#define CEPH_MSG_MON_GET_MAP 5125#define CEPH_MSG_STATFS 13126#define CEPH_MSG_STATFS_REPLY 14127#define CEPH_MSG_MON_SUBSCRIBE 15128#define CEPH_MSG_MON_SUBSCRIBE_ACK 16129#define CEPH_MSG_AUTH 17130#define CEPH_MSG_AUTH_REPLY 18131#define CEPH_MSG_MON_GET_VERSION 19132#define CEPH_MSG_MON_GET_VERSION_REPLY 20133 134/* client <-> mds */135#define CEPH_MSG_MDS_MAP 21136#define CEPH_MSG_FS_MAP_USER 103137 138#define CEPH_MSG_CLIENT_SESSION 22139#define CEPH_MSG_CLIENT_RECONNECT 23140 141#define CEPH_MSG_CLIENT_REQUEST 24142#define CEPH_MSG_CLIENT_REQUEST_FORWARD 25143#define CEPH_MSG_CLIENT_REPLY 26144#define CEPH_MSG_CLIENT_METRICS 29145#define CEPH_MSG_CLIENT_CAPS 0x310146#define CEPH_MSG_CLIENT_LEASE 0x311147#define CEPH_MSG_CLIENT_SNAP 0x312148#define CEPH_MSG_CLIENT_CAPRELEASE 0x313149#define CEPH_MSG_CLIENT_QUOTA 0x314150 151/* pool ops */152#define CEPH_MSG_POOLOP_REPLY 48153#define CEPH_MSG_POOLOP 49154 155/* mon commands */156#define CEPH_MSG_MON_COMMAND 50157#define CEPH_MSG_MON_COMMAND_ACK 51158 159/* osd */160#define CEPH_MSG_OSD_MAP 41161#define CEPH_MSG_OSD_OP 42162#define CEPH_MSG_OSD_OPREPLY 43163#define CEPH_MSG_WATCH_NOTIFY 44164#define CEPH_MSG_OSD_BACKOFF 61165 166 167/* watch-notify operations */168enum {169 CEPH_WATCH_EVENT_NOTIFY = 1, /* notifying watcher */170 CEPH_WATCH_EVENT_NOTIFY_COMPLETE = 2, /* notifier notified when done */171 CEPH_WATCH_EVENT_DISCONNECT = 3, /* we were disconnected */172};173 174 175struct ceph_mon_request_header {176 __le64 have_version;177 __le16 session_mon;178 __le64 session_mon_tid;179} __attribute__ ((packed));180 181struct ceph_mon_statfs {182 struct ceph_mon_request_header monhdr;183 struct ceph_fsid fsid;184 __u8 contains_data_pool;185 __le64 data_pool;186} __attribute__ ((packed));187 188struct ceph_statfs {189 __le64 kb, kb_used, kb_avail;190 __le64 num_objects;191} __attribute__ ((packed));192 193struct ceph_mon_statfs_reply {194 struct ceph_fsid fsid;195 __le64 version;196 struct ceph_statfs st;197} __attribute__ ((packed));198 199struct ceph_mon_command {200 struct ceph_mon_request_header monhdr;201 struct ceph_fsid fsid;202 __le32 num_strs; /* always 1 */203 __le32 str_len;204 char str[];205} __attribute__ ((packed));206 207struct ceph_osd_getmap {208 struct ceph_mon_request_header monhdr;209 struct ceph_fsid fsid;210 __le32 start;211} __attribute__ ((packed));212 213struct ceph_mds_getmap {214 struct ceph_mon_request_header monhdr;215 struct ceph_fsid fsid;216} __attribute__ ((packed));217 218struct ceph_client_mount {219 struct ceph_mon_request_header monhdr;220} __attribute__ ((packed));221 222#define CEPH_SUBSCRIBE_ONETIME 1 /* i want only 1 update after have */223 224struct ceph_mon_subscribe_item {225 __le64 start;226 __u8 flags;227} __attribute__ ((packed));228 229struct ceph_mon_subscribe_ack {230 __le32 duration; /* seconds */231 struct ceph_fsid fsid;232} __attribute__ ((packed));233 234#define CEPH_FS_CLUSTER_ID_NONE -1235 236/*237 * mdsmap flags238 */239#define CEPH_MDSMAP_DOWN (1<<0) /* cluster deliberately down */240 241/*242 * mds states243 * > 0 -> in244 * <= 0 -> out245 */246#define CEPH_MDS_STATE_DNE 0 /* down, does not exist. */247#define CEPH_MDS_STATE_STOPPED -1 /* down, once existed, but no subtrees.248 empty log. */249#define CEPH_MDS_STATE_BOOT -4 /* up, boot announcement. */250#define CEPH_MDS_STATE_STANDBY -5 /* up, idle. waiting for assignment. */251#define CEPH_MDS_STATE_CREATING -6 /* up, creating MDS instance. */252#define CEPH_MDS_STATE_STARTING -7 /* up, starting previously stopped mds */253#define CEPH_MDS_STATE_STANDBY_REPLAY -8 /* up, tailing active node's journal */254#define CEPH_MDS_STATE_REPLAYONCE -9 /* up, replaying an active node's journal */255 256#define CEPH_MDS_STATE_REPLAY 8 /* up, replaying journal. */257#define CEPH_MDS_STATE_RESOLVE 9 /* up, disambiguating distributed258 operations (import, rename, etc.) */259#define CEPH_MDS_STATE_RECONNECT 10 /* up, reconnect to clients */260#define CEPH_MDS_STATE_REJOIN 11 /* up, rejoining distributed cache */261#define CEPH_MDS_STATE_CLIENTREPLAY 12 /* up, replaying client operations */262#define CEPH_MDS_STATE_ACTIVE 13 /* up, active */263#define CEPH_MDS_STATE_STOPPING 14 /* up, but exporting metadata */264 265extern const char *ceph_mds_state_name(int s);266 267 268/*269 * metadata lock types.270 * - these are bitmasks.. we can compose them271 * - they also define the lock ordering by the MDS272 * - a few of these are internal to the mds273 */274#define CEPH_LOCK_DVERSION 1275#define CEPH_LOCK_DN 2276#define CEPH_LOCK_ISNAP 16277#define CEPH_LOCK_IVERSION 32 /* mds internal */278#define CEPH_LOCK_IFILE 64279#define CEPH_LOCK_IAUTH 128280#define CEPH_LOCK_ILINK 256281#define CEPH_LOCK_IDFT 512 /* dir frag tree */282#define CEPH_LOCK_INEST 1024 /* mds internal */283#define CEPH_LOCK_IXATTR 2048284#define CEPH_LOCK_IFLOCK 4096 /* advisory file locks */285#define CEPH_LOCK_INO 8192 /* immutable inode bits; not a lock */286#define CEPH_LOCK_IPOLICY 16384 /* policy lock on dirs. MDS internal */287 288/* client_session ops */289enum {290 CEPH_SESSION_REQUEST_OPEN,291 CEPH_SESSION_OPEN,292 CEPH_SESSION_REQUEST_CLOSE,293 CEPH_SESSION_CLOSE,294 CEPH_SESSION_REQUEST_RENEWCAPS,295 CEPH_SESSION_RENEWCAPS,296 CEPH_SESSION_STALE,297 CEPH_SESSION_RECALL_STATE,298 CEPH_SESSION_FLUSHMSG,299 CEPH_SESSION_FLUSHMSG_ACK,300 CEPH_SESSION_FORCE_RO,301 CEPH_SESSION_REJECT,302 CEPH_SESSION_REQUEST_FLUSH_MDLOG,303};304 305#define CEPH_SESSION_BLOCKLISTED (1 << 0) /* session blocklisted */306 307extern const char *ceph_session_op_name(int op);308 309struct ceph_mds_session_head {310 __le32 op;311 __le64 seq;312 struct ceph_timespec stamp;313 __le32 max_caps, max_leases;314} __attribute__ ((packed));315 316/* client_request */317/*318 * metadata ops.319 * & 0x001000 -> write op320 * & 0x010000 -> follow symlink (e.g. stat(), not lstat()).321 & & 0x100000 -> use weird ino/path trace322 */323#define CEPH_MDS_OP_WRITE 0x001000324enum {325 CEPH_MDS_OP_LOOKUP = 0x00100,326 CEPH_MDS_OP_GETATTR = 0x00101,327 CEPH_MDS_OP_LOOKUPHASH = 0x00102,328 CEPH_MDS_OP_LOOKUPPARENT = 0x00103,329 CEPH_MDS_OP_LOOKUPINO = 0x00104,330 CEPH_MDS_OP_LOOKUPNAME = 0x00105,331 CEPH_MDS_OP_GETVXATTR = 0x00106,332 333 CEPH_MDS_OP_SETXATTR = 0x01105,334 CEPH_MDS_OP_RMXATTR = 0x01106,335 CEPH_MDS_OP_SETLAYOUT = 0x01107,336 CEPH_MDS_OP_SETATTR = 0x01108,337 CEPH_MDS_OP_SETFILELOCK= 0x01109,338 CEPH_MDS_OP_GETFILELOCK= 0x00110,339 CEPH_MDS_OP_SETDIRLAYOUT=0x0110a,340 341 CEPH_MDS_OP_MKNOD = 0x01201,342 CEPH_MDS_OP_LINK = 0x01202,343 CEPH_MDS_OP_UNLINK = 0x01203,344 CEPH_MDS_OP_RENAME = 0x01204,345 CEPH_MDS_OP_MKDIR = 0x01220,346 CEPH_MDS_OP_RMDIR = 0x01221,347 CEPH_MDS_OP_SYMLINK = 0x01222,348 349 CEPH_MDS_OP_CREATE = 0x01301,350 CEPH_MDS_OP_OPEN = 0x00302,351 CEPH_MDS_OP_READDIR = 0x00305,352 353 CEPH_MDS_OP_LOOKUPSNAP = 0x00400,354 CEPH_MDS_OP_MKSNAP = 0x01400,355 CEPH_MDS_OP_RMSNAP = 0x01401,356 CEPH_MDS_OP_LSSNAP = 0x00402,357 CEPH_MDS_OP_RENAMESNAP = 0x01403,358};359 360#define IS_CEPH_MDS_OP_NEWINODE(op) (op == CEPH_MDS_OP_CREATE || \361 op == CEPH_MDS_OP_MKNOD || \362 op == CEPH_MDS_OP_MKDIR || \363 op == CEPH_MDS_OP_SYMLINK)364 365extern const char *ceph_mds_op_name(int op);366 367#define CEPH_SETATTR_MODE (1 << 0)368#define CEPH_SETATTR_UID (1 << 1)369#define CEPH_SETATTR_GID (1 << 2)370#define CEPH_SETATTR_MTIME (1 << 3)371#define CEPH_SETATTR_ATIME (1 << 4)372#define CEPH_SETATTR_SIZE (1 << 5)373#define CEPH_SETATTR_CTIME (1 << 6)374#define CEPH_SETATTR_MTIME_NOW (1 << 7)375#define CEPH_SETATTR_ATIME_NOW (1 << 8)376#define CEPH_SETATTR_BTIME (1 << 9)377#define CEPH_SETATTR_KILL_SGUID (1 << 10)378#define CEPH_SETATTR_FSCRYPT_AUTH (1 << 11)379#define CEPH_SETATTR_FSCRYPT_FILE (1 << 12)380 381/*382 * Ceph setxattr request flags.383 */384#define CEPH_XATTR_CREATE (1 << 0)385#define CEPH_XATTR_REPLACE (1 << 1)386#define CEPH_XATTR_REMOVE (1 << 31)387 388/*389 * readdir request flags;390 */391#define CEPH_READDIR_REPLY_BITFLAGS (1<<0)392 393/*394 * readdir reply flags.395 */396#define CEPH_READDIR_FRAG_END (1<<0)397#define CEPH_READDIR_FRAG_COMPLETE (1<<8)398#define CEPH_READDIR_HASH_ORDER (1<<9)399#define CEPH_READDIR_OFFSET_HASH (1<<10)400 401/*402 * open request flags403 */404#define CEPH_O_RDONLY 00000000405#define CEPH_O_WRONLY 00000001406#define CEPH_O_RDWR 00000002407#define CEPH_O_CREAT 00000100408#define CEPH_O_EXCL 00000200409#define CEPH_O_TRUNC 00001000410#define CEPH_O_DIRECTORY 00200000411#define CEPH_O_NOFOLLOW 00400000412 413union ceph_mds_request_args {414 struct {415 __le32 mask; /* CEPH_CAP_* */416 } __attribute__ ((packed)) getattr;417 struct {418 __le32 mode;419 __le32 uid;420 __le32 gid;421 struct ceph_timespec mtime;422 struct ceph_timespec atime;423 __le64 size, old_size; /* old_size needed by truncate */424 __le32 mask; /* CEPH_SETATTR_* */425 } __attribute__ ((packed)) setattr;426 struct {427 __le32 frag; /* which dir fragment */428 __le32 max_entries; /* how many dentries to grab */429 __le32 max_bytes;430 __le16 flags;431 __le32 offset_hash;432 } __attribute__ ((packed)) readdir;433 struct {434 __le32 mode;435 __le32 rdev;436 } __attribute__ ((packed)) mknod;437 struct {438 __le32 mode;439 } __attribute__ ((packed)) mkdir;440 struct {441 __le32 flags;442 __le32 mode;443 __le32 stripe_unit; /* layout for newly created file */444 __le32 stripe_count; /* ... */445 __le32 object_size;446 __le32 pool;447 __le32 mask; /* CEPH_CAP_* */448 __le64 old_size;449 } __attribute__ ((packed)) open;450 struct {451 __le32 flags;452 __le32 osdmap_epoch; /* used for setting file/dir layouts */453 } __attribute__ ((packed)) setxattr;454 struct {455 struct ceph_file_layout_legacy layout;456 } __attribute__ ((packed)) setlayout;457 struct {458 __u8 rule; /* currently fcntl or flock */459 __u8 type; /* shared, exclusive, remove*/460 __le64 owner; /* owner of the lock */461 __le64 pid; /* process id requesting the lock */462 __le64 start; /* initial location to lock */463 __le64 length; /* num bytes to lock from start */464 __u8 wait; /* will caller wait for lock to become available? */465 } __attribute__ ((packed)) filelock_change;466 struct {467 __le32 mask; /* CEPH_CAP_* */468 __le64 snapid;469 __le64 parent;470 __le32 hash;471 } __attribute__ ((packed)) lookupino;472} __attribute__ ((packed));473 474union ceph_mds_request_args_ext {475 union ceph_mds_request_args old;476 struct {477 __le32 mode;478 __le32 uid;479 __le32 gid;480 struct ceph_timespec mtime;481 struct ceph_timespec atime;482 __le64 size, old_size; /* old_size needed by truncate */483 __le32 mask; /* CEPH_SETATTR_* */484 struct ceph_timespec btime;485 } __attribute__ ((packed)) setattr_ext;486};487 488#define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */489#define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */490#define CEPH_MDS_FLAG_ASYNC 4 /* request is asynchronous */491 492struct ceph_mds_request_head_legacy {493 __le64 oldest_client_tid;494 __le32 mdsmap_epoch; /* on client */495 __le32 flags; /* CEPH_MDS_FLAG_* */496 __u8 num_retry, num_fwd; /* count retry, fwd attempts */497 __le16 num_releases; /* # include cap/lease release records */498 __le32 op; /* mds op code */499 __le32 caller_uid, caller_gid;500 __le64 ino; /* use this ino for openc, mkdir, mknod,501 etc. (if replaying) */502 union ceph_mds_request_args args;503} __attribute__ ((packed));504 505#define CEPH_MDS_REQUEST_HEAD_VERSION 3506 507struct ceph_mds_request_head_old {508 __le16 version; /* struct version */509 __le64 oldest_client_tid;510 __le32 mdsmap_epoch; /* on client */511 __le32 flags; /* CEPH_MDS_FLAG_* */512 __u8 num_retry, num_fwd; /* count retry, fwd attempts */513 __le16 num_releases; /* # include cap/lease release records */514 __le32 op; /* mds op code */515 __le32 caller_uid, caller_gid;516 __le64 ino; /* use this ino for openc, mkdir, mknod,517 etc. (if replaying) */518 union ceph_mds_request_args_ext args;519} __attribute__ ((packed));520 521struct ceph_mds_request_head {522 __le16 version; /* struct version */523 __le64 oldest_client_tid;524 __le32 mdsmap_epoch; /* on client */525 __le32 flags; /* CEPH_MDS_FLAG_* */526 __u8 num_retry, num_fwd; /* legacy count retry and fwd attempts */527 __le16 num_releases; /* # include cap/lease release records */528 __le32 op; /* mds op code */529 __le32 caller_uid, caller_gid;530 __le64 ino; /* use this ino for openc, mkdir, mknod,531 etc. (if replaying) */532 union ceph_mds_request_args_ext args;533 534 __le32 ext_num_retry; /* new count retry attempts */535 __le32 ext_num_fwd; /* new count fwd attempts */536 537 __le32 struct_len; /* to store size of struct ceph_mds_request_head */538 __le32 owner_uid, owner_gid; /* used for OPs which create inodes */539} __attribute__ ((packed));540 541/* cap/lease release record */542struct ceph_mds_request_release {543 __le64 ino, cap_id; /* ino and unique cap id */544 __le32 caps, wanted; /* new issued, wanted */545 __le32 seq, issue_seq, mseq;546 __le32 dname_seq; /* if releasing a dentry lease, a */547 __le32 dname_len; /* string follows. */548} __attribute__ ((packed));549 550/* client reply */551struct ceph_mds_reply_head {552 __le32 op;553 __le32 result;554 __le32 mdsmap_epoch;555 __u8 safe; /* true if committed to disk */556 __u8 is_dentry, is_target; /* true if dentry, target inode records557 are included with reply */558} __attribute__ ((packed));559 560/* one for each node split */561struct ceph_frag_tree_split {562 __le32 frag; /* this frag splits... */563 __le32 by; /* ...by this many bits */564} __attribute__ ((packed));565 566struct ceph_frag_tree_head {567 __le32 nsplits; /* num ceph_frag_tree_split records */568 struct ceph_frag_tree_split splits[];569} __attribute__ ((packed));570 571/* capability issue, for bundling with mds reply */572struct ceph_mds_reply_cap {573 __le32 caps, wanted; /* caps issued, wanted */574 __le64 cap_id;575 __le32 seq, mseq;576 __le64 realm; /* snap realm */577 __u8 flags; /* CEPH_CAP_FLAG_* */578} __attribute__ ((packed));579 580#define CEPH_CAP_FLAG_AUTH (1 << 0) /* cap is issued by auth mds */581#define CEPH_CAP_FLAG_RELEASE (1 << 1) /* release the cap */582 583/* inode record, for bundling with mds reply */584struct ceph_mds_reply_inode {585 __le64 ino;586 __le64 snapid;587 __le32 rdev;588 __le64 version; /* inode version */589 __le64 xattr_version; /* version for xattr blob */590 struct ceph_mds_reply_cap cap; /* caps issued for this inode */591 struct ceph_file_layout_legacy layout;592 struct ceph_timespec ctime, mtime, atime;593 __le32 time_warp_seq;594 __le64 size, max_size, truncate_size;595 __le32 truncate_seq;596 __le32 mode, uid, gid;597 __le32 nlink;598 __le64 files, subdirs, rbytes, rfiles, rsubdirs; /* dir stats */599 struct ceph_timespec rctime;600 struct ceph_frag_tree_head fragtree; /* (must be at end of struct) */601} __attribute__ ((packed));602/* followed by frag array, symlink string, dir layout, xattr blob */603 604/* reply_lease follows dname, and reply_inode */605struct ceph_mds_reply_lease {606 __le16 mask; /* lease type(s) */607 __le32 duration_ms; /* lease duration */608 __le32 seq;609} __attribute__ ((packed));610 611#define CEPH_LEASE_VALID (1 | 2) /* old and new bit values */612#define CEPH_LEASE_PRIMARY_LINK 4 /* primary linkage */613 614struct ceph_mds_reply_dirfrag {615 __le32 frag; /* fragment */616 __le32 auth; /* auth mds, if this is a delegation point */617 __le32 ndist; /* number of mds' this is replicated on */618 __le32 dist[];619} __attribute__ ((packed));620 621#define CEPH_LOCK_FCNTL 1622#define CEPH_LOCK_FLOCK 2623#define CEPH_LOCK_FCNTL_INTR 3624#define CEPH_LOCK_FLOCK_INTR 4625 626 627#define CEPH_LOCK_SHARED 1628#define CEPH_LOCK_EXCL 2629#define CEPH_LOCK_UNLOCK 4630 631struct ceph_filelock {632 __le64 start;/* file offset to start lock at */633 __le64 length; /* num bytes to lock; 0 for all following start */634 __le64 client; /* which client holds the lock */635 __le64 owner; /* owner the lock */636 __le64 pid; /* process id holding the lock on the client */637 __u8 type; /* shared lock, exclusive lock, or unlock */638} __attribute__ ((packed));639 640 641/* file access modes */642#define CEPH_FILE_MODE_PIN 0643#define CEPH_FILE_MODE_RD 1644#define CEPH_FILE_MODE_WR 2645#define CEPH_FILE_MODE_RDWR 3 /* RD | WR */646#define CEPH_FILE_MODE_LAZY 4 /* lazy io */647#define CEPH_FILE_MODE_BITS 4648#define CEPH_FILE_MODE_MASK ((1 << CEPH_FILE_MODE_BITS) - 1)649 650int ceph_flags_to_mode(int flags);651 652#define CEPH_INLINE_NONE ((__u64)-1)653 654/* capability bits */655#define CEPH_CAP_PIN 1 /* no specific capabilities beyond the pin */656 657/* generic cap bits */658#define CEPH_CAP_GSHARED 1 /* client can reads */659#define CEPH_CAP_GEXCL 2 /* client can read and update */660#define CEPH_CAP_GCACHE 4 /* (file) client can cache reads */661#define CEPH_CAP_GRD 8 /* (file) client can read */662#define CEPH_CAP_GWR 16 /* (file) client can write */663#define CEPH_CAP_GBUFFER 32 /* (file) client can buffer writes */664#define CEPH_CAP_GWREXTEND 64 /* (file) client can extend EOF */665#define CEPH_CAP_GLAZYIO 128 /* (file) client can perform lazy io */666 667#define CEPH_CAP_SIMPLE_BITS 2668#define CEPH_CAP_FILE_BITS 8669 670/* per-lock shift */671#define CEPH_CAP_SAUTH 2672#define CEPH_CAP_SLINK 4673#define CEPH_CAP_SXATTR 6674#define CEPH_CAP_SFILE 8675#define CEPH_CAP_SFLOCK 20676 677#define CEPH_CAP_BITS 22678 679/* composed values */680#define CEPH_CAP_AUTH_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SAUTH)681#define CEPH_CAP_AUTH_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SAUTH)682#define CEPH_CAP_LINK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SLINK)683#define CEPH_CAP_LINK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SLINK)684#define CEPH_CAP_XATTR_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SXATTR)685#define CEPH_CAP_XATTR_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SXATTR)686#define CEPH_CAP_FILE(x) (x << CEPH_CAP_SFILE)687#define CEPH_CAP_FILE_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFILE)688#define CEPH_CAP_FILE_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFILE)689#define CEPH_CAP_FILE_CACHE (CEPH_CAP_GCACHE << CEPH_CAP_SFILE)690#define CEPH_CAP_FILE_RD (CEPH_CAP_GRD << CEPH_CAP_SFILE)691#define CEPH_CAP_FILE_WR (CEPH_CAP_GWR << CEPH_CAP_SFILE)692#define CEPH_CAP_FILE_BUFFER (CEPH_CAP_GBUFFER << CEPH_CAP_SFILE)693#define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE)694#define CEPH_CAP_FILE_LAZYIO (CEPH_CAP_GLAZYIO << CEPH_CAP_SFILE)695#define CEPH_CAP_FLOCK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFLOCK)696#define CEPH_CAP_FLOCK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFLOCK)697 698 699/* cap masks (for getattr) */700#define CEPH_STAT_CAP_INODE CEPH_CAP_PIN701#define CEPH_STAT_CAP_TYPE CEPH_CAP_PIN /* mode >> 12 */702#define CEPH_STAT_CAP_SYMLINK CEPH_CAP_PIN703#define CEPH_STAT_CAP_UID CEPH_CAP_AUTH_SHARED704#define CEPH_STAT_CAP_GID CEPH_CAP_AUTH_SHARED705#define CEPH_STAT_CAP_MODE CEPH_CAP_AUTH_SHARED706#define CEPH_STAT_CAP_NLINK CEPH_CAP_LINK_SHARED707#define CEPH_STAT_CAP_LAYOUT CEPH_CAP_FILE_SHARED708#define CEPH_STAT_CAP_MTIME CEPH_CAP_FILE_SHARED709#define CEPH_STAT_CAP_SIZE CEPH_CAP_FILE_SHARED710#define CEPH_STAT_CAP_ATIME CEPH_CAP_FILE_SHARED /* fixme */711#define CEPH_STAT_CAP_XATTR CEPH_CAP_XATTR_SHARED712#define CEPH_STAT_CAP_INODE_ALL (CEPH_CAP_PIN | \713 CEPH_CAP_AUTH_SHARED | \714 CEPH_CAP_LINK_SHARED | \715 CEPH_CAP_FILE_SHARED | \716 CEPH_CAP_XATTR_SHARED)717#define CEPH_STAT_CAP_INLINE_DATA (CEPH_CAP_FILE_SHARED | \718 CEPH_CAP_FILE_RD)719#define CEPH_STAT_RSTAT CEPH_CAP_FILE_WREXTEND720 721#define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED | \722 CEPH_CAP_LINK_SHARED | \723 CEPH_CAP_XATTR_SHARED | \724 CEPH_CAP_FILE_SHARED)725#define CEPH_CAP_ANY_RD (CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_RD | \726 CEPH_CAP_FILE_CACHE)727 728#define CEPH_CAP_ANY_EXCL (CEPH_CAP_AUTH_EXCL | \729 CEPH_CAP_LINK_EXCL | \730 CEPH_CAP_XATTR_EXCL | \731 CEPH_CAP_FILE_EXCL)732#define CEPH_CAP_ANY_FILE_RD (CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE | \733 CEPH_CAP_FILE_SHARED)734#define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | \735 CEPH_CAP_FILE_EXCL)736#define CEPH_CAP_ANY_WR (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR)737#define CEPH_CAP_ANY (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \738 CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \739 CEPH_CAP_PIN)740#define CEPH_CAP_ALL_FILE (CEPH_CAP_PIN | CEPH_CAP_ANY_SHARED | \741 CEPH_CAP_AUTH_EXCL | CEPH_CAP_XATTR_EXCL | \742 CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)743 744#define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \745 CEPH_LOCK_IXATTR)746 747/* cap masks async dir operations */748#define CEPH_CAP_DIR_CREATE CEPH_CAP_FILE_CACHE749#define CEPH_CAP_DIR_UNLINK CEPH_CAP_FILE_RD750#define CEPH_CAP_ANY_DIR_OPS (CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | \751 CEPH_CAP_FILE_WREXTEND | CEPH_CAP_FILE_LAZYIO)752 753int ceph_caps_for_mode(int mode);754 755enum {756 CEPH_CAP_OP_GRANT, /* mds->client grant */757 CEPH_CAP_OP_REVOKE, /* mds->client revoke */758 CEPH_CAP_OP_TRUNC, /* mds->client trunc notify */759 CEPH_CAP_OP_EXPORT, /* mds has exported the cap */760 CEPH_CAP_OP_IMPORT, /* mds has imported the cap */761 CEPH_CAP_OP_UPDATE, /* client->mds update */762 CEPH_CAP_OP_DROP, /* client->mds drop cap bits */763 CEPH_CAP_OP_FLUSH, /* client->mds cap writeback */764 CEPH_CAP_OP_FLUSH_ACK, /* mds->client flushed */765 CEPH_CAP_OP_FLUSHSNAP, /* client->mds flush snapped metadata */766 CEPH_CAP_OP_FLUSHSNAP_ACK, /* mds->client flushed snapped metadata */767 CEPH_CAP_OP_RELEASE, /* client->mds release (clean) cap */768 CEPH_CAP_OP_RENEW, /* client->mds renewal request */769};770 771extern const char *ceph_cap_op_name(int op);772 773/* flags field in client cap messages (version >= 10) */774#define CEPH_CLIENT_CAPS_SYNC (1<<0)775#define CEPH_CLIENT_CAPS_NO_CAPSNAP (1<<1)776#define CEPH_CLIENT_CAPS_PENDING_CAPSNAP (1<<2)777 778/*779 * caps message, used for capability callbacks, acks, requests, etc.780 */781struct ceph_mds_caps {782 __le32 op; /* CEPH_CAP_OP_* */783 __le64 ino, realm;784 __le64 cap_id;785 __le32 seq, issue_seq;786 __le32 caps, wanted, dirty; /* latest issued/wanted/dirty */787 __le32 migrate_seq;788 __le64 snap_follows;789 __le32 snap_trace_len;790 791 /* authlock */792 __le32 uid, gid, mode;793 794 /* linklock */795 __le32 nlink;796 797 /* xattrlock */798 __le32 xattr_len;799 __le64 xattr_version;800 801 /* a union of non-export and export bodies. */802 __le64 size, max_size, truncate_size;803 __le32 truncate_seq;804 struct ceph_timespec mtime, atime, ctime;805 struct ceph_file_layout_legacy layout;806 __le32 time_warp_seq;807} __attribute__ ((packed));808 809struct ceph_mds_cap_peer {810 __le64 cap_id;811 __le32 seq;812 __le32 mseq;813 __le32 mds;814 __u8 flags;815} __attribute__ ((packed));816 817/* cap release msg head */818struct ceph_mds_cap_release {819 __le32 num; /* number of cap_items that follow */820} __attribute__ ((packed));821 822struct ceph_mds_cap_item {823 __le64 ino;824 __le64 cap_id;825 __le32 migrate_seq, seq;826} __attribute__ ((packed));827 828#define CEPH_MDS_LEASE_REVOKE 1 /* mds -> client */829#define CEPH_MDS_LEASE_RELEASE 2 /* client -> mds */830#define CEPH_MDS_LEASE_RENEW 3 /* client <-> mds */831#define CEPH_MDS_LEASE_REVOKE_ACK 4 /* client -> mds */832 833extern const char *ceph_lease_op_name(int o);834 835/* lease msg header */836struct ceph_mds_lease {837 __u8 action; /* CEPH_MDS_LEASE_* */838 __le16 mask; /* which lease */839 __le64 ino;840 __le64 first, last; /* snap range */841 __le32 seq;842 __le32 duration_ms; /* duration of renewal */843} __attribute__ ((packed));844/* followed by a __le32+string for dname */845 846/* client reconnect */847struct ceph_mds_cap_reconnect {848 __le64 cap_id;849 __le32 wanted;850 __le32 issued;851 __le64 snaprealm;852 __le64 pathbase; /* base ino for our path to this ino */853 __le32 flock_len; /* size of flock state blob, if any */854} __attribute__ ((packed));855/* followed by flock blob */856 857struct ceph_mds_cap_reconnect_v1 {858 __le64 cap_id;859 __le32 wanted;860 __le32 issued;861 __le64 size;862 struct ceph_timespec mtime, atime;863 __le64 snaprealm;864 __le64 pathbase; /* base ino for our path to this ino */865} __attribute__ ((packed));866 867struct ceph_mds_snaprealm_reconnect {868 __le64 ino; /* snap realm base */869 __le64 seq; /* snap seq for this snap realm */870 __le64 parent; /* parent realm */871} __attribute__ ((packed));872 873/*874 * snaps875 */876enum {877 CEPH_SNAP_OP_UPDATE, /* CREATE or DESTROY */878 CEPH_SNAP_OP_CREATE,879 CEPH_SNAP_OP_DESTROY,880 CEPH_SNAP_OP_SPLIT,881};882 883extern const char *ceph_snap_op_name(int o);884 885/* snap msg header */886struct ceph_mds_snap_head {887 __le32 op; /* CEPH_SNAP_OP_* */888 __le64 split; /* ino to split off, if any */889 __le32 num_split_inos; /* # inos belonging to new child realm */890 __le32 num_split_realms; /* # child realms udner new child realm */891 __le32 trace_len; /* size of snap trace blob */892} __attribute__ ((packed));893/* followed by split ino list, then split realms, then the trace blob */894 895/*896 * encode info about a snaprealm, as viewed by a client897 */898struct ceph_mds_snap_realm {899 __le64 ino; /* ino */900 __le64 created; /* snap: when created */901 __le64 parent; /* ino: parent realm */902 __le64 parent_since; /* snap: same parent since */903 __le64 seq; /* snap: version */904 __le32 num_snaps;905 __le32 num_prior_parent_snaps;906} __attribute__ ((packed));907/* followed by my snap list, then prior parent snap list */908 909/*910 * quotas911 */912struct ceph_mds_quota {913 __le64 ino; /* ino */914 struct ceph_timespec rctime;915 __le64 rbytes; /* dir stats */916 __le64 rfiles;917 __le64 rsubdirs;918 __u8 struct_v; /* compat */919 __u8 struct_compat;920 __le32 struct_len;921 __le64 max_bytes; /* quota max. bytes */922 __le64 max_files; /* quota max. files */923} __attribute__ ((packed));924 925#endif926