Whamcloud - gitweb
LU-6349 ptlrpc: remove LUSTRE_MSG_MAGIC_V1 support
[fs/lustre-release.git] / lustre / include / lustre / lustre_idl.h
index d3dc0b0..7b7555f 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, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #define PTL_RPC_MSG_REPLY   4713
 
 /* DON'T use swabbed values of MAGIC as magic! */
-#define LUSTRE_MSG_MAGIC_V1 0x0BD00BD0
 #define LUSTRE_MSG_MAGIC_V2 0x0BD00BD3
-
-#define LUSTRE_MSG_MAGIC_V1_SWABBED 0xD00BD00B
 #define LUSTRE_MSG_MAGIC_V2_SWABBED 0xD30BD00B
 
 #define LUSTRE_MSG_MAGIC LUSTRE_MSG_MAGIC_V2
 #define LUSTRE_LOG_VERSION  0x00050000
 #define LUSTRE_MGS_VERSION  0x00060000
 
-typedef __u64 obd_id;
-typedef __u64 obd_seq;
-typedef __s64 obd_time;
-typedef __u64 obd_size;
-typedef __u64 obd_off;
-typedef __u64 obd_blocks;
-typedef __u64 obd_valid;
-typedef __u32 obd_blksize;
-typedef __u32 obd_mode;
-typedef __u32 obd_uid;
-typedef __u32 obd_gid;
-typedef __u32 obd_flag;
-typedef __u32 obd_count;
-
 /**
  * Describes a range of sequence, lsr_start is included but lsr_end is
  * not in the range.
@@ -368,6 +351,13 @@ extern void lustre_som_swab(struct som_attrs *attrs);
 
 #define SOM_INCOMPAT_SUPP 0x0
 
+/* copytool uses a 32b bitmask field to encode archive-Ids during register
+ * with MDT thru kuc.
+ * archive num = 0 => all
+ * archive num from 1 to 32
+ */
+#define LL_HSM_MAX_ARCHIVE (sizeof(__u32) * 8)
+
 /**
  * HSM on-disk attributes stored in a separate xattr.
  */
@@ -417,7 +407,7 @@ static inline void fid_zero(struct lu_fid *fid)
         memset(fid, 0, sizeof(*fid));
 }
 
-static inline obd_id fid_ver_oid(const struct lu_fid *fid)
+static inline __u64 fid_ver_oid(const struct lu_fid *fid)
 {
         return ((__u64)fid_ver(fid) << 32 | fid_oid(fid));
 }
@@ -483,7 +473,13 @@ enum dot_lustre_oid {
        FID_OID_DOT_LUSTRE_LPF  = 3UL,
 };
 
-static inline bool fid_seq_is_mdt0(obd_seq seq)
+/** OID for FID_SEQ_ROOT */
+enum root_oid {
+       FID_OID_ROOT            = 1UL,
+       FID_OID_ECHO_ROOT       = 2UL,
+};
+
+static inline bool fid_seq_is_mdt0(__u64 seq)
 {
        return seq == FID_SEQ_OST_MDT0;
 }
@@ -493,7 +489,7 @@ static inline bool fid_seq_is_mdt(__u64 seq)
        return seq == FID_SEQ_OST_MDT0 || seq >= FID_SEQ_NORMAL;
 };
 
-static inline bool fid_seq_is_echo(obd_seq seq)
+static inline bool fid_seq_is_echo(__u64 seq)
 {
        return seq == FID_SEQ_ECHO;
 }
@@ -503,7 +499,7 @@ static inline bool fid_is_echo(const struct lu_fid *fid)
        return fid_seq_is_echo(fid_seq(fid));
 }
 
-static inline bool fid_seq_is_llog(obd_seq seq)
+static inline bool fid_seq_is_llog(__u64 seq)
 {
        return seq == FID_SEQ_LLOG;
 }
