brintos

brintos / linux-shallow public Read only

0
0
Text · 29.2 KiB · ee1d0e5 Raw
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