Whamcloud - gitweb
LU-1445 fid: Add DATA fid type in fid_request.
[fs/lustre-release.git] / lustre / include / lustre / lustre_idl.h
index 5d80e49..6dc2a5b 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -265,6 +265,8 @@ static inline int range_compare_loc(const struct lu_seq_range *r1,
 
 /**
  * Flags for lustre_mdt_attrs::lma_compat and lustre_mdt_attrs::lma_incompat.
+ * Deprecated since HSM and SOM attributes are now stored in separate on-disk
+ * xattr.
  */
 enum lma_compat {
         LMAC_HSM = 0x00000001,
@@ -275,9 +277,10 @@ enum lma_compat {
  * Masks for all features that should be supported by a Lustre version to
  * access a specific file.
  * This information is stored in lustre_mdt_attrs::lma_incompat.
- *
- * NOTE: No incompat feature should be added before bug #17670 is landed.
  */
+enum lma_incompat {
+       LMAI_RELEASED = 0x0000001, /* file is released */
+};
 #define LMA_INCOMPAT_SUPP 0x0
 
 /**
@@ -300,59 +303,56 @@ struct lustre_mdt_attrs {
         struct lu_fid  lma_self_fid;
         /** mdt/ost type, others */
         __u64   lma_flags;
-        /* IO Epoch SOM attributes belongs to */
-        __u64   lma_ioepoch;
-        /** total file size in objects */
-        __u64   lma_som_size;
-        /** total fs blocks in objects */
-        __u64   lma_som_blocks;
-        /** mds mount id the size is valid for */
-        __u64   lma_som_mountid;
 };
 
 /**
- * Fill \a lma with its first content.
- * Only fid is stored.
+ * Prior to 2.4, the LMA structure also included SOM attributes which has since
+ * been moved to a dedicated xattr
  */
-static inline void lustre_lma_init(struct lustre_mdt_attrs *lma,
-                                   const struct lu_fid *fid)
-{
-        lma->lma_compat      = 0;
-        lma->lma_incompat    = 0;
-        memcpy(&lma->lma_self_fid, fid, sizeof(*fid));
-        lma->lma_flags       = 0;
-        lma->lma_ioepoch     = 0;
-        lma->lma_som_size    = 0;
-        lma->lma_som_blocks  = 0;
-        lma->lma_som_mountid = 0;
+#define LMA_OLD_SIZE (sizeof(struct lustre_mdt_attrs) + 4 * sizeof(__u64))
+
+extern void lustre_lma_swab(struct lustre_mdt_attrs *lma);
+extern void lustre_lma_init(struct lustre_mdt_attrs *lma,
+                           const struct lu_fid *fid);
+/**
+ * SOM on-disk attributes stored in a separate xattr.
+ */
+struct som_attrs {
+       /** Bitfield for supported data in this structure. For future use. */
+       __u32   som_compat;
 
-        /* If a field is added in struct lustre_mdt_attrs, zero it explicitly
-         * and change the test below. */
-        LASSERT(sizeof(*lma) ==
-                (offsetof(struct lustre_mdt_attrs, lma_som_mountid) +
-                 sizeof(lma->lma_som_mountid)));
+       /** Incompat feature list. The supported feature mask is availabe in
+        * SOM_INCOMPAT_SUPP */
+       __u32   som_incompat;
+
+       /** IO Epoch SOM attributes belongs to */
+       __u64   som_ioepoch;
+       /** total file size in objects */
+       __u64   som_size;
+       /** total fs blocks in objects */
+       __u64   som_blocks;
+       /** mds mount id the size is valid for */
+       __u64   som_mountid;
 };
+extern void lustre_som_swab(struct som_attrs *attrs);
 
-extern void lustre_swab_lu_fid(struct lu_fid *fid);
+#define SOM_INCOMPAT_SUPP 0x0
 
 /**
- * Swab, if needed, lustre_mdt_attr struct to on-disk format.
- * Otherwise, do not touch it.
+ * HSM on-disk attributes stored in a separate xattr.
  */
-static inline void lustre_lma_swab(struct lustre_mdt_attrs *lma)
-{
-        /* Use LUSTRE_MSG_MAGIC to detect local endianess. */
-        if (LUSTRE_MSG_MAGIC != cpu_to_le32(LUSTRE_MSG_MAGIC)) {
-                __swab32s(&lma->lma_compat);
-                __swab32s(&lma->lma_incompat);
-                lustre_swab_lu_fid(&lma->lma_self_fid);
-                __swab64s(&lma->lma_flags);
-                __swab64s(&lma->lma_ioepoch);
-                __swab64s(&lma->lma_som_size);
-                __swab64s(&lma->lma_som_blocks);
-                __swab64s(&lma->lma_som_mountid);
-        }
+struct hsm_attrs {
+       /** Bitfield for supported data in this structure. For future use. */
+       __u32   hsm_compat;
+
+       /** HSM flags, see hsm_flags enum below */
+       __u32   hsm_flags;
+       /** backend archive id associated with the file */
+       __u64   hsm_arch_id;
+       /** version associated with the last archiving, if any */
+       __u64   hsm_arch_ver;
 };
+extern void lustre_hsm_swab(struct hsm_attrs *attrs);
 
 /* This is the maximum number of MDTs allowed in CMD testing until such
  * a time that FID-on-OST is implemented.  This is due to the limitations
@@ -455,16 +455,30 @@ static inline int fid_seq_is_mdt0(obd_seq seq)
         return (seq == FID_SEQ_OST_MDT0);
 }
 
-static inline int fid_seq_is_cmd(const __u64 seq)
+static inline int fid_seq_is_mdt(const __u64 seq)
 {
-        return (seq >= FID_SEQ_OST_MDT1 && seq <= FID_SEQ_OST_MAX);
+       return seq == FID_SEQ_OST_MDT0 || seq >= FID_SEQ_NORMAL;
 };
 
-static inline int fid_seq_is_mdt(const __u64 seq)
+static inline int fid_seq_is_echo(obd_seq seq)
 {
-        return seq == FID_SEQ_OST_MDT0 ||
-               (seq >= FID_SEQ_OST_MDT1 && seq <= FID_SEQ_OST_MAX);
-};
+       return (seq == FID_SEQ_ECHO);
+}
+
+static inline int fid_is_echo(const struct lu_fid *fid)
+{
+       return fid_seq_is_echo(fid_seq(fid));
+}
+
+static inline int fid_seq_is_llog(obd_seq seq)
+{
+       return (seq == FID_SEQ_LLOG);
+}
+
+static inline int fid_is_llog(const struct lu_fid *fid)
+{
+       return fid_seq_is_llog(fid_seq(fid));
+}
 
 static inline int fid_seq_is_rsvd(const __u64 seq)
 {
@@ -679,6 +693,13 @@ static inline obd_id ostid_id(struct ost_id *ostid)
         return ostid->oi_id;
 }
 
+/* Check whether the fid is for LAST_ID */
+static inline int fid_is_last_id(const struct lu_fid *fid)
+{
+       return (fid_is_idif(fid) || fid_is_norm(fid) || fid_is_echo(fid)) &&
+               fid_oid(fid) == 0;
+}
+
 /**
  * Get inode number from a igif.
  * \param fid a igif to get inode number from.
@@ -768,11 +789,10 @@ static inline void fid_be_to_cpu(struct lu_fid *dst, const struct lu_fid *src)
 
 static inline int fid_is_sane(const struct lu_fid *fid)
 {
-        return
-                fid != NULL &&
-                ((fid_seq(fid) >= FID_SEQ_START && fid_oid(fid) != 0
-                                                && fid_ver(fid) == 0) ||
-                fid_is_igif(fid) || fid_seq_is_rsvd(fid_seq(fid)));
+       return fid != NULL &&
+              ((fid_seq(fid) >= FID_SEQ_START && fid_ver(fid) == 0) ||
+              fid_is_igif(fid) || fid_is_idif(fid) ||
+              fid_seq_is_rsvd(fid_seq(fid)));
 }
 
 static inline int fid_is_zero(const struct lu_fid *fid)
@@ -1165,8 +1185,10 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
                                                   * RPC error properly */
 #define OBD_CONNECT_GRANT_PARAM 0x100000000000ULL/* extra grant params used for
                                                   * finer space reservation */
-#define OBD_CONNECT_NANOSEC_TIME 0x200000000000ULL /* nanosecond timestamps */
+#define OBD_CONNECT_FLOCK_OWNER 0x200000000000ULL /* for the fixed 1.8
+                                                  * policy and 2.x server */
 #define OBD_CONNECT_LVB_TYPE   0x400000000000ULL /* variable type of LVB */
+#define OBD_CONNECT_NANOSEC_TIME 0x800000000000ULL /* nanosecond timestamps */
 #define OBD_CONNECT_LIGHTWEIGHT 0x1000000000000ULL/* lightweight connection */
 #define OBD_CONNECT_SHORTIO     0x2000000000000ULL/* short io */
 /* XXX README XXX:
@@ -1207,7 +1229,8 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
                                 OBD_CONNECT_SOM | OBD_CONNECT_FULL20 | \
                                OBD_CONNECT_64BITHASH | OBD_CONNECT_JOBSTATS | \
                                OBD_CONNECT_EINPROGRESS | \
-                               OBD_CONNECT_LIGHTWEIGHT)
+                               OBD_CONNECT_LIGHTWEIGHT | OBD_CONNECT_UMASK | \
+                               OBD_CONNECT_LVB_TYPE | OBD_CONNECT_LAYOUTLOCK)
 #define OST_CONNECT_SUPPORTED  (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \
                                 OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \
                                 OBD_CONNECT_TRUNCLOCK | OBD_CONNECT_INDEX | \
@@ -1221,7 +1244,9 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
                                 OBD_CONNECT_64BITHASH | OBD_CONNECT_MAXBYTES | \
                                 OBD_CONNECT_MAX_EASIZE | \
                                OBD_CONNECT_EINPROGRESS | \
-                               OBD_CONNECT_JOBSTATS | OBD_CONNECT_LIGHTWEIGHT)
+                               OBD_CONNECT_JOBSTATS | \
+                               OBD_CONNECT_LIGHTWEIGHT | OBD_CONNECT_LVB_TYPE|\
+                               OBD_CONNECT_LAYOUTLOCK)
 #define ECHO_CONNECT_SUPPORTED (0)
 #define MGS_CONNECT_SUPPORTED  (OBD_CONNECT_VERSION | OBD_CONNECT_AT | \
                                OBD_CONNECT_FULL20 | OBD_CONNECT_IMP_RECOV | \
@@ -1447,6 +1472,8 @@ struct lov_mds_md_v1 {            /* LOV EA mds/wire data (little-endian) */
 #define XATTR_NAME_LINK         "trusted.link"
 #define XATTR_NAME_FID          "trusted.fid"
 #define XATTR_NAME_VERSION      "trusted.version"
+#define XATTR_NAME_SOM         "trusted.som"
+#define XATTR_NAME_HSM         "trusted.hsm"
 
 
 struct lov_mds_md_v3 {            /* LOV EA mds/wire data (little-endian) */
@@ -1499,7 +1526,10 @@ struct lov_mds_md_v3 {            /* LOV EA mds/wire data (little-endian) */
 #define OBD_MD_MDS         (0x0000000100000000ULL) /* where an inode lives on */
 #define OBD_MD_REINT       (0x0000000200000000ULL) /* reintegrate oa */
 #define OBD_MD_MEA         (0x0000000400000000ULL) /* CMD split EA  */
-#define OBD_MD_MDTIDX      (0x0000000800000000ULL) /* Get MDT index  */
+
+/* OBD_MD_MDTIDX is used to get MDT index, but it is never been used overwire,
+ * and it is already obsolete since 2.3 */
+/* #define OBD_MD_MDTIDX      (0x0000000800000000ULL) */
 
 #define OBD_MD_FLXATTR       (0x0000001000000000ULL) /* xattr */
 #define OBD_MD_FLXATTRLS     (0x0000002000000000ULL) /* xattr list */
@@ -1587,14 +1617,30 @@ extern void lustre_swab_niobuf_remote (struct niobuf_remote *nbr);
         do { blocks = OST_LVB_ERR_INIT + rc; } while (0)
 #define OST_LVB_GET_ERR(blocks)    (int)(blocks - OST_LVB_ERR_INIT)
 
+struct ost_lvb_v1 {
+       __u64           lvb_size;
+       obd_time        lvb_mtime;
+       obd_time        lvb_atime;
+       obd_time        lvb_ctime;
+       __u64           lvb_blocks;
+};
+
+extern void lustre_swab_ost_lvb_v1(struct ost_lvb_v1 *lvb);
+
 struct ost_lvb {
-        __u64     lvb_size;
-        obd_time  lvb_mtime;
-        obd_time  lvb_atime;
-        obd_time  lvb_ctime;
-        __u64     lvb_blocks;
+       __u64           lvb_size;
+       obd_time        lvb_mtime;
+       obd_time        lvb_atime;
+       obd_time        lvb_ctime;
+       __u64           lvb_blocks;
+       __u32           lvb_mtime_ns;
+       __u32           lvb_atime_ns;
+       __u32           lvb_ctime_ns;
+       __u32           lvb_padding;
 };
 
+extern void lustre_swab_ost_lvb(struct ost_lvb *lvb);
+
 /*
  *   lquota data structures
  */
@@ -1743,7 +1789,7 @@ struct ldlm_gl_lquota_desc {
        __u64           gl_ver;   /* new index version */
        __u64           gl_hardlimit; /* new hardlimit or qunit value */
        __u64           gl_softlimit; /* new softlimit */
-       __u64           gl_pad1;
+       __u64           gl_time;
        __u64           gl_pad2;
 };
 #define gl_qunit       gl_hardlimit /* current qunit value used when
@@ -1761,6 +1807,8 @@ struct lquota_lvb {
        __u64   lvb_pad1;
 };
 
+extern void lustre_swab_lquota_lvb(struct lquota_lvb *lvb);
+
 /* LVB used with global quota lock */
 #define lvb_glb_ver  lvb_id_may_rel /* current version of the global index */
 
@@ -1841,10 +1889,7 @@ extern void lustre_swab_generic_32s (__u32 *val);
 #define MDS_INODELOCK_OPEN   0x000004       /* For opened files */
 #define MDS_INODELOCK_LAYOUT 0x000008       /* for layout */
 
-/* Do not forget to increase MDS_INODELOCK_MAXSHIFT when adding new bits
- * XXX: MDS_INODELOCK_MAXSHIFT should be increased to 3 once the layout lock is
- * supported */
-#define MDS_INODELOCK_MAXSHIFT 2
+#define MDS_INODELOCK_MAXSHIFT 3
 /* This FULL lock is useful to take on unlink sort of operations */
 #define MDS_INODELOCK_FULL ((1<<(MDS_INODELOCK_MAXSHIFT+1))-1)
 
@@ -1867,19 +1912,20 @@ enum {
 
 /* mdt_thread_info.mti_flags. */
 enum md_op_flags {
-        /* The flag indicates Size-on-MDS attributes are changed. */
-        MF_SOM_CHANGE           = (1 << 0),
-        /* Flags indicates an epoch opens or closes. */
-        MF_EPOCH_OPEN           = (1 << 1),
-        MF_EPOCH_CLOSE          = (1 << 2),
-        MF_MDC_CANCEL_FID1      = (1 << 3),
-        MF_MDC_CANCEL_FID2      = (1 << 4),
-        MF_MDC_CANCEL_FID3      = (1 << 5),
-        MF_MDC_CANCEL_FID4      = (1 << 6),
-        /* There is a pending attribute update. */
-        MF_SOM_AU               = (1 << 7),
-        /* Cancel OST locks while getattr OST attributes. */
-        MF_GETATTR_LOCK         = (1 << 8),
+       /* The flag indicates Size-on-MDS attributes are changed. */
+       MF_SOM_CHANGE           = (1 << 0),
+       /* Flags indicates an epoch opens or closes. */
+       MF_EPOCH_OPEN           = (1 << 1),
+       MF_EPOCH_CLOSE          = (1 << 2),
+       MF_MDC_CANCEL_FID1      = (1 << 3),
+       MF_MDC_CANCEL_FID2      = (1 << 4),
+       MF_MDC_CANCEL_FID3      = (1 << 5),
+       MF_MDC_CANCEL_FID4      = (1 << 6),
+       /* There is a pending attribute update. */
+       MF_SOM_AU               = (1 << 7),
+       /* Cancel OST locks while getattr OST attributes. */
+       MF_GETATTR_LOCK         = (1 << 8),
+       MF_GET_MDT_IDX          = (1 << 9),
 };
 
 #define MF_SOM_LOCAL_FLAGS (MF_SOM_CHANGE | MF_EPOCH_OPEN | MF_EPOCH_CLOSE)
@@ -2018,7 +2064,7 @@ struct mdt_rec_setattr {
         obd_time        sa_ctime;
         __u32           sa_attr_flags;
         __u32           sa_mode;
-        __u32           sa_padding_2;
+       __u32           sa_bias;      /* some operation flags */
         __u32           sa_padding_3;
         __u32           sa_padding_4;
         __u32           sa_padding_5;
@@ -2081,11 +2127,7 @@ extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa);
                                            * anymore, reserve this flags
                                            * just for preventing such bit
                                            * to be reused. */
-#define MDS_CREATE_RMT_ACL    01000000000 /* indicate create on remote server
-                                           * with default ACL */
-#define MDS_CREATE_SLAVE_OBJ  02000000000 /* indicate create slave object
-                                           * actually, this is for create, not
-                                           * conflict with other open flags */
+
 #define MDS_OPEN_LOCK         04000000000 /* This open requires open lock */
 #define MDS_OPEN_HAS_EA      010000000000 /* specify object create pattern */
 #define MDS_OPEN_HAS_OBJS    020000000000 /* Just set the EA the obj exist */
@@ -2120,6 +2162,7 @@ enum {
         MDS_CLOSE_CLEANUP = 1 << 6,
         MDS_KEEP_ORPHAN   = 1 << 7,
         MDS_RECOV_OPEN    = 1 << 8,
+       MDS_DATA_MODIFIED = 1 << 9,
 };
 
 /* instance of mdt_reint_rec */
@@ -2148,7 +2191,7 @@ struct mdt_rec_create {
          * extend cr_flags size without breaking 1.8 compat */
         __u32           cr_flags_l;     /* for use with open, low  32 bits  */
         __u32           cr_flags_h;     /* for use with open, high 32 bits */
-        __u32           cr_padding_3;   /* rr_padding_3 */
+        __u32           cr_umask;       /* umask for create */
         __u32           cr_padding_4;   /* rr_padding_4 */
 };
 
@@ -2493,16 +2536,6 @@ typedef union {
 
 extern void lustre_swab_ldlm_policy_data (ldlm_wire_policy_data_t *d);
 
-/* Similarly to ldlm_wire_policy_data_t, there is one common swabber for all
- * LVB types. As a result, any new LVB structure must match the fields of the
- * ost_lvb structure. */
-union ldlm_wire_lvb {
-       struct ost_lvb          l_ost;
-       struct lquota_lvb       l_lquota;
-};
-
-extern void lustre_swab_lvb(union ldlm_wire_lvb *);
-
 union ldlm_gl_desc {
        struct ldlm_gl_lquota_desc      lquota_desc;
 };
@@ -2566,6 +2599,9 @@ struct ldlm_reply {
 
 extern void lustre_swab_ldlm_reply (struct ldlm_reply *r);
 
+#define ldlm_flags_to_wire(flags)    ((__u32)(flags))
+#define ldlm_flags_from_wire(flags)  ((__u64)(flags))
+
 /*
  * Opcodes for mountconf (mgs and mgc)
  */
@@ -3231,6 +3267,25 @@ struct getinfo_fid2path {
 
 void lustre_swab_fid2path (struct getinfo_fid2path *gf);
 
+enum {
+        LAYOUT_INTENT_ACCESS    = 0,
+        LAYOUT_INTENT_READ      = 1,
+        LAYOUT_INTENT_WRITE     = 2,
+        LAYOUT_INTENT_GLIMPSE   = 3,
+        LAYOUT_INTENT_TRUNC     = 4,
+        LAYOUT_INTENT_RELEASE   = 5,
+        LAYOUT_INTENT_RESTORE   = 6
+};
+
+/* enqueue layout lock with intent */
+struct layout_intent {
+       __u32 li_opc; /* intent operation for enqueue, read, write etc */
+       __u32 li_flags;
+       __u64 li_start;
+       __u64 li_end;
+};
+
+void lustre_swab_layout_intent(struct layout_intent *li);
 
 #endif
 /** @} lustreidl */