@@ -553,14 +549,21 @@ static inline bool fid_is_mdt0(const struct lu_fid *fid)
 static inline void lu_root_fid(struct lu_fid *fid)
 {
        fid->f_seq = FID_SEQ_ROOT;
-       fid->f_oid = 1;
+       fid->f_oid = FID_OID_ROOT;
+       fid->f_ver = 0;
+}
+
+static inline void lu_echo_root_fid(struct lu_fid *fid)
+{
+       fid->f_seq = FID_SEQ_ROOT;
+       fid->f_oid = FID_OID_ECHO_ROOT;
        fid->f_ver = 0;
 }
 
 /**
  * Check if a fid is igif or not.
  * \param fid the fid to be tested.
- * \return true if the fid is a igif; otherwise false.
+ * \return true if the fid is an igif; otherwise false.
  */
 static inline bool fid_seq_is_igif(__u64 seq)
 {
@@ -575,7 +578,7 @@ static inline bool fid_is_igif(const struct lu_fid *fid)
 /**
  * Check if a fid is idif or not.
  * \param fid the fid to be tested.
- * \return true if the fid is a idif; otherwise false.
+ * \return true if the fid is an idif; otherwise false.
  */
 static inline bool fid_seq_is_idif(__u64 seq)
 {
@@ -608,18 +611,18 @@ static inline int fid_is_layout_rbtree(const struct lu_fid *fid)
 }
 
 /* convert an OST objid into an IDIF FID SEQ number */
-static inline obd_seq fid_idif_seq(obd_id id, __u32 ost_idx)
+static inline __u64 fid_idif_seq(__u64 id, __u32 ost_idx)
 {
        return FID_SEQ_IDIF | (ost_idx << 16) | ((id >> 32) & 0xffff);
 }
 
 /* convert a packed IDIF FID into an OST objid */
-static inline obd_id fid_idif_id(obd_seq seq, __u32 oid, __u32 ver)
+static inline __u64 fid_idif_id(__u64 seq, __u32 oid, __u32 ver)
 {
        return ((__u64)ver << 48) | ((seq & 0xffff) << 32) | oid;
 }
 
-static inline __u32 idif_ost_idx(obd_seq seq)
+static inline __u32 idif_ost_idx(__u64 seq)
 {
        return (seq >> 16) & 0xffff;
 }
@@ -631,7 +634,7 @@ static inline __u32 fid_idif_ost_idx(const struct lu_fid *fid)
 }
 
 /* extract OST sequence (group) from a wire ost_id (id/seq) pair */
-static inline obd_seq ostid_seq(const struct ost_id *ostid)
+static inline __u64 ostid_seq(const struct ost_id *ostid)
 {
        if (fid_seq_is_mdt0(ostid->oi.oi_seq))
                return FID_SEQ_OST_MDT0;
@@ -646,7 +649,7 @@ static inline obd_seq ostid_seq(const struct ost_id *ostid)
 }
 
 /* extract OST objid from a wire ost_id (id/seq) pair */
