Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * ceph_fs.h - Ceph constants and data types to share between kernel and
0004  * user space.
0005  *
0006  * Most types in this file are defined as little-endian, and are
0007  * primarily intended to describe data structures that pass over the
0008  * wire or that are stored on disk.
0009  *
0010  * LGPL2
0011  */
0012 
0013 #ifndef CEPH_FS_H
0014 #define CEPH_FS_H
0015 
0016 #include <linux/ceph/msgr.h>
0017 #include <linux/ceph/rados.h>
0018 
0019 /*
0020  * subprotocol versions.  when specific messages types or high-level
0021  * protocols change, bump the affected components.  we keep rev
0022  * internal cluster protocols separately from the public,
0023  * client-facing protocol.
0024  */
0025 #define CEPH_OSDC_PROTOCOL   24 /* server/client */
0026 #define CEPH_MDSC_PROTOCOL   32 /* server/client */
0027 #define CEPH_MONC_PROTOCOL   15 /* server/client */
0028 
0029 
0030 #define CEPH_INO_ROOT   1
0031 #define CEPH_INO_CEPH   2            /* hidden .ceph dir */
0032 #define CEPH_INO_GLOBAL_SNAPREALM  3 /* global dummy snaprealm */
0033 
0034 /* arbitrary limit on max # of monitors (cluster of 3 is typical) */
0035 #define CEPH_MAX_MON   31
0036 
0037 /*
0038  * legacy ceph_file_layoute
0039  */
0040 struct ceph_file_layout_legacy {
0041     /* file -> object mapping */
0042     __le32 fl_stripe_unit;     /* stripe unit, in bytes.  must be multiple
0043                       of page size. */
0044     __le32 fl_stripe_count;    /* over this many objects */
0045     __le32 fl_object_size;     /* until objects are this big, then move to
0046                       new objects */
0047     __le32 fl_cas_hash;        /* UNUSED.  0 = none; 1 = sha256 */
0048 
0049     /* pg -> disk layout */
0050     __le32 fl_object_stripe_unit;  /* UNUSED.  for per-object parity, if any */
0051 
0052     /* object -> pg layout */
0053     __le32 fl_unused;       /* unused; used to be preferred primary for pg (-1 for none) */
0054     __le32 fl_pg_pool;      /* namespace, crush ruleset, rep level */
0055 } __attribute__ ((packed));
0056 
0057 struct ceph_string;
0058 /*
0059  * ceph_file_layout - describe data layout for a file/inode
0060  */
0061 struct ceph_file_layout {
0062     /* file -> object mapping */
0063     u32 stripe_unit;   /* stripe unit, in bytes */
0064     u32 stripe_count;  /* over this many objects */
0065     u32 object_size;   /* until objects are this big */
0066     s64 pool_id;        /* rados pool id */
0067     struct ceph_string __rcu *pool_ns; /* rados pool namespace */
0068 };
0069 
0070 extern int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
0071 extern void ceph_file_layout_from_legacy(struct ceph_file_layout *fl,
0072                 struct ceph_file_layout_legacy *legacy);
0073 extern void ceph_file_layout_to_legacy(struct ceph_file_layout *fl,
0074                 struct ceph_file_layout_legacy *legacy);
0075 
0076 #define CEPH_MIN_STRIPE_UNIT 65536
0077 
0078 struct ceph_dir_layout {
0079     __u8   dl_dir_hash;   /* see ceph_hash.h for ids */
0080     __u8   dl_unused1;
0081     __u16  dl_unused2;
0082     __u32  dl_unused3;
0083 } __attribute__ ((packed));
0084 
0085 /* crypto algorithms */
0086 #define CEPH_CRYPTO_NONE 0x0
0087 #define CEPH_CRYPTO_AES  0x1
0088 
0089 #define CEPH_AES_IV "cephsageyudagreg"
0090 
0091 /* security/authentication protocols */
0092 #define CEPH_AUTH_UNKNOWN   0x0
0093 #define CEPH_AUTH_NONE      0x1
0094 #define CEPH_AUTH_CEPHX     0x2
0095 
0096 #define CEPH_AUTH_MODE_NONE     0
0097 #define CEPH_AUTH_MODE_AUTHORIZER   1
0098 #define CEPH_AUTH_MODE_MON      10
0099 
0100 /* msgr2 protocol modes */
0101 #define CEPH_CON_MODE_UNKNOWN   0x0
0102 #define CEPH_CON_MODE_CRC   0x1
0103 #define CEPH_CON_MODE_SECURE    0x2
0104 
0105 #define CEPH_AUTH_UID_DEFAULT ((__u64) -1)
0106 
0107 const char *ceph_auth_proto_name(int proto);
0108 const char *ceph_con_mode_name(int mode);
0109 
0110 /*********************************************
0111  * message layer
0112  */
0113 
0114 /*
0115  * message types
0116  */
0117 
0118 /* misc */
0119 #define CEPH_MSG_SHUTDOWN               1
0120 #define CEPH_MSG_PING                   2
0121 
0122 /* client <-> monitor */
0123 #define CEPH_MSG_MON_MAP                4
0124 #define CEPH_MSG_MON_GET_MAP            5
0125 #define CEPH_MSG_STATFS                 13
0126 #define CEPH_MSG_STATFS_REPLY           14
0127 #define CEPH_MSG_MON_SUBSCRIBE          15
0128 #define CEPH_MSG_MON_SUBSCRIBE_ACK      16
0129 #define CEPH_MSG_AUTH           17
0130 #define CEPH_MSG_AUTH_REPLY     18
0131 #define CEPH_MSG_MON_GET_VERSION        19
0132 #define CEPH_MSG_MON_GET_VERSION_REPLY  20
0133 
0134 /* client <-> mds */
0135 #define CEPH_MSG_MDS_MAP                21
0136 #define CEPH_MSG_FS_MAP_USER            103
0137 
0138 #define CEPH_MSG_CLIENT_SESSION         22
0139 #define CEPH_MSG_CLIENT_RECONNECT       23
0140 
0141 #define CEPH_MSG_CLIENT_REQUEST         24
0142 #define CEPH_MSG_CLIENT_REQUEST_FORWARD 25
0143 #define CEPH_MSG_CLIENT_REPLY           26
0144 #define CEPH_MSG_CLIENT_METRICS         29
0145 #define CEPH_MSG_CLIENT_CAPS            0x310
0146 #define CEPH_MSG_CLIENT_LEASE           0x311
0147 #define CEPH_MSG_CLIENT_SNAP            0x312
0148 #define CEPH_MSG_CLIENT_CAPRELEASE      0x313
0149 #define CEPH_MSG_CLIENT_QUOTA           0x314
0150 
0151 /* pool ops */
0152 #define CEPH_MSG_POOLOP_REPLY           48
0153 #define CEPH_MSG_POOLOP                 49
0154 
0155 /* mon commands */
0156 #define CEPH_MSG_MON_COMMAND            50
0157 #define CEPH_MSG_MON_COMMAND_ACK        51
0158 
0159 /* osd */
0160 #define CEPH_MSG_OSD_MAP                41
0161 #define CEPH_MSG_OSD_OP                 42
0162 #define CEPH_MSG_OSD_OPREPLY            43
0163 #define CEPH_MSG_WATCH_NOTIFY           44
0164 #define CEPH_MSG_OSD_BACKOFF            61
0165 
0166 
0167 /* watch-notify operations */
0168 enum {
0169     CEPH_WATCH_EVENT_NOTIFY       = 1, /* notifying watcher */
0170     CEPH_WATCH_EVENT_NOTIFY_COMPLETE  = 2, /* notifier notified when done */
0171     CEPH_WATCH_EVENT_DISCONNECT       = 3, /* we were disconnected */
0172 };
0173 
0174 
0175 struct ceph_mon_request_header {
0176     __le64 have_version;
0177     __le16 session_mon;
0178     __le64 session_mon_tid;
0179 } __attribute__ ((packed));
0180 
0181 struct ceph_mon_statfs {
0182     struct ceph_mon_request_header monhdr;
0183     struct ceph_fsid fsid;
0184     __u8 contains_data_pool;
0185     __le64 data_pool;
0186 } __attribute__ ((packed));
0187 
0188 struct ceph_statfs {
0189     __le64 kb, kb_used, kb_avail;
0190     __le64 num_objects;
0191 } __attribute__ ((packed));
0192 
0193 struct ceph_mon_statfs_reply {
0194     struct ceph_fsid fsid;
0195     __le64 version;
0196     struct ceph_statfs st;
0197 } __attribute__ ((packed));
0198 
0199 struct ceph_mon_command {
0200     struct ceph_mon_request_header monhdr;
0201     struct ceph_fsid fsid;
0202     __le32 num_strs;         /* always 1 */
0203     __le32 str_len;
0204     char str[];
0205 } __attribute__ ((packed));
0206 
0207 struct ceph_osd_getmap {
0208     struct ceph_mon_request_header monhdr;
0209     struct ceph_fsid fsid;
0210     __le32 start;
0211 } __attribute__ ((packed));
0212 
0213 struct ceph_mds_getmap {
0214     struct ceph_mon_request_header monhdr;
0215     struct ceph_fsid fsid;
0216 } __attribute__ ((packed));
0217 
0218 struct ceph_client_mount {
0219     struct ceph_mon_request_header monhdr;
0220 } __attribute__ ((packed));
0221 
0222 #define CEPH_SUBSCRIBE_ONETIME    1  /* i want only 1 update after have */
0223 
0224 struct ceph_mon_subscribe_item {
0225     __le64 start;
0226     __u8 flags;
0227 } __attribute__ ((packed));
0228 
0229 struct ceph_mon_subscribe_ack {
0230     __le32 duration;         /* seconds */
0231     struct ceph_fsid fsid;
0232 } __attribute__ ((packed));
0233 
0234 #define CEPH_FS_CLUSTER_ID_NONE  -1
0235 
0236 /*
0237  * mdsmap flags
0238  */
0239 #define CEPH_MDSMAP_DOWN    (1<<0)  /* cluster deliberately down */
0240 
0241 /*
0242  * mds states
0243  *   > 0 -> in
0244  *  <= 0 -> out
0245  */
0246 #define CEPH_MDS_STATE_DNE          0  /* down, does not exist. */
0247 #define CEPH_MDS_STATE_STOPPED     -1  /* down, once existed, but no subtrees.
0248                       empty log. */
0249 #define CEPH_MDS_STATE_BOOT        -4  /* up, boot announcement. */
0250 #define CEPH_MDS_STATE_STANDBY     -5  /* up, idle.  waiting for assignment. */
0251 #define CEPH_MDS_STATE_CREATING    -6  /* up, creating MDS instance. */
0252 #define CEPH_MDS_STATE_STARTING    -7  /* up, starting previously stopped mds */
0253 #define CEPH_MDS_STATE_STANDBY_REPLAY -8 /* up, tailing active node's journal */
0254 #define CEPH_MDS_STATE_REPLAYONCE   -9 /* up, replaying an active node's journal */
0255 
0256 #define CEPH_MDS_STATE_REPLAY       8  /* up, replaying journal. */
0257 #define CEPH_MDS_STATE_RESOLVE      9  /* up, disambiguating distributed
0258                       operations (import, rename, etc.) */
0259 #define CEPH_MDS_STATE_RECONNECT    10 /* up, reconnect to clients */
0260 #define CEPH_MDS_STATE_REJOIN       11 /* up, rejoining distributed cache */
0261 #define CEPH_MDS_STATE_CLIENTREPLAY 12 /* up, replaying client operations */
0262 #define CEPH_MDS_STATE_ACTIVE       13 /* up, active */
0263 #define CEPH_MDS_STATE_STOPPING     14 /* up, but exporting metadata */
0264 
0265 extern const char *ceph_mds_state_name(int s);
0266 
0267 
0268 /*
0269  * metadata lock types.
0270  *  - these are bitmasks.. we can compose them
0271  *  - they also define the lock ordering by the MDS
0272  *  - a few of these are internal to the mds
0273  */
0274 #define CEPH_LOCK_DVERSION    1
0275 #define CEPH_LOCK_DN          2
0276 #define CEPH_LOCK_ISNAP       16
0277 #define CEPH_LOCK_IVERSION    32    /* mds internal */
0278 #define CEPH_LOCK_IFILE       64
0279 #define CEPH_LOCK_IAUTH       128
0280 #define CEPH_LOCK_ILINK       256
0281 #define CEPH_LOCK_IDFT        512   /* dir frag tree */
0282 #define CEPH_LOCK_INEST       1024  /* mds internal */
0283 #define CEPH_LOCK_IXATTR      2048
0284 #define CEPH_LOCK_IFLOCK      4096  /* advisory file locks */
0285 #define CEPH_LOCK_INO         8192  /* immutable inode bits; not a lock */
0286 #define CEPH_LOCK_IPOLICY     16384 /* policy lock on dirs. MDS internal */
0287 
0288 /* client_session ops */
0289 enum {
0290     CEPH_SESSION_REQUEST_OPEN,
0291     CEPH_SESSION_OPEN,
0292     CEPH_SESSION_REQUEST_CLOSE,
0293     CEPH_SESSION_CLOSE,
0294     CEPH_SESSION_REQUEST_RENEWCAPS,
0295     CEPH_SESSION_RENEWCAPS,
0296     CEPH_SESSION_STALE,
0297     CEPH_SESSION_RECALL_STATE,
0298     CEPH_SESSION_FLUSHMSG,
0299     CEPH_SESSION_FLUSHMSG_ACK,
0300     CEPH_SESSION_FORCE_RO,
0301     CEPH_SESSION_REJECT,
0302     CEPH_SESSION_REQUEST_FLUSH_MDLOG,
0303 };
0304 
0305 #define CEPH_SESSION_BLOCKLISTED    (1 << 0)  /* session blocklisted */
0306 
0307 extern const char *ceph_session_op_name(int op);
0308 
0309 struct ceph_mds_session_head {
0310     __le32 op;
0311     __le64 seq;
0312     struct ceph_timespec stamp;
0313     __le32 max_caps, max_leases;
0314 } __attribute__ ((packed));
0315 
0316 /* client_request */
0317 /*
0318  * metadata ops.
0319  *  & 0x001000 -> write op
0320  *  & 0x010000 -> follow symlink (e.g. stat(), not lstat()).
0321  &  & 0x100000 -> use weird ino/path trace
0322  */
0323 #define CEPH_MDS_OP_WRITE        0x001000
0324 enum {
0325     CEPH_MDS_OP_LOOKUP     = 0x00100,
0326     CEPH_MDS_OP_GETATTR    = 0x00101,
0327     CEPH_MDS_OP_LOOKUPHASH = 0x00102,
0328     CEPH_MDS_OP_LOOKUPPARENT = 0x00103,
0329     CEPH_MDS_OP_LOOKUPINO  = 0x00104,
0330     CEPH_MDS_OP_LOOKUPNAME = 0x00105,
0331     CEPH_MDS_OP_GETVXATTR  = 0x00106,
0332 
0333     CEPH_MDS_OP_SETXATTR   = 0x01105,
0334     CEPH_MDS_OP_RMXATTR    = 0x01106,
0335     CEPH_MDS_OP_SETLAYOUT  = 0x01107,
0336     CEPH_MDS_OP_SETATTR    = 0x01108,
0337     CEPH_MDS_OP_SETFILELOCK= 0x01109,
0338     CEPH_MDS_OP_GETFILELOCK= 0x00110,
0339     CEPH_MDS_OP_SETDIRLAYOUT=0x0110a,
0340 
0341     CEPH_MDS_OP_MKNOD      = 0x01201,
0342     CEPH_MDS_OP_LINK       = 0x01202,
0343     CEPH_MDS_OP_UNLINK     = 0x01203,
0344     CEPH_MDS_OP_RENAME     = 0x01204,
0345     CEPH_MDS_OP_MKDIR      = 0x01220,
0346     CEPH_MDS_OP_RMDIR      = 0x01221,
0347     CEPH_MDS_OP_SYMLINK    = 0x01222,
0348 
0349     CEPH_MDS_OP_CREATE     = 0x01301,
0350     CEPH_MDS_OP_OPEN       = 0x00302,
0351     CEPH_MDS_OP_READDIR    = 0x00305,
0352 
0353     CEPH_MDS_OP_LOOKUPSNAP = 0x00400,
0354     CEPH_MDS_OP_MKSNAP     = 0x01400,
0355     CEPH_MDS_OP_RMSNAP     = 0x01401,
0356     CEPH_MDS_OP_LSSNAP     = 0x00402,
0357     CEPH_MDS_OP_RENAMESNAP = 0x01403,
0358 };
0359 
0360 extern const char *ceph_mds_op_name(int op);
0361 
0362 
0363 #define CEPH_SETATTR_MODE   1
0364 #define CEPH_SETATTR_UID    2
0365 #define CEPH_SETATTR_GID    4
0366 #define CEPH_SETATTR_MTIME  8
0367 #define CEPH_SETATTR_ATIME 16
0368 #define CEPH_SETATTR_SIZE  32
0369 #define CEPH_SETATTR_CTIME 64
0370 
0371 /*
0372  * Ceph setxattr request flags.
0373  */
0374 #define CEPH_XATTR_CREATE  (1 << 0)
0375 #define CEPH_XATTR_REPLACE (1 << 1)
0376 #define CEPH_XATTR_REMOVE  (1 << 31)
0377 
0378 /*
0379  * readdir request flags;
0380  */
0381 #define CEPH_READDIR_REPLY_BITFLAGS (1<<0)
0382 
0383 /*
0384  * readdir reply flags.
0385  */
0386 #define CEPH_READDIR_FRAG_END       (1<<0)
0387 #define CEPH_READDIR_FRAG_COMPLETE  (1<<8)
0388 #define CEPH_READDIR_HASH_ORDER     (1<<9)
0389 #define CEPH_READDIR_OFFSET_HASH    (1<<10)
0390 
0391 /*
0392  * open request flags
0393  */
0394 #define CEPH_O_RDONLY       00000000
0395 #define CEPH_O_WRONLY       00000001
0396 #define CEPH_O_RDWR     00000002
0397 #define CEPH_O_CREAT        00000100
0398 #define CEPH_O_EXCL     00000200
0399 #define CEPH_O_TRUNC        00001000
0400 #define CEPH_O_DIRECTORY    00200000
0401 #define CEPH_O_NOFOLLOW     00400000
0402 
0403 union ceph_mds_request_args {
0404     struct {
0405         __le32 mask;                 /* CEPH_CAP_* */
0406     } __attribute__ ((packed)) getattr;
0407     struct {
0408         __le32 mode;
0409         __le32 uid;
0410         __le32 gid;
0411         struct ceph_timespec mtime;
0412         struct ceph_timespec atime;
0413         __le64 size, old_size;       /* old_size needed by truncate */
0414         __le32 mask;                 /* CEPH_SETATTR_* */
0415     } __attribute__ ((packed)) setattr;
0416     struct {
0417         __le32 frag;                 /* which dir fragment */
0418         __le32 max_entries;          /* how many dentries to grab */
0419         __le32 max_bytes;
0420         __le16 flags;
0421         __le32 offset_hash;
0422     } __attribute__ ((packed)) readdir;
0423     struct {
0424         __le32 mode;
0425         __le32 rdev;
0426     } __attribute__ ((packed)) mknod;
0427     struct {
0428         __le32 mode;
0429     } __attribute__ ((packed)) mkdir;
0430     struct {
0431         __le32 flags;
0432         __le32 mode;
0433         __le32 stripe_unit;          /* layout for newly created file */
0434         __le32 stripe_count;         /* ... */
0435         __le32 object_size;
0436         __le32 pool;
0437         __le32 mask;                 /* CEPH_CAP_* */
0438         __le64 old_size;
0439     } __attribute__ ((packed)) open;
0440     struct {
0441         __le32 flags;
0442         __le32 osdmap_epoch; /* used for setting file/dir layouts */
0443     } __attribute__ ((packed)) setxattr;
0444     struct {
0445         struct ceph_file_layout_legacy layout;
0446     } __attribute__ ((packed)) setlayout;
0447     struct {
0448         __u8 rule; /* currently fcntl or flock */
0449         __u8 type; /* shared, exclusive, remove*/
0450         __le64 owner; /* owner of the lock */
0451         __le64 pid; /* process id requesting the lock */
0452         __le64 start; /* initial location to lock */
0453         __le64 length; /* num bytes to lock from start */
0454         __u8 wait; /* will caller wait for lock to become available? */
0455     } __attribute__ ((packed)) filelock_change;
0456     struct {
0457         __le32 mask;                 /* CEPH_CAP_* */
0458         __le64 snapid;
0459         __le64 parent;
0460         __le32 hash;
0461     } __attribute__ ((packed)) lookupino;
0462 } __attribute__ ((packed));
0463 
0464 union ceph_mds_request_args_ext {
0465     union ceph_mds_request_args old;
0466     struct {
0467         __le32 mode;
0468         __le32 uid;
0469         __le32 gid;
0470         struct ceph_timespec mtime;
0471         struct ceph_timespec atime;
0472         __le64 size, old_size;       /* old_size needed by truncate */
0473         __le32 mask;                 /* CEPH_SETATTR_* */
0474         struct ceph_timespec btime;
0475     } __attribute__ ((packed)) setattr_ext;
0476 };
0477 
0478 #define CEPH_MDS_FLAG_REPLAY        1 /* this is a replayed op */
0479 #define CEPH_MDS_FLAG_WANT_DENTRY   2 /* want dentry in reply */
0480 #define CEPH_MDS_FLAG_ASYNC     4 /* request is asynchronous */
0481 
0482 struct ceph_mds_request_head_old {
0483     __le64 oldest_client_tid;
0484     __le32 mdsmap_epoch;           /* on client */
0485     __le32 flags;                  /* CEPH_MDS_FLAG_* */
0486     __u8 num_retry, num_fwd;       /* count retry, fwd attempts */
0487     __le16 num_releases;           /* # include cap/lease release records */
0488     __le32 op;                     /* mds op code */
0489     __le32 caller_uid, caller_gid;
0490     __le64 ino;                    /* use this ino for openc, mkdir, mknod,
0491                       etc. (if replaying) */
0492     union ceph_mds_request_args args;
0493 } __attribute__ ((packed));
0494 
0495 #define CEPH_MDS_REQUEST_HEAD_VERSION  1
0496 
0497 struct ceph_mds_request_head {
0498     __le16 version;                /* struct version */
0499     __le64 oldest_client_tid;
0500     __le32 mdsmap_epoch;           /* on client */
0501     __le32 flags;                  /* CEPH_MDS_FLAG_* */
0502     __u8 num_retry, num_fwd;       /* count retry, fwd attempts */
0503     __le16 num_releases;           /* # include cap/lease release records */
0504     __le32 op;                     /* mds op code */
0505     __le32 caller_uid, caller_gid;
0506     __le64 ino;                    /* use this ino for openc, mkdir, mknod,
0507                       etc. (if replaying) */
0508     union ceph_mds_request_args_ext args;
0509 } __attribute__ ((packed));
0510 
0511 /* cap/lease release record */
0512 struct ceph_mds_request_release {
0513     __le64 ino, cap_id;            /* ino and unique cap id */
0514     __le32 caps, wanted;           /* new issued, wanted */
0515     __le32 seq, issue_seq, mseq;
0516     __le32 dname_seq;              /* if releasing a dentry lease, a */
0517     __le32 dname_len;              /* string follows. */
0518 } __attribute__ ((packed));
0519 
0520 /* client reply */
0521 struct ceph_mds_reply_head {
0522     __le32 op;
0523     __le32 result;
0524     __le32 mdsmap_epoch;
0525     __u8 safe;                     /* true if committed to disk */
0526     __u8 is_dentry, is_target;     /* true if dentry, target inode records
0527                       are included with reply */
0528 } __attribute__ ((packed));
0529 
0530 /* one for each node split */
0531 struct ceph_frag_tree_split {
0532     __le32 frag;                   /* this frag splits... */
0533     __le32 by;                     /* ...by this many bits */
0534 } __attribute__ ((packed));
0535 
0536 struct ceph_frag_tree_head {
0537     __le32 nsplits;                /* num ceph_frag_tree_split records */
0538     struct ceph_frag_tree_split splits[];
0539 } __attribute__ ((packed));
0540 
0541 /* capability issue, for bundling with mds reply */
0542 struct ceph_mds_reply_cap {
0543     __le32 caps, wanted;           /* caps issued, wanted */
0544     __le64 cap_id;
0545     __le32 seq, mseq;
0546     __le64 realm;                  /* snap realm */
0547     __u8 flags;                    /* CEPH_CAP_FLAG_* */
0548 } __attribute__ ((packed));
0549 
0550 #define CEPH_CAP_FLAG_AUTH  (1 << 0)  /* cap is issued by auth mds */
0551 #define CEPH_CAP_FLAG_RELEASE   (1 << 1)  /* release the cap */
0552 
0553 /* inode record, for bundling with mds reply */
0554 struct ceph_mds_reply_inode {
0555     __le64 ino;
0556     __le64 snapid;
0557     __le32 rdev;
0558     __le64 version;                /* inode version */
0559     __le64 xattr_version;          /* version for xattr blob */
0560     struct ceph_mds_reply_cap cap; /* caps issued for this inode */
0561     struct ceph_file_layout_legacy layout;
0562     struct ceph_timespec ctime, mtime, atime;
0563     __le32 time_warp_seq;
0564     __le64 size, max_size, truncate_size;
0565     __le32 truncate_seq;
0566     __le32 mode, uid, gid;
0567     __le32 nlink;
0568     __le64 files, subdirs, rbytes, rfiles, rsubdirs;  /* dir stats */
0569     struct ceph_timespec rctime;
0570     struct ceph_frag_tree_head fragtree;  /* (must be at end of struct) */
0571 } __attribute__ ((packed));
0572 /* followed by frag array, symlink string, dir layout, xattr blob */
0573 
0574 /* reply_lease follows dname, and reply_inode */
0575 struct ceph_mds_reply_lease {
0576     __le16 mask;            /* lease type(s) */
0577     __le32 duration_ms;     /* lease duration */
0578     __le32 seq;
0579 } __attribute__ ((packed));
0580 
0581 #define CEPH_LEASE_VALID        (1 | 2) /* old and new bit values */
0582 #define CEPH_LEASE_PRIMARY_LINK 4       /* primary linkage */
0583 
0584 struct ceph_mds_reply_dirfrag {
0585     __le32 frag;            /* fragment */
0586     __le32 auth;            /* auth mds, if this is a delegation point */
0587     __le32 ndist;           /* number of mds' this is replicated on */
0588     __le32 dist[];
0589 } __attribute__ ((packed));
0590 
0591 #define CEPH_LOCK_FCNTL     1
0592 #define CEPH_LOCK_FLOCK     2
0593 #define CEPH_LOCK_FCNTL_INTR    3
0594 #define CEPH_LOCK_FLOCK_INTR    4
0595 
0596 
0597 #define CEPH_LOCK_SHARED   1
0598 #define CEPH_LOCK_EXCL     2
0599 #define CEPH_LOCK_UNLOCK   4
0600 
0601 struct ceph_filelock {
0602     __le64 start;/* file offset to start lock at */
0603     __le64 length; /* num bytes to lock; 0 for all following start */
0604     __le64 client; /* which client holds the lock */
0605     __le64 owner; /* owner the lock */
0606     __le64 pid; /* process id holding the lock on the client */
0607     __u8 type; /* shared lock, exclusive lock, or unlock */
0608 } __attribute__ ((packed));
0609 
0610 
0611 /* file access modes */
0612 #define CEPH_FILE_MODE_PIN        0
0613 #define CEPH_FILE_MODE_RD         1
0614 #define CEPH_FILE_MODE_WR         2
0615 #define CEPH_FILE_MODE_RDWR       3  /* RD | WR */
0616 #define CEPH_FILE_MODE_LAZY       4  /* lazy io */
0617 #define CEPH_FILE_MODE_BITS       4
0618 #define CEPH_FILE_MODE_MASK       ((1 << CEPH_FILE_MODE_BITS) - 1)
0619 
0620 int ceph_flags_to_mode(int flags);
0621 
0622 #define CEPH_INLINE_NONE    ((__u64)-1)
0623 
0624 /* capability bits */
0625 #define CEPH_CAP_PIN         1  /* no specific capabilities beyond the pin */
0626 
0627 /* generic cap bits */
0628 #define CEPH_CAP_GSHARED     1  /* client can reads */
0629 #define CEPH_CAP_GEXCL       2  /* client can read and update */
0630 #define CEPH_CAP_GCACHE      4  /* (file) client can cache reads */
0631 #define CEPH_CAP_GRD         8  /* (file) client can read */
0632 #define CEPH_CAP_GWR        16  /* (file) client can write */
0633 #define CEPH_CAP_GBUFFER    32  /* (file) client can buffer writes */
0634 #define CEPH_CAP_GWREXTEND  64  /* (file) client can extend EOF */
0635 #define CEPH_CAP_GLAZYIO   128  /* (file) client can perform lazy io */
0636 
0637 #define CEPH_CAP_SIMPLE_BITS  2
0638 #define CEPH_CAP_FILE_BITS    8
0639 
0640 /* per-lock shift */
0641 #define CEPH_CAP_SAUTH      2
0642 #define CEPH_CAP_SLINK      4
0643 #define CEPH_CAP_SXATTR     6
0644 #define CEPH_CAP_SFILE      8
0645 #define CEPH_CAP_SFLOCK    20
0646 
0647 #define CEPH_CAP_BITS      22
0648 
0649 /* composed values */
0650 #define CEPH_CAP_AUTH_SHARED  (CEPH_CAP_GSHARED  << CEPH_CAP_SAUTH)
0651 #define CEPH_CAP_AUTH_EXCL     (CEPH_CAP_GEXCL     << CEPH_CAP_SAUTH)
0652 #define CEPH_CAP_LINK_SHARED  (CEPH_CAP_GSHARED  << CEPH_CAP_SLINK)
0653 #define CEPH_CAP_LINK_EXCL     (CEPH_CAP_GEXCL     << CEPH_CAP_SLINK)
0654 #define CEPH_CAP_XATTR_SHARED (CEPH_CAP_GSHARED  << CEPH_CAP_SXATTR)
0655 #define CEPH_CAP_XATTR_EXCL    (CEPH_CAP_GEXCL     << CEPH_CAP_SXATTR)
0656 #define CEPH_CAP_FILE(x)    (x << CEPH_CAP_SFILE)
0657 #define CEPH_CAP_FILE_SHARED   (CEPH_CAP_GSHARED   << CEPH_CAP_SFILE)
0658 #define CEPH_CAP_FILE_EXCL     (CEPH_CAP_GEXCL     << CEPH_CAP_SFILE)
0659 #define CEPH_CAP_FILE_CACHE    (CEPH_CAP_GCACHE    << CEPH_CAP_SFILE)
0660 #define CEPH_CAP_FILE_RD       (CEPH_CAP_GRD       << CEPH_CAP_SFILE)
0661 #define CEPH_CAP_FILE_WR       (CEPH_CAP_GWR       << CEPH_CAP_SFILE)
0662 #define CEPH_CAP_FILE_BUFFER   (CEPH_CAP_GBUFFER   << CEPH_CAP_SFILE)
0663 #define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE)
0664 #define CEPH_CAP_FILE_LAZYIO   (CEPH_CAP_GLAZYIO   << CEPH_CAP_SFILE)
0665 #define CEPH_CAP_FLOCK_SHARED  (CEPH_CAP_GSHARED   << CEPH_CAP_SFLOCK)
0666 #define CEPH_CAP_FLOCK_EXCL    (CEPH_CAP_GEXCL     << CEPH_CAP_SFLOCK)
0667 
0668 
0669 /* cap masks (for getattr) */
0670 #define CEPH_STAT_CAP_INODE    CEPH_CAP_PIN
0671 #define CEPH_STAT_CAP_TYPE     CEPH_CAP_PIN  /* mode >> 12 */
0672 #define CEPH_STAT_CAP_SYMLINK  CEPH_CAP_PIN
0673 #define CEPH_STAT_CAP_UID      CEPH_CAP_AUTH_SHARED
0674 #define CEPH_STAT_CAP_GID      CEPH_CAP_AUTH_SHARED
0675 #define CEPH_STAT_CAP_MODE     CEPH_CAP_AUTH_SHARED
0676 #define CEPH_STAT_CAP_NLINK    CEPH_CAP_LINK_SHARED
0677 #define CEPH_STAT_CAP_LAYOUT   CEPH_CAP_FILE_SHARED
0678 #define CEPH_STAT_CAP_MTIME    CEPH_CAP_FILE_SHARED
0679 #define CEPH_STAT_CAP_SIZE     CEPH_CAP_FILE_SHARED
0680 #define CEPH_STAT_CAP_ATIME    CEPH_CAP_FILE_SHARED  /* fixme */
0681 #define CEPH_STAT_CAP_XATTR    CEPH_CAP_XATTR_SHARED
0682 #define CEPH_STAT_CAP_INODE_ALL (CEPH_CAP_PIN |         \
0683                  CEPH_CAP_AUTH_SHARED | \
0684                  CEPH_CAP_LINK_SHARED | \
0685                  CEPH_CAP_FILE_SHARED | \
0686                  CEPH_CAP_XATTR_SHARED)
0687 #define CEPH_STAT_CAP_INLINE_DATA (CEPH_CAP_FILE_SHARED | \
0688                    CEPH_CAP_FILE_RD)
0689 #define CEPH_STAT_RSTAT CEPH_CAP_FILE_WREXTEND
0690 
0691 #define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED |         \
0692                   CEPH_CAP_LINK_SHARED |            \
0693                   CEPH_CAP_XATTR_SHARED |           \
0694                   CEPH_CAP_FILE_SHARED)
0695 #define CEPH_CAP_ANY_RD   (CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_RD | \
0696                CEPH_CAP_FILE_CACHE)
0697 
0698 #define CEPH_CAP_ANY_EXCL (CEPH_CAP_AUTH_EXCL |     \
0699                CEPH_CAP_LINK_EXCL |     \
0700                CEPH_CAP_XATTR_EXCL |    \
0701                CEPH_CAP_FILE_EXCL)
0702 #define CEPH_CAP_ANY_FILE_RD (CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE | \
0703                   CEPH_CAP_FILE_SHARED)
0704 #define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | \
0705                   CEPH_CAP_FILE_EXCL)
0706 #define CEPH_CAP_ANY_WR   (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR)
0707 #define CEPH_CAP_ANY      (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \
0708                CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \
0709                CEPH_CAP_PIN)
0710 #define CEPH_CAP_ALL_FILE (CEPH_CAP_PIN | CEPH_CAP_ANY_SHARED | \
0711                CEPH_CAP_AUTH_EXCL | CEPH_CAP_XATTR_EXCL | \
0712                CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)
0713 
0714 #define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \
0715             CEPH_LOCK_IXATTR)
0716 
0717 /* cap masks async dir operations */
0718 #define CEPH_CAP_DIR_CREATE CEPH_CAP_FILE_CACHE
0719 #define CEPH_CAP_DIR_UNLINK CEPH_CAP_FILE_RD
0720 #define CEPH_CAP_ANY_DIR_OPS    (CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | \
0721                  CEPH_CAP_FILE_WREXTEND | CEPH_CAP_FILE_LAZYIO)
0722 
0723 int ceph_caps_for_mode(int mode);
0724 
0725 enum {
0726     CEPH_CAP_OP_GRANT,         /* mds->client grant */
0727     CEPH_CAP_OP_REVOKE,        /* mds->client revoke */
0728     CEPH_CAP_OP_TRUNC,         /* mds->client trunc notify */
0729     CEPH_CAP_OP_EXPORT,        /* mds has exported the cap */
0730     CEPH_CAP_OP_IMPORT,        /* mds has imported the cap */
0731     CEPH_CAP_OP_UPDATE,        /* client->mds update */
0732     CEPH_CAP_OP_DROP,          /* client->mds drop cap bits */
0733     CEPH_CAP_OP_FLUSH,         /* client->mds cap writeback */
0734     CEPH_CAP_OP_FLUSH_ACK,     /* mds->client flushed */
0735     CEPH_CAP_OP_FLUSHSNAP,     /* client->mds flush snapped metadata */
0736     CEPH_CAP_OP_FLUSHSNAP_ACK, /* mds->client flushed snapped metadata */
0737     CEPH_CAP_OP_RELEASE,       /* client->mds release (clean) cap */
0738     CEPH_CAP_OP_RENEW,         /* client->mds renewal request */
0739 };
0740 
0741 extern const char *ceph_cap_op_name(int op);
0742 
0743 /* flags field in client cap messages (version >= 10) */
0744 #define CEPH_CLIENT_CAPS_SYNC           (1<<0)
0745 #define CEPH_CLIENT_CAPS_NO_CAPSNAP     (1<<1)
0746 #define CEPH_CLIENT_CAPS_PENDING_CAPSNAP    (1<<2)
0747 
0748 /*
0749  * caps message, used for capability callbacks, acks, requests, etc.
0750  */
0751 struct ceph_mds_caps {
0752     __le32 op;                  /* CEPH_CAP_OP_* */
0753     __le64 ino, realm;
0754     __le64 cap_id;
0755     __le32 seq, issue_seq;
0756     __le32 caps, wanted, dirty; /* latest issued/wanted/dirty */
0757     __le32 migrate_seq;
0758     __le64 snap_follows;
0759     __le32 snap_trace_len;
0760 
0761     /* authlock */
0762     __le32 uid, gid, mode;
0763 
0764     /* linklock */
0765     __le32 nlink;
0766 
0767     /* xattrlock */
0768     __le32 xattr_len;
0769     __le64 xattr_version;
0770 
0771     /* a union of non-export and export bodies. */
0772     __le64 size, max_size, truncate_size;
0773     __le32 truncate_seq;
0774     struct ceph_timespec mtime, atime, ctime;
0775     struct ceph_file_layout_legacy layout;
0776     __le32 time_warp_seq;
0777 } __attribute__ ((packed));
0778 
0779 struct ceph_mds_cap_peer {
0780     __le64 cap_id;
0781     __le32 seq;
0782     __le32 mseq;
0783     __le32 mds;
0784     __u8   flags;
0785 } __attribute__ ((packed));
0786 
0787 /* cap release msg head */
0788 struct ceph_mds_cap_release {
0789     __le32 num;                /* number of cap_items that follow */
0790 } __attribute__ ((packed));
0791 
0792 struct ceph_mds_cap_item {
0793     __le64 ino;
0794     __le64 cap_id;
0795     __le32 migrate_seq, seq;
0796 } __attribute__ ((packed));
0797 
0798 #define CEPH_MDS_LEASE_REVOKE           1  /*    mds  -> client */
0799 #define CEPH_MDS_LEASE_RELEASE          2  /* client  -> mds    */
0800 #define CEPH_MDS_LEASE_RENEW            3  /* client <-> mds    */
0801 #define CEPH_MDS_LEASE_REVOKE_ACK       4  /* client  -> mds    */
0802 
0803 extern const char *ceph_lease_op_name(int o);
0804 
0805 /* lease msg header */
0806 struct ceph_mds_lease {
0807     __u8 action;            /* CEPH_MDS_LEASE_* */
0808     __le16 mask;            /* which lease */
0809     __le64 ino;
0810     __le64 first, last;     /* snap range */
0811     __le32 seq;
0812     __le32 duration_ms;     /* duration of renewal */
0813 } __attribute__ ((packed));
0814 /* followed by a __le32+string for dname */
0815 
0816 /* client reconnect */
0817 struct ceph_mds_cap_reconnect {
0818     __le64 cap_id;
0819     __le32 wanted;
0820     __le32 issued;
0821     __le64 snaprealm;
0822     __le64 pathbase;        /* base ino for our path to this ino */
0823     __le32 flock_len;       /* size of flock state blob, if any */
0824 } __attribute__ ((packed));
0825 /* followed by flock blob */
0826 
0827 struct ceph_mds_cap_reconnect_v1 {
0828     __le64 cap_id;
0829     __le32 wanted;
0830     __le32 issued;
0831     __le64 size;
0832     struct ceph_timespec mtime, atime;
0833     __le64 snaprealm;
0834     __le64 pathbase;        /* base ino for our path to this ino */
0835 } __attribute__ ((packed));
0836 
0837 struct ceph_mds_snaprealm_reconnect {
0838     __le64 ino;     /* snap realm base */
0839     __le64 seq;     /* snap seq for this snap realm */
0840     __le64 parent;  /* parent realm */
0841 } __attribute__ ((packed));
0842 
0843 /*
0844  * snaps
0845  */
0846 enum {
0847     CEPH_SNAP_OP_UPDATE,  /* CREATE or DESTROY */
0848     CEPH_SNAP_OP_CREATE,
0849     CEPH_SNAP_OP_DESTROY,
0850     CEPH_SNAP_OP_SPLIT,
0851 };
0852 
0853 extern const char *ceph_snap_op_name(int o);
0854 
0855 /* snap msg header */
0856 struct ceph_mds_snap_head {
0857     __le32 op;                /* CEPH_SNAP_OP_* */
0858     __le64 split;             /* ino to split off, if any */
0859     __le32 num_split_inos;    /* # inos belonging to new child realm */
0860     __le32 num_split_realms;  /* # child realms udner new child realm */
0861     __le32 trace_len;         /* size of snap trace blob */
0862 } __attribute__ ((packed));
0863 /* followed by split ino list, then split realms, then the trace blob */
0864 
0865 /*
0866  * encode info about a snaprealm, as viewed by a client
0867  */
0868 struct ceph_mds_snap_realm {
0869     __le64 ino;           /* ino */
0870     __le64 created;       /* snap: when created */
0871     __le64 parent;        /* ino: parent realm */
0872     __le64 parent_since;  /* snap: same parent since */
0873     __le64 seq;           /* snap: version */
0874     __le32 num_snaps;
0875     __le32 num_prior_parent_snaps;
0876 } __attribute__ ((packed));
0877 /* followed by my snap list, then prior parent snap list */
0878 
0879 /*
0880  * quotas
0881  */
0882 struct ceph_mds_quota {
0883     __le64 ino;     /* ino */
0884     struct ceph_timespec rctime;
0885     __le64 rbytes;      /* dir stats */
0886     __le64 rfiles;
0887     __le64 rsubdirs;
0888     __u8 struct_v;      /* compat */
0889     __u8 struct_compat;
0890     __le32 struct_len;
0891     __le64 max_bytes;   /* quota max. bytes */
0892     __le64 max_files;   /* quota max. files */
0893 } __attribute__ ((packed));
0894 
0895 #endif