-static inline obd_id ostid_id(const struct ost_id *ostid)
+static inline __u64 ostid_id(const struct ost_id *ostid)
 {
        if (fid_seq_is_mdt0(ostid->oi.oi_seq))
                return ostid->oi.oi_id & IDIF_OID_MASK;
@@ -762,7 +765,7 @@ static inline int fid_set_id(struct lu_fid *fid, __u64 oid)
 static inline int ostid_to_fid(struct lu_fid *fid, const struct ost_id *ostid,
                               __u32 ost_idx)
 {
-       obd_seq seq = ostid_seq(ostid);
+       __u64 seq = ostid_seq(ostid);
 
        if (ost_idx > 0xffff) {
                CERROR("bad ost_idx, "DOSTID" ost_idx:%u\n", POSTID(ostid),
@@ -771,7 +774,7 @@ static inline int ostid_to_fid(struct lu_fid *fid, const struct ost_id *ostid,
        }
 
        if (fid_seq_is_mdt0(seq)) {
-               obd_id oid = ostid_id(ostid);
+               __u64 oid = ostid_id(ostid);
 
                /* This is a "legacy" (old 1.x/2.early) OST object in "group 0"
                 * that we map into the IDIF namespace.  It allows up to 2^48
@@ -831,8 +834,8 @@ static inline bool fid_is_last_id(const struct lu_fid *fid)
 }
 
 /**
- * Get inode number from a igif.
- * \param fid a igif to get inode number from.
+ * Get inode number from an igif.
+ * \param fid an igif to get inode number from.
  * \return inode number for the igif.
  */
 static inline ino_t lu_igif_ino(const struct lu_fid *fid)
@@ -843,8 +846,8 @@ static inline ino_t lu_igif_ino(const struct lu_fid *fid)
 extern void lustre_swab_ost_id(struct ost_id *oid);
 
 /**
- * Get inode generation from a igif.
- * \param fid a igif to get inode generation from.
+ * Get inode generation from an igif.
+ * \param fid an igif to get inode generation from.
  * \return inode generation for the igif.
  */
 static inline __u32 lu_igif_gen(const struct lu_fid *fid)
@@ -979,7 +982,7 @@ enum lu_dirent_attrs {
        LUDA_TYPE               = 0x0002,
        LUDA_64BITHASH          = 0x0004,
 
-       /* The following attrs are used for MDT interanl only,
+       /* The following attrs are used for MDT internal only,
         * not visible to client */
 
        /* Verify the dirent consistency */
@@ -1086,12 +1089,12 @@ static inline struct lu_dirent *lu_dirent_next(struct lu_dirent *ent)
         return next;
 }
 
-static inline int lu_dirent_calc_size(int namelen, __u16 attr)
+static inline size_t lu_dirent_calc_size(size_t namelen, __u16 attr)
 {
-        int size;
+       size_t size;
 
-        if (attr & LUDA_TYPE) {
-                const unsigned align = sizeof(struct luda_type) - 1;
+       if (attr & LUDA_TYPE) {
+               const size_t align = sizeof(struct luda_type) - 1;
                 size = (sizeof(struct lu_dirent) + namelen + align) & ~align;
                 size += sizeof(struct luda_type);
         } else
@@ -1100,15 +1103,6 @@ static inline int lu_dirent_calc_size(int namelen, __u16 attr)
         return (size + 7) & ~7;
 }
 
-static inline int lu_dirent_size(const struct lu_dirent *ent)
-{
-        if (le16_to_cpu(ent->lde_reclen) == 0) {
-                return lu_dirent_calc_size(le16_to_cpu(ent->lde_namelen),
-                                           le32_to_cpu(ent->lde_attrs));
-        }
-        return le16_to_cpu(ent->lde_reclen);
-}
-
 #define MDS_DIR_END_OFF 0xfffffffffffffffeULL
 
 /**
@@ -1171,15 +1165,16 @@ struct lustre_msg_v2 {
 
 /* without gss, ptlrpc_body is put at the first buffer. */
 #define PTLRPC_NUM_VERSIONS     4
-#define JOBSTATS_JOBID_SIZE     32  /* 32 bytes string */
 struct ptlrpc_body_v3 {
        struct lustre_handle pb_handle;
        __u32 pb_type;
        __u32 pb_version;
        __u32 pb_opc;
        __u32 pb_status;
-       __u64 pb_last_xid;
-       __u64 pb_last_seen;
+       __u64 pb_last_xid; /* highest replied XID without lower unreplied XID */
+       __u16 pb_tag;      /* virtual slot idx for multiple modifying RPCs */
+       __u16 pb_padding0;
+       __u32 pb_padding1;
        __u64 pb_last_committed;
        __u64 pb_transno;
        __u32 pb_flags;
@@ -1193,7 +1188,7 @@ struct ptlrpc_body_v3 {
        __u64 pb_pre_versions[PTLRPC_NUM_VERSIONS];
        /* padding for future needs */
        __u64 pb_padding[4];
-       char  pb_jobid[JOBSTATS_JOBID_SIZE];
+       char  pb_jobid[LUSTRE_JOBID_SIZE];
 };
 #define ptlrpc_body     ptlrpc_body_v3
 
@@ -1203,8 +1198,10 @@ struct ptlrpc_body_v2 {
         __u32 pb_version;
         __u32 pb_opc;
         __u32 pb_status;
-        __u64 pb_last_xid;
-        __u64 pb_last_seen;
+       __u64 pb_last_xid; /* highest replied XID without lower unreplied XID */
+       __u16 pb_tag;      /* virtual slot idx for multiple modifying RPCs */
+       __u16 pb_padding0;
+       __u32 pb_padding1;
         __u64 pb_last_committed;
         __u64 pb_transno;
         __u32 pb_flags;
@@ -1344,6 +1341,8 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
                                                       name in request */
 #define OBD_CONNECT_LFSCK      0x40000000000000ULL/* support online LFSCK */
 #define OBD_CONNECT_UNLINK_CLOSE 0x100000000000000ULL/* close file in unlink */
+#define OBD_CONNECT_MULTIMODRPCS 0x200000000000000ULL /* support multiple modify
+                                                        RPCs in parallel */
 #define OBD_CONNECT_DIR_STRIPE  0x400000000000000ULL /* striped DNE dir */
 
 /* XXX README XXX:
@@ -1423,25 +1422,6 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb);
  *
  * If we eventually have separate connect data for different types, which we
  * almost certainly will, then perhaps we stick a union in here. */
-struct obd_connect_data_v1 {
-       __u64 ocd_connect_flags; /* OBD_CONNECT_* per above */
-       __u32 ocd_version;       /* lustre release version number */
-       __u32 ocd_grant;         /* initial cache grant amount (bytes) */
-       __u32 ocd_index;         /* LOV index to connect to */
-       __u32 ocd_brw_size;      /* Maximum BRW size in bytes, must be 2^n */
-        __u64 ocd_ibits_known;   /* inode bits this client understands */
-        __u8  ocd_blocksize;     /* log2 of the backend filesystem blocksize */
-        __u8  ocd_inodespace;    /* log2 of the per-inode space consumption */
-        __u16 ocd_grant_extent;  /* per-extent grant overhead, in 1K blocks */
-        __u32 ocd_unused;        /* also fix lustre_swab_connect */
-        __u64 ocd_transno;       /* first transno from client to be replayed */
-        __u32 ocd_group;         /* MDS group on OST */
-        __u32 ocd_cksum_types;   /* supported checksum algorithms */
-        __u32 ocd_max_easize;    /* How big LOV EA can be on MDS */
-        __u32 ocd_instance;      /* also fix lustre_swab_connect */
-        __u64 ocd_maxbytes;      /* Maximum stripe size in bytes */
-};
-
 struct obd_connect_data {
        __u64 ocd_connect_flags; /* OBD_CONNECT_* per above */
        __u32 ocd_version;       /* lustre release version number */
@@ -1463,7 +1443,9 @@ struct obd_connect_data {
          * if the corresponding flag in ocd_connect_flags is set. Accessing
          * any field after ocd_maxbytes on the receiver without a valid flag
          * may result in out-of-bound memory access and kernel oops. */
-        __u64 padding1;          /* added 2.1.0. also fix lustre_swab_connect */
+       __u16 ocd_maxmodrpcs;    /* Maximum modify RPCs in parallel */
+       __u16 padding0;          /* added 2.1.0. also fix lustre_swab_connect */
+       __u32 padding1;          /* added 2.1.0. also fix lustre_swab_connect */
         __u64 padding2;          /* added 2.1.0. also fix lustre_swab_connect */
         __u64 padding3;          /* added 2.1.0. also fix lustre_swab_connect */
         __u64 padding4;          /* added 2.1.0. also fix lustre_swab_connect */
@@ -1580,6 +1562,8 @@ enum obdo_flags {
 #define LOV_MAGIC_JOIN_V1      (0x0BD20000 | LOV_MAGIC_MAGIC)
 #define LOV_MAGIC_V3           (0x0BD30000 | LOV_MAGIC_MAGIC)
 #define LOV_MAGIC_MIGRATE      (0x0BD40000 | LOV_MAGIC_MAGIC)
+/* reserved for specifying OSTs */
+#define LOV_MAGIC_SPECIFIC     (0x0BD50000 | LOV_MAGIC_MAGIC)
 #define LOV_MAGIC              LOV_MAGIC_V1
 
 /*
@@ -1710,8 +1694,14 @@ static inline void lmm_oi_cpu_to_le(struct ost_id *dst_oi,
 #define XATTR_NAME_VERSION      "trusted.version"
 #define XATTR_NAME_SOM         "trusted.som"
 #define XATTR_NAME_HSM         "trusted.hsm"
-#define XATTR_NAME_LFSCK_NAMESPACE "trusted.lfsck_namespace"
 #define XATTR_NAME_LFSCK_BITMAP "trusted.lfsck_bitmap"
+#define XATTR_NAME_DUMMY       "trusted.dummy"
+
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
+# define XATTR_NAME_LFSCK_NAMESPACE_OLD "trusted.lfsck_namespace"
+#endif
+
+#define XATTR_NAME_LFSCK_NAMESPACE "trusted.lfsck_ns"
 #define XATTR_NAME_MAX_LEN     32 /* increase this, if there is longer name. */
 
 struct lov_mds_md_v3 {            /* LOV EA mds/wire data (little-endian) */
@@ -1722,7 +1712,7 @@ struct lov_mds_md_v3 {            /* LOV EA mds/wire data (little-endian) */
        /* lmm_stripe_count used to be __u32 */
        __u16 lmm_stripe_count;   /* num stripes in use for this object */
        __u16 lmm_layout_gen;     /* layout generation number */
-       char  lmm_pool_name[LOV_MAXPOOLNAME]; /* must be 32bit aligned */
+       char  lmm_pool_name[LOV_MAXPOOLNAME + 1]; /* must be 32bit aligned */
        struct lov_ost_data_v1 lmm_objects[0]; /* per-stripe data */
 };
 
@@ -1919,25 +1909,25 @@ void lustre_swab_niobuf_remote(struct niobuf_remote *nbr);
 #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;
+       __u64   lvb_size;
+       __s64   lvb_mtime;
+       __s64   lvb_atime;
+       __s64   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;
-       __u32           lvb_mtime_ns;
-       __u32           lvb_atime_ns;
-       __u32           lvb_ctime_ns;
-       __u32           lvb_padding;
+       __u64   lvb_size;
+       __s64   lvb_mtime;
+       __s64   lvb_atime;
+       __s64   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);
@@ -2196,6 +2186,7 @@ extern void lustre_swab_generic_32s (__u32 *val);
 #define DISP_OPEN_LOCK       0x02000000
 #define DISP_OPEN_LEASE      0x04000000
 #define DISP_OPEN_STRIPE     0x08000000
+#define DISP_OPEN_DENY      0x10000000
 
 /* INODE LOCK PARTS */
 #define MDS_INODELOCK_LOOKUP 0x000001  /* For namespace, dentry etc, and also
@@ -2256,8 +2247,6 @@ enum md_op_flags {
        MF_GET_MDT_IDX          = (1 << 9),
 };
 
-#define MF_SOM_LOCAL_FLAGS (MF_SOM_CHANGE | MF_EPOCH_OPEN | MF_EPOCH_CLOSE)
-
 #define LUSTRE_BFLAG_UNCOMMITTED_WRITES   0x1
 
 /* these should be identical to their EXT4_*_FL counterparts, they are
@@ -2309,9 +2298,9 @@ struct mdt_body {
        struct lustre_handle mbo_handle;
        __u64   mbo_valid;
        __u64   mbo_size; /* Offset, in the case of MDS_READPAGE */
-       obd_time mbo_mtime;
-       obd_time mbo_atime;
-       obd_time mbo_ctime;
+       __s64   mbo_mtime;
+       __s64   mbo_atime;
+       __s64   mbo_ctime;
        __u64   mbo_blocks; /* XID, in the case of MDS_READPAGE */
        __u64   mbo_ioepoch;
        __u64   mbo_t_state; /* transient file state defined in
@@ -2394,9 +2383,9 @@ struct mdt_rec_setattr {
         __u32           sa_gid;
         __u64           sa_size;
         __u64           sa_blocks;
-        obd_time        sa_mtime;
-        obd_time        sa_atime;
-        obd_time        sa_ctime;
+       __s64           sa_mtime;
+       __s64           sa_atime;
+       __s64           sa_ctime;
         __u32           sa_attr_flags;
         __u32           sa_mode;
        __u32           sa_bias;      /* some operation flags */
@@ -2532,7 +2521,7 @@ struct mdt_rec_create {
         struct lu_fid   cr_fid1;
         struct lu_fid   cr_fid2;
         struct lustre_handle cr_old_handle; /* handle in case of open replay */
-        obd_time        cr_time;
+       __s64           cr_time;
         __u64           cr_rdev;
         __u64           cr_ioepoch;
         __u64           cr_padding_1;   /* rr_blocks */
@@ -2572,7 +2561,7 @@ struct mdt_rec_link {
         __u32           lk_suppgid2_h;
         struct lu_fid   lk_fid1;
         struct lu_fid   lk_fid2;
-        obd_time        lk_time;
+       __s64           lk_time;
         __u64           lk_padding_1;   /* rr_atime */
         __u64           lk_padding_2;   /* rr_ctime */
         __u64           lk_padding_3;   /* rr_size */
@@ -2599,7 +2588,7 @@ struct mdt_rec_unlink {
         __u32           ul_suppgid2_h;
         struct lu_fid   ul_fid1;
         struct lu_fid   ul_fid2;
-        obd_time        ul_time;
+       __s64           ul_time;
         __u64           ul_padding_2;   /* rr_atime */
         __u64           ul_padding_3;   /* rr_ctime */
         __u64           ul_padding_4;   /* rr_size */
@@ -2626,7 +2615,7 @@ struct mdt_rec_rename {
         __u32           rn_suppgid2_h;
         struct lu_fid   rn_fid1;
         struct lu_fid   rn_fid2;
-        obd_time        rn_time;
+       __s64           rn_time;
         __u64           rn_padding_1;   /* rr_atime */
         __u64           rn_padding_2;   /* rr_ctime */
         __u64           rn_padding_3;   /* rr_size */
@@ -2656,7 +2645,7 @@ struct mdt_rec_setxattr {
         __u32           sx_padding_2;
         __u32           sx_padding_3;
         __u64           sx_valid;
-        obd_time        sx_time;
+       __s64           sx_time;
         __u64           sx_padding_5;   /* rr_ctime */
         __u64           sx_padding_6;   /* rr_size */
         __u64           sx_padding_7;   /* rr_blocks */
@@ -2689,9 +2678,9 @@ struct mdt_rec_reint {
        __u32           rr_suppgid2_h;
        struct lu_fid   rr_fid1;
        struct lu_fid   rr_fid2;
-       obd_time        rr_mtime;
-       obd_time        rr_atime;
-       obd_time        rr_ctime;
+       __s64           rr_mtime;
+       __s64           rr_atime;
+       __s64           rr_ctime;
        __u64           rr_size;
        __u64           rr_blocks;
        __u32           rr_bias;
@@ -2738,7 +2727,7 @@ struct lmv_mds_md_v1 {
        __u32 lmv_padding1;
        __u64 lmv_padding2;
        __u64 lmv_padding3;
-       char lmv_pool_name[LOV_MAXPOOLNAME];    /* pool name */
+       char lmv_pool_name[LOV_MAXPOOLNAME + 1];        /* pool name */
        struct lu_fid lmv_stripe_fids[0];       /* FIDs for each stripe */
 };
 
@@ -2756,6 +2745,12 @@ struct lmv_mds_md_v1 {
 
 #define LMV_HASH_FLAG_MIGRATION        0x80000000
 #define LMV_HASH_FLAG_DEAD     0x40000000
+#define LMV_HASH_FLAG_BAD_TYPE 0x20000000
+
+/* The striped directory has ever lost its master LMV EA, then LFSCK
+ * re-generated it. This flag is used to indicate such case. It is an
+ * on-disk flag. */
+#define LMV_HASH_FLAG_LOST_LMV 0x10000000
 
 /**
  * The FNV-1a hash algorithm is as follows:
@@ -3150,14 +3145,14 @@ extern void lustre_swab_mgs_config_res(struct mgs_config_res *body);
 #define CM_START_SKIP (CM_START | CM_SKIP)
 
 struct cfg_marker {
-        __u32             cm_step;       /* aka config version */
-        __u32             cm_flags;
-        __u32             cm_vers;       /* lustre release version number */
-        __u32             cm_padding;    /* 64 bit align */
-        obd_time          cm_createtime; /*when this record was first created */
-        obd_time          cm_canceltime; /*when this record is no longer valid*/
-        char              cm_tgtname[MTI_NAME_MAXLEN];
-        char              cm_comment[MTI_NAME_MAXLEN];
+       __u32   cm_step;       /* aka config version */
+       __u32   cm_flags;
+       __u32   cm_vers;       /* lustre release version number */
+       __u32   cm_padding;    /* 64 bit align */
+       __s64   cm_createtime; /*when this record was first created */
+       __s64   cm_canceltime; /*when this record is no longer valid*/
+       char    cm_tgtname[MTI_NAME_MAXLEN];
+       char    cm_comment[MTI_NAME_MAXLEN];
 };
 
 extern void lustre_swab_cfg_marker(struct cfg_marker *marker,
@@ -3287,16 +3282,16 @@ struct llog_logid_rec {
 
 struct llog_unlink_rec {
        struct llog_rec_hdr     lur_hdr;
-       obd_id                  lur_oid;
-       obd_count               lur_oseq;
-       obd_count               lur_count;
+       __u64                   lur_oid;
+       __u32                   lur_oseq;
+       __u32                   lur_count;
        struct llog_rec_tail    lur_tail;
 } __attribute__((packed));
 
 struct llog_unlink64_rec {
        struct llog_rec_hdr     lur_hdr;
        struct lu_fid           lur_fid;
-       obd_count               lur_count; /* to destroy the lost precreated */
+       __u32                   lur_count; /* to destroy the lost precreated */
        __u32                   lur_padding1;
        __u64                   lur_padding2;
        __u64                   lur_padding3;
@@ -3330,8 +3325,10 @@ struct llog_size_change_rec {
 #define CHANGELOG_MINMASK (1 << CL_MARK)
 /** bits covering all \a changelog_rec_type's */
 #define CHANGELOG_ALLMASK 0XFFFFFFFF
-/** default \a changelog_rec_type mask */
-#define CHANGELOG_DEFMASK CHANGELOG_ALLMASK & ~(1 << CL_ATIME | 1 << CL_CLOSE)
+/** default \a changelog_rec_type mask. Allow all of them, except
+ * CL_ATIME since it can really be time consuming, and not necessary
+ * under normal use. */
+#define CHANGELOG_DEFMASK (CHANGELOG_ALLMASK & ~(1 << CL_ATIME))
 
 /* changelog llog name, needed by client replicators */
 #define CHANGELOG_CATALOG "changelog_catalog"
@@ -3343,15 +3340,9 @@ struct changelog_setinfo {
 
 /** changelog record */
 struct llog_changelog_rec {
-        struct llog_rec_hdr  cr_hdr;
-        struct changelog_rec cr;
-        struct llog_rec_tail cr_tail; /**< for_sizezof_only */
-} __attribute__((packed));
-
-struct llog_changelog_ext_rec {
-       struct llog_rec_hdr      cr_hdr;
-       struct changelog_ext_rec cr;
-       struct llog_rec_tail     cr_tail; /**< for_sizezof_only */
+       struct llog_rec_hdr  cr_hdr;
+       struct changelog_rec cr; /**< Variable length field */
+       struct llog_rec_tail cr_do_not_use; /**< for_sizeof_only */
 } __attribute__((packed));
 
 #define CHANGELOG_USER_PREFIX "cl"
@@ -3437,11 +3428,14 @@ enum llog_flag {
        LLOG_F_ZAP_WHEN_EMPTY   = 0x1,
        LLOG_F_IS_CAT           = 0x2,
        LLOG_F_IS_PLAIN         = 0x4,
+       LLOG_F_EXT_JOBID        = 0x8,
+
+       LLOG_F_EXT_MASK = LLOG_F_EXT_JOBID,
 };
 
 struct llog_log_hdr {
-        struct llog_rec_hdr     llh_hdr;
-        obd_time                llh_timestamp;
+       struct llog_rec_hdr     llh_hdr;
+       __s64                   llh_timestamp;
         __u32                   llh_count;
         __u32                   llh_bitmap_offset;
         __u32                   llh_size;
@@ -3499,37 +3493,37 @@ struct llogd_conn_body {
 
 /* Note: 64-bit types are 64-bit aligned in structure */
 struct obdo {
-        obd_valid               o_valid;        /* hot fields in this obdo */
-       struct ost_id           o_oi;
-        obd_id                  o_parent_seq;
-        obd_size                o_size;         /* o_size-o_blocks == ost_lvb */
-        obd_time                o_mtime;
-        obd_time                o_atime;
-        obd_time                o_ctime;
-        obd_blocks              o_blocks;       /* brw: cli sent cached bytes */
-        obd_size                o_grant;
-
-        /* 32-bit fields start here: keep an even number of them via padding */
-        obd_blksize             o_blksize;      /* optimal IO blocksize */
-        obd_mode                o_mode;         /* brw: cli sent cache remain */
-        obd_uid                 o_uid;
-        obd_gid                 o_gid;
-        obd_flag                o_flags;
-        obd_count               o_nlink;        /* brw: checksum */
-        obd_count               o_parent_oid;
-       obd_count               o_misc;         /* brw: o_dropped */
-
-        __u64                   o_ioepoch;      /* epoch in ost writes */
-        __u32                   o_stripe_idx;   /* holds stripe idx */
-        __u32                   o_parent_ver;
-        struct lustre_handle    o_handle;       /* brw: lock handle to prolong
-                                                 * locks */
-        struct llog_cookie      o_lcookie;      /* destroy: unlink cookie from
-                                                 * MDS */
+       __u64                   o_valid;        /* hot fields in this obdo */
+       struct ost_id           o_oi;
+       __u64                   o_parent_seq;
+       __u64                   o_size;         /* o_size-o_blocks == ost_lvb */
+       __s64                   o_mtime;
+       __s64                   o_atime;
+       __s64                   o_ctime;
+       __u64                   o_blocks;       /* brw: cli sent cached bytes */
+       __u64                   o_grant;
+
+       /* 32-bit fields start here: keep an even number of them via padding */
+       __u32                   o_blksize;      /* optimal IO blocksize */
+       __u32                   o_mode;         /* brw: cli sent cache remain */
+       __u32                   o_uid;
+       __u32                   o_gid;
+       __u32                   o_flags;
+       __u32                   o_nlink;        /* brw: checksum */
+       __u32                   o_parent_oid;
+       __u32                   o_misc;         /* brw: o_dropped */
+
+       __u64                   o_ioepoch;      /* epoch in ost writes */
+       __u32                   o_stripe_idx;   /* holds stripe idx */
+       __u32                   o_parent_ver;
+       struct lustre_handle    o_handle;       /* brw: lock handle to prolong
+                                                * locks */
+       struct llog_cookie      o_lcookie;      /* destroy: unlink cookie from
+                                                * MDS */
        __u32                   o_uid_h;
        __u32                   o_gid_h;
 
-       __u64                   o_data_version; /* getattr: sum of iversion for
+       __u64                   o_data_version; /* getattr: sum of iversion for
                                                 * each stripe.
                                                 * brw: grant space consumed on
                                                 * the client for the write */
@@ -3562,8 +3556,8 @@ struct lfsck_request {
        struct lu_fid   lr_fid;
        struct lu_fid   lr_fid2;
        struct lu_fid   lr_fid3;
+       __u64           lr_padding_1;
        __u64           lr_padding_2;
-       __u64           lr_padding_3;
 };
 
 void lustre_swab_lfsck_request(struct lfsck_request *lr);
@@ -3588,12 +3582,18 @@ enum lfsck_events {
        LE_PEER_EXIT            = 9,
        LE_CONDITIONAL_DESTROY  = 10,
        LE_PAIRS_VERIFY         = 11,
-       LE_CREATE_ORPHAN        = 12,
+       LE_SKIP_NLINK_DECLARE   = 13,
+       LE_SKIP_NLINK           = 14,
+       LE_SET_LMV_MASTER       = 15,
+       LE_SET_LMV_SLAVE        = 16,
 };
 
 enum lfsck_event_flags {
        LEF_TO_OST              = 0x00000001,
        LEF_FROM_OST            = 0x00000002,
+       LEF_SET_LMV_HASH        = 0x00000004,
+       LEF_SET_LMV_ALL         = 0x00000008,
+       LEF_RECHECK_NAME_HASH   = 0x00000010,
 };
 
 static inline void lustre_set_wire_obdo(const struct obd_connect_data *ocd,
@@ -3618,7 +3618,7 @@ static inline void lustre_get_wire_obdo(const struct obd_connect_data *ocd,
                                        struct obdo *lobdo,
                                        const struct obdo *wobdo)
 {
-        obd_flag local_flags = 0;
+       __u32 local_flags = 0;
 
         if (lobdo->o_valid & OBD_MD_FLFLAGS)
                  local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK;
@@ -3656,7 +3656,7 @@ struct ll_fiemap_info_key {
 };
 
 extern void lustre_swab_ost_body (struct ost_body *b);
-extern void lustre_swab_ost_last_id(obd_id *id);
+extern void lustre_swab_ost_last_id(__u64 *id);
 extern void lustre_swab_fiemap(struct ll_user_fiemap *fiemap);
 
 extern void lustre_swab_lov_user_md_v1(struct lov_user_md_v1 *lum);
@@ -3664,6 +3664,8 @@ extern void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum);
 extern void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod,
                                             int stripe_count);
 extern void lustre_swab_lov_mds_md(struct lov_mds_md *lmm);
+void lustre_print_user_md(unsigned int level, struct lov_user_md *lum,
+                         const char *msg);
 
 /* llog_swab.c */
 extern void lustre_swab_llogd_body (struct llogd_body *d);
@@ -3900,6 +3902,14 @@ struct getinfo_fid2path {
 
 void lustre_swab_fid2path (struct getinfo_fid2path *gf);
 
+/** path2parent request/reply structures */
+struct getparent {
+       struct lu_fid   gp_fid;         /**< parent FID */
+       __u32           gp_linkno;      /**< hardlink number */
+       __u32           gp_name_size;   /**< size of the name field */
+       char            gp_name[0];     /**< zero-terminated link name */
+} __attribute__((packed));
+
 enum {
         LAYOUT_INTENT_ACCESS    = 0,
         LAYOUT_INTENT_READ      = 1,