Whamcloud - gitweb
LU-10698 obdclass: allow specifying complex jobids
[fs/lustre-release.git] / lustre / ptlrpc / pack_generic.c
index 8df8ea8..a66b6d4 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -42,8 +42,6 @@
 
 #include <libcfs/libcfs.h>
 
-#include <lustre/ll_fiemap.h>
-
 #include <llog_swab.h>
 #include <lustre_net.h>
 #include <lustre_swab.h>
@@ -92,13 +90,15 @@ int ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout,
 }
 
 static inline int lustre_msg_check_version_v2(struct lustre_msg_v2 *msg,
-                                               __u32 version)
+                                             enum lustre_msg_version version)
 {
-        __u32 ver = lustre_msg_get_version(msg);
-        return (ver & LUSTRE_VERSION_MASK) != version;
+       enum lustre_msg_version ver = lustre_msg_get_version(msg);
+
+       return (ver & LUSTRE_VERSION_MASK) != version;
 }
 
-int lustre_msg_check_version(struct lustre_msg *msg, __u32 version)
+int lustre_msg_check_version(struct lustre_msg *msg,
+                            enum lustre_msg_version version)
 {
 #define LUSTRE_MSG_MAGIC_V1 0x0BD00BD0
        switch (msg->lm_magic) {
@@ -185,6 +185,7 @@ __u32 lustre_packed_msg_size(struct lustre_msg *msg)
                 return 0;
         }
 }
+EXPORT_SYMBOL(lustre_packed_msg_size);
 
 void lustre_init_msg_v2(struct lustre_msg_v2 *msg, int count, __u32 *lens,
                         char **bufs)
@@ -202,11 +203,14 @@ void lustre_init_msg_v2(struct lustre_msg_v2 *msg, int count, __u32 *lens,
         if (bufs == NULL)
                 return;
 
-        ptr = (char *)msg + lustre_msg_hdr_size_v2(count);
-        for (i = 0; i < count; i++) {
-                char *tmp = bufs[i];
-                LOGL(tmp, lens[i], ptr);
-        }
+       ptr = (char *)msg + lustre_msg_hdr_size_v2(count);
+       for (i = 0; i < count; i++) {
+               char *tmp = bufs[i];
+
+               if (tmp)
+                       memcpy(ptr, tmp, lens[i]);
+               ptr += cfs_size_round(lens[i]);
+       }
 }
 EXPORT_SYMBOL(lustre_init_msg_v2);
 
@@ -799,7 +803,7 @@ static inline struct ptlrpc_body *lustre_msg_ptlrpc_body(struct lustre_msg *msg)
                                 sizeof(struct ptlrpc_body_v2));
 }
 
-__u32 lustre_msghdr_get_flags(struct lustre_msg *msg)
+enum lustre_msghdr lustre_msghdr_get_flags(struct lustre_msg *msg)
 {
        switch (msg->lm_magic) {
        case LUSTRE_MSG_MAGIC_V2:
@@ -877,7 +881,8 @@ void lustre_msg_clear_flags(struct lustre_msg *msg, __u32 flags)
        case LUSTRE_MSG_MAGIC_V2: {
                struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg);
                LASSERTF(pb != NULL, "invalid msg %p: no ptlrpc body!\n", msg);
-               pb->pb_flags &= ~(MSG_GEN_FLAG_MASK & flags);
+               pb->pb_flags &= ~flags;
+
                return;
        }
        default:
@@ -952,7 +957,7 @@ __u32 lustre_msg_get_type(struct lustre_msg *msg)
 }
 EXPORT_SYMBOL(lustre_msg_get_type);
 
-__u32 lustre_msg_get_version(struct lustre_msg *msg)
+enum lustre_msg_version lustre_msg_get_version(struct lustre_msg *msg)
 {
        switch (msg->lm_magic) {
        case LUSTRE_MSG_MAGIC_V2: {
@@ -1508,9 +1513,9 @@ void lustre_msg_set_jobid(struct lustre_msg *msg, char *jobid)
                LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg);
 
                if (jobid != NULL)
-                       memcpy(pb->pb_jobid, jobid, LUSTRE_JOBID_SIZE);
+                       memcpy(pb->pb_jobid, jobid, sizeof(pb->pb_jobid));
                else if (pb->pb_jobid[0] == '\0')
-                       lustre_get_jobid(pb->pb_jobid);
+                       lustre_get_jobid(pb->pb_jobid, sizeof(pb->pb_jobid));
                return;
        }
        default:
@@ -1615,39 +1620,40 @@ EXPORT_SYMBOL(do_set_info_async);
 /* byte flipping routines for all wire types declared in
  * lustre_idl.h implemented here.
  */
-void lustre_swab_ptlrpc_body(struct ptlrpc_body *b)
-{
-        __swab32s (&b->pb_type);
-        __swab32s (&b->pb_version);
-        __swab32s (&b->pb_opc);
-        __swab32s (&b->pb_status);
-        __swab64s (&b->pb_last_xid);
-       __swab16s (&b->pb_tag);
-        __swab64s (&b->pb_last_committed);
-        __swab64s (&b->pb_transno);
-        __swab32s (&b->pb_flags);
-        __swab32s (&b->pb_op_flags);
-        __swab32s (&b->pb_conn_cnt);
-        __swab32s (&b->pb_timeout);
-        __swab32s (&b->pb_service_time);
-        __swab32s (&b->pb_limit);
-        __swab64s (&b->pb_slv);
-        __swab64s (&b->pb_pre_versions[0]);
-        __swab64s (&b->pb_pre_versions[1]);
-        __swab64s (&b->pb_pre_versions[2]);
-        __swab64s (&b->pb_pre_versions[3]);
-       __swab64s(&b->pb_mbits);
-       CLASSERT(offsetof(typeof(*b), pb_padding0) != 0);
-       CLASSERT(offsetof(typeof(*b), pb_padding1) != 0);
-       CLASSERT(offsetof(typeof(*b), pb_padding64_0) != 0);
-       CLASSERT(offsetof(typeof(*b), pb_padding64_1) != 0);
-       CLASSERT(offsetof(typeof(*b), pb_padding64_2) != 0);
+void lustre_swab_ptlrpc_body(struct ptlrpc_body *body)
+{
+       __swab32s(&body->pb_type);
+       __swab32s(&body->pb_version);
+       __swab32s(&body->pb_opc);
+       __swab32s(&body->pb_status);
+       __swab64s(&body->pb_last_xid);
+       __swab16s(&body->pb_tag);
+       CLASSERT(offsetof(typeof(*body), pb_padding0) != 0);
+       CLASSERT(offsetof(typeof(*body), pb_padding1) != 0);
+       __swab64s(&body->pb_last_committed);
+       __swab64s(&body->pb_transno);
+       __swab32s(&body->pb_flags);
+       __swab32s(&body->pb_op_flags);
+       __swab32s(&body->pb_conn_cnt);
+       __swab32s(&body->pb_timeout);
+       __swab32s(&body->pb_service_time);
+       __swab32s(&body->pb_limit);
+       __swab64s(&body->pb_slv);
+       __swab64s(&body->pb_pre_versions[0]);
+       __swab64s(&body->pb_pre_versions[1]);
+       __swab64s(&body->pb_pre_versions[2]);
+       __swab64s(&body->pb_pre_versions[3]);
+       __swab64s(&body->pb_mbits);
+       CLASSERT(offsetof(typeof(*body), pb_padding64_0) != 0);
+       CLASSERT(offsetof(typeof(*body), pb_padding64_1) != 0);
+       CLASSERT(offsetof(typeof(*body), pb_padding64_2) != 0);
        /* While we need to maintain compatibility between
         * clients and servers without ptlrpc_body_v2 (< 2.3)
         * do not swab any fields beyond pb_jobid, as we are
         * using this swab function for both ptlrpc_body
         * and ptlrpc_body_v2. */
-       CLASSERT(offsetof(typeof(*b), pb_jobid) != 0);
+       /* pb_jobid is an ASCII string and should not be swabbed */
+       CLASSERT(offsetof(typeof(*body), pb_jobid) != 0);
 }
 
 void lustre_swab_connect(struct obd_connect_data *ocd)
@@ -1695,62 +1701,72 @@ void lustre_swab_connect(struct obd_connect_data *ocd)
         CLASSERT(offsetof(typeof(*ocd), paddingF) != 0);
 }
 
+static void lustre_swab_ost_layout(struct ost_layout *ol)
+{
+       __swab32s(&ol->ol_stripe_size);
+       __swab32s(&ol->ol_stripe_count);
+       __swab64s(&ol->ol_comp_start);
+       __swab64s(&ol->ol_comp_end);
+       __swab32s(&ol->ol_comp_id);
+}
+
 void lustre_swab_obdo (struct obdo  *o)
 {
-        __swab64s (&o->o_valid);
+       __swab64s(&o->o_valid);
        lustre_swab_ost_id(&o->o_oi);
-        __swab64s (&o->o_parent_seq);
-        __swab64s (&o->o_size);
-        __swab64s (&o->o_mtime);
-        __swab64s (&o->o_atime);
-        __swab64s (&o->o_ctime);
-        __swab64s (&o->o_blocks);
-        __swab64s (&o->o_grant);
-        __swab32s (&o->o_blksize);
-        __swab32s (&o->o_mode);
-        __swab32s (&o->o_uid);
-        __swab32s (&o->o_gid);
-        __swab32s (&o->o_flags);
-        __swab32s (&o->o_nlink);
-        __swab32s (&o->o_parent_oid);
-        __swab32s (&o->o_misc);
-        __swab64s (&o->o_ioepoch);
-        __swab32s (&o->o_stripe_idx);
-        __swab32s (&o->o_parent_ver);
-        /* o_handle is opaque */
-        /* o_lcookie is swabbed elsewhere */
-        __swab32s (&o->o_uid_h);
-        __swab32s (&o->o_gid_h);
-        __swab64s (&o->o_data_version);
-        CLASSERT(offsetof(typeof(*o), o_padding_4) != 0);
-        CLASSERT(offsetof(typeof(*o), o_padding_5) != 0);
-        CLASSERT(offsetof(typeof(*o), o_padding_6) != 0);
+       __swab64s(&o->o_parent_seq);
+       __swab64s(&o->o_size);
+       __swab64s(&o->o_mtime);
+       __swab64s(&o->o_atime);
+       __swab64s(&o->o_ctime);
+       __swab64s(&o->o_blocks);
+       __swab64s(&o->o_grant);
+       __swab32s(&o->o_blksize);
+       __swab32s(&o->o_mode);
+       __swab32s(&o->o_uid);
+       __swab32s(&o->o_gid);
+       __swab32s(&o->o_flags);
+       __swab32s(&o->o_nlink);
+       __swab32s(&o->o_parent_oid);
+       __swab32s(&o->o_misc);
+       __swab64s(&o->o_ioepoch);
+       __swab32s(&o->o_stripe_idx);
+       __swab32s(&o->o_parent_ver);
+       lustre_swab_ost_layout(&o->o_layout);
+       __swab32s(&o->o_layout_version);
+       __swab32s(&o->o_uid_h);
+       __swab32s(&o->o_gid_h);
+       __swab64s(&o->o_data_version);
+       __swab32s(&o->o_projid);
+       CLASSERT(offsetof(typeof(*o), o_padding_4) != 0);
+       CLASSERT(offsetof(typeof(*o), o_padding_5) != 0);
+       CLASSERT(offsetof(typeof(*o), o_padding_6) != 0);
 
 }
 EXPORT_SYMBOL(lustre_swab_obdo);
 
 void lustre_swab_obd_statfs (struct obd_statfs *os)
 {
-        __swab64s (&os->os_type);
-        __swab64s (&os->os_blocks);
-        __swab64s (&os->os_bfree);
-        __swab64s (&os->os_bavail);
-        __swab64s (&os->os_files);
-        __swab64s (&os->os_ffree);
-        /* no need to swab os_fsid */
-        __swab32s (&os->os_bsize);
-        __swab32s (&os->os_namelen);
-        __swab64s (&os->os_maxbytes);
-        __swab32s (&os->os_state);
-       CLASSERT(offsetof(typeof(*os), os_fprecreated) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare2) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare3) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare4) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare5) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare6) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare7) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare8) != 0);
-        CLASSERT(offsetof(typeof(*os), os_spare9) != 0);
+       __swab64s(&os->os_type);
+       __swab64s(&os->os_blocks);
+       __swab64s(&os->os_bfree);
+       __swab64s(&os->os_bavail);
+       __swab64s(&os->os_files);
+       __swab64s(&os->os_ffree);
+       /* no need to swab os_fsid */
+       __swab32s(&os->os_bsize);
+       __swab32s(&os->os_namelen);
+       __swab64s(&os->os_maxbytes);
+       __swab32s(&os->os_state);
+       __swab32s(&os->os_fprecreated);
+       CLASSERT(offsetof(typeof(*os), os_spare2) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare3) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare4) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare5) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare6) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare7) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare8) != 0);
+       CLASSERT(offsetof(typeof(*os), os_spare9) != 0);
 }
 
 void lustre_swab_obd_ioobj(struct obd_ioobj *ioo)
@@ -1782,16 +1798,25 @@ void lustre_swab_generic_32s(__u32 *val)
         __swab32s(val);
 }
 
-void lustre_swab_gl_desc(union ldlm_gl_desc *desc)
+void lustre_swab_gl_lquota_desc(struct ldlm_gl_lquota_desc *desc)
+{
+       lustre_swab_lu_fid(&desc->gl_id.qid_fid);
+       __swab64s(&desc->gl_flags);
+       __swab64s(&desc->gl_ver);
+       __swab64s(&desc->gl_hardlimit);
+       __swab64s(&desc->gl_softlimit);
+       __swab64s(&desc->gl_time);
+       CLASSERT(offsetof(typeof(*desc), gl_pad2) != 0);
+}
+EXPORT_SYMBOL(lustre_swab_gl_lquota_desc);
+
+void lustre_swab_gl_barrier_desc(struct ldlm_gl_barrier_desc *desc)
 {
-       lustre_swab_lu_fid(&desc->lquota_desc.gl_id.qid_fid);
-       __swab64s(&desc->lquota_desc.gl_flags);
-       __swab64s(&desc->lquota_desc.gl_ver);
-       __swab64s(&desc->lquota_desc.gl_hardlimit);
-       __swab64s(&desc->lquota_desc.gl_softlimit);
-       __swab64s(&desc->lquota_desc.gl_time);
-       CLASSERT(offsetof(typeof(desc->lquota_desc), gl_pad2) != 0);
+       __swab32s(&desc->lgbd_status);
+       __swab32s(&desc->lgbd_timeout);
+       CLASSERT(offsetof(typeof(*desc), lgbd_padding) != 0);
 }
+EXPORT_SYMBOL(lustre_swab_gl_barrier_desc);
 
 void lustre_swab_ost_lvb_v1(struct ost_lvb_v1 *lvb)
 {
@@ -1827,6 +1852,14 @@ void lustre_swab_lquota_lvb(struct lquota_lvb *lvb)
 }
 EXPORT_SYMBOL(lustre_swab_lquota_lvb);
 
+void lustre_swab_barrier_lvb(struct barrier_lvb *lvb)
+{
+       __swab32s(&lvb->lvb_status);
+       __swab32s(&lvb->lvb_index);
+       CLASSERT(offsetof(typeof(*lvb), lvb_padding) != 0);
+}
+EXPORT_SYMBOL(lustre_swab_barrier_lvb);
+
 void lustre_swab_mdt_body (struct mdt_body *b)
 {
        lustre_swab_lu_fid(&b->mbo_fid1);
@@ -1838,7 +1871,7 @@ void lustre_swab_mdt_body (struct mdt_body *b)
        __swab64s(&b->mbo_atime);
        __swab64s(&b->mbo_ctime);
        __swab64s(&b->mbo_blocks);
-       __swab64s(&b->mbo_ioepoch);
+       __swab64s(&b->mbo_version);
        __swab64s(&b->mbo_t_state);
        __swab32s(&b->mbo_fsuid);
        __swab32s(&b->mbo_fsgid);
@@ -1849,7 +1882,7 @@ void lustre_swab_mdt_body (struct mdt_body *b)
        __swab32s(&b->mbo_flags);
        __swab32s(&b->mbo_rdev);
        __swab32s(&b->mbo_nlink);
-       CLASSERT(offsetof(typeof(*b), mbo_unused2) != 0);
+       __swab32s(&b->mbo_layout_gen);
        __swab32s(&b->mbo_suppgid);
        __swab32s(&b->mbo_eadatasize);
        __swab32s(&b->mbo_aclsize);
@@ -1857,7 +1890,12 @@ void lustre_swab_mdt_body (struct mdt_body *b)
        CLASSERT(offsetof(typeof(*b), mbo_unused3) != 0);
        __swab32s(&b->mbo_uid_h);
        __swab32s(&b->mbo_gid_h);
-       CLASSERT(offsetof(typeof(*b), mbo_padding_5) != 0);
+       __swab32s(&b->mbo_projid);
+       __swab64s(&b->mbo_dom_size);
+       __swab64s(&b->mbo_dom_blocks);
+       CLASSERT(offsetof(typeof(*b), mbo_padding_8) != 0);
+       CLASSERT(offsetof(typeof(*b), mbo_padding_9) != 0);
+       CLASSERT(offsetof(typeof(*b), mbo_padding_10) != 0);
 }
 
 void lustre_swab_mdt_ioepoch(struct mdt_ioepoch *b)
@@ -1870,38 +1908,39 @@ void lustre_swab_mdt_ioepoch(struct mdt_ioepoch *b)
 
 void lustre_swab_mgs_target_info(struct mgs_target_info *mti)
 {
-        int i;
-        __swab32s(&mti->mti_lustre_ver);
-        __swab32s(&mti->mti_stripe_index);
-        __swab32s(&mti->mti_config_ver);
-        __swab32s(&mti->mti_flags);
-        __swab32s(&mti->mti_instance);
-        __swab32s(&mti->mti_nid_count);
-        CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64));
-        for (i = 0; i < MTI_NIDS_MAX; i++)
-                __swab64s(&mti->mti_nids[i]);
+       int i;
+
+       __swab32s(&mti->mti_lustre_ver);
+       __swab32s(&mti->mti_stripe_index);
+       __swab32s(&mti->mti_config_ver);
+       __swab32s(&mti->mti_flags);
+       __swab32s(&mti->mti_instance);
+       __swab32s(&mti->mti_nid_count);
+       CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64));
+       for (i = 0; i < MTI_NIDS_MAX; i++)
+               __swab64s(&mti->mti_nids[i]);
 }
 
 void lustre_swab_mgs_nidtbl_entry(struct mgs_nidtbl_entry *entry)
 {
        __u8 i;
 
-        __swab64s(&entry->mne_version);
-        __swab32s(&entry->mne_instance);
-        __swab32s(&entry->mne_index);
-        __swab32s(&entry->mne_length);
-
-        /* mne_nid_(count|type) must be one byte size because we're gonna
-         * access it w/o swapping. */
-        CLASSERT(sizeof(entry->mne_nid_count) == sizeof(__u8));
-        CLASSERT(sizeof(entry->mne_nid_type) == sizeof(__u8));
-
-        /* remove this assertion if ipv6 is supported. */
-        LASSERT(entry->mne_nid_type == 0);
-        for (i = 0; i < entry->mne_nid_count; i++) {
-                CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64));
-                __swab64s(&entry->u.nids[i]);
-        }
+       __swab64s(&entry->mne_version);
+       __swab32s(&entry->mne_instance);
+       __swab32s(&entry->mne_index);
+       __swab32s(&entry->mne_length);
+
+       /* mne_nid_(count|type) must be one byte size because we're gonna
+        * access it w/o swapping. */
+       CLASSERT(sizeof(entry->mne_nid_count) == sizeof(__u8));
+       CLASSERT(sizeof(entry->mne_nid_type) == sizeof(__u8));
+
+       /* remove this assertion if ipv6 is supported. */
+       LASSERT(entry->mne_nid_type == 0);
+       for (i = 0; i < entry->mne_nid_count; i++) {
+               CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64));
+               __swab64s(&entry->u.nids[i]);
+       }
 }
 EXPORT_SYMBOL(lustre_swab_mgs_nidtbl_entry);
 
@@ -2084,23 +2123,42 @@ void lustre_swab_lmv_mds_md(union lmv_mds_md *lmm)
 }
 EXPORT_SYMBOL(lustre_swab_lmv_mds_md);
 
+void lustre_swab_lmv_user_md_objects(struct lmv_user_mds_data *lmd,
+                                    int stripe_count)
+{
+       int i;
+
+       for (i = 0; i < stripe_count; i++)
+               __swab32s(&(lmd[i].lum_mds));
+}
+EXPORT_SYMBOL(lustre_swab_lmv_user_md_objects);
+
+
 void lustre_swab_lmv_user_md(struct lmv_user_md *lum)
 {
+       __u32 count = lum->lum_stripe_count;
+
        __swab32s(&lum->lum_magic);
        __swab32s(&lum->lum_stripe_count);
        __swab32s(&lum->lum_stripe_offset);
        __swab32s(&lum->lum_hash_type);
        __swab32s(&lum->lum_type);
        CLASSERT(offsetof(typeof(*lum), lum_padding1) != 0);
+       switch (lum->lum_magic) {
+       case LMV_USER_MAGIC_SPECIFIC:
+               count = lum->lum_stripe_count;
+       case __swab32(LMV_USER_MAGIC_SPECIFIC):
+               lustre_swab_lmv_user_md_objects(lum->lum_objects, count);
+               break;
+       default:
+               break;
+       }
 }
 EXPORT_SYMBOL(lustre_swab_lmv_user_md);
 
-void lustre_print_user_md(unsigned int lvl, struct lov_user_md *lum,
-                         const char *msg)
+static void lustre_print_v1v3(unsigned int lvl, struct lov_user_md *lum,
+                             const char *msg)
 {
-       if (likely(!cfs_cdebug_show(lvl, DEBUG_SUBSYSTEM)))
-               return;
-
        CDEBUG(lvl, "%s lov_user_md %p:\n", msg, lum);
        CDEBUG(lvl, "\tlmm_magic: %#x\n", lum->lmm_magic);
        CDEBUG(lvl, "\tlmm_pattern: %#x\n", lum->lmm_pattern);
@@ -2126,6 +2184,55 @@ void lustre_print_user_md(unsigned int lvl, struct lov_user_md *lum,
                        CDEBUG(lvl, "\t\t%u\n", v3->lmm_objects[i].l_ost_idx);
        }
 }
+
+void lustre_print_user_md(unsigned int lvl, struct lov_user_md *lum,
+                         const char *msg)
+{
+       struct lov_comp_md_v1   *comp_v1;
+       int                      i;
+
+       if (likely(!cfs_cdebug_show(lvl, DEBUG_SUBSYSTEM)))
+               return;
+
+       if (lum->lmm_magic == LOV_USER_MAGIC_V1 ||
+           lum->lmm_magic == LOV_USER_MAGIC_V3) {
+               lustre_print_v1v3(lvl, lum, msg);
+               return;
+       }
+
+       if (lum->lmm_magic != LOV_USER_MAGIC_COMP_V1) {
+               CDEBUG(lvl, "%s: bad magic: %x\n", msg, lum->lmm_magic);
+               return;
+       }
+
+       comp_v1 = (struct lov_comp_md_v1 *)lum;
+       CDEBUG(lvl, "%s: lov_comp_md_v1 %p:\n", msg, lum);
+       CDEBUG(lvl, "\tlcm_magic: %#x\n", comp_v1->lcm_magic);
+       CDEBUG(lvl, "\tlcm_size: %#x\n", comp_v1->lcm_size);
+       CDEBUG(lvl, "\tlcm_layout_gen: %#x\n", comp_v1->lcm_layout_gen);
+       CDEBUG(lvl, "\tlcm_flags: %#x\n", comp_v1->lcm_flags);
+       CDEBUG(lvl, "\tlcm_entry_count: %#x\n\n", comp_v1->lcm_entry_count);
+       CDEBUG(lvl, "\tlcm_mirror_count: %#x\n\n", comp_v1->lcm_mirror_count);
+
+       for (i = 0; i < comp_v1->lcm_entry_count; i++) {
+               struct lov_comp_md_entry_v1 *ent = &comp_v1->lcm_entries[i];
+               struct lov_user_md *v1;
+
+               CDEBUG(lvl, "\tentry %d:\n", i);
+               CDEBUG(lvl, "\tlcme_id: %#x\n", ent->lcme_id);
+               CDEBUG(lvl, "\tlcme_flags: %#x\n", ent->lcme_flags);
+               CDEBUG(lvl, "\tlcme_extent.e_start: %llu\n",
+                      ent->lcme_extent.e_start);
+               CDEBUG(lvl, "\tlcme_extent.e_end: %llu\n",
+                      ent->lcme_extent.e_end);
+               CDEBUG(lvl, "\tlcme_offset: %#x\n", ent->lcme_offset);
+               CDEBUG(lvl, "\tlcme_size: %#x\n\n", ent->lcme_size);
+
+               v1 = (struct lov_user_md *)((char *)comp_v1 +
+                               comp_v1->lcm_entries[i].lcme_offset);
+               lustre_print_v1v3(lvl, v1, msg);
+       }
+}
 EXPORT_SYMBOL(lustre_print_user_md);
 
 static void lustre_swab_lmm_oi(struct ost_id *oi)
@@ -2165,6 +2272,76 @@ void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum)
 }
 EXPORT_SYMBOL(lustre_swab_lov_user_md_v3);
 
+void lustre_swab_lov_comp_md_v1(struct lov_comp_md_v1 *lum)
+{
+       struct lov_comp_md_entry_v1     *ent;
+       struct lov_user_md_v1   *v1;
+       struct lov_user_md_v3   *v3;
+       int     i;
+       bool    cpu_endian;
+       __u32   off, size;
+       __u16   ent_count, stripe_count;
+       ENTRY;
+
+       cpu_endian = lum->lcm_magic == LOV_USER_MAGIC_COMP_V1;
+       ent_count = lum->lcm_entry_count;
+       if (!cpu_endian)
+               __swab16s(&ent_count);
+
+       CDEBUG(D_IOCTL, "swabbing lov_user_comp_md v1\n");
+       __swab32s(&lum->lcm_magic);
+       __swab32s(&lum->lcm_size);
+       __swab32s(&lum->lcm_layout_gen);
+       __swab16s(&lum->lcm_flags);
+       __swab16s(&lum->lcm_entry_count);
+       __swab16s(&lum->lcm_mirror_count);
+       CLASSERT(offsetof(typeof(*lum), lcm_padding1) != 0);
+       CLASSERT(offsetof(typeof(*lum), lcm_padding2) != 0);
+
+       for (i = 0; i < ent_count; i++) {
+               ent = &lum->lcm_entries[i];
+               off = ent->lcme_offset;
+               size = ent->lcme_size;
+
+               if (!cpu_endian) {
+                       __swab32s(&off);
+                       __swab32s(&size);
+               }
+               __swab32s(&ent->lcme_id);
+               __swab32s(&ent->lcme_flags);
+               __swab64s(&ent->lcme_extent.e_start);
+               __swab64s(&ent->lcme_extent.e_end);
+               __swab32s(&ent->lcme_offset);
+               __swab32s(&ent->lcme_size);
+               CLASSERT(offsetof(typeof(*ent), lcme_padding) != 0);
+
+               v1 = (struct lov_user_md_v1 *)((char *)lum + off);
+               stripe_count = v1->lmm_stripe_count;
+               if (!cpu_endian)
+                       __swab16s(&stripe_count);
+
+               if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V1) ||
+                   v1->lmm_magic == LOV_USER_MAGIC_V1) {
+                       lustre_swab_lov_user_md_v1(v1);
+                       if (size > sizeof(*v1))
+                               lustre_swab_lov_user_md_objects(v1->lmm_objects,
+                                                               stripe_count);
+               } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V3) ||
+                          v1->lmm_magic == LOV_USER_MAGIC_V3 ||
+                          v1->lmm_magic == __swab32(LOV_USER_MAGIC_SPECIFIC) ||
+                          v1->lmm_magic == LOV_USER_MAGIC_SPECIFIC) {
+                       v3 = (struct lov_user_md_v3 *)v1;
+                       lustre_swab_lov_user_md_v3(v3);
+                       if (size > sizeof(*v3))
+                               lustre_swab_lov_user_md_objects(v3->lmm_objects,
+                                                               stripe_count);
+               } else {
+                       CERROR("Invalid magic %#x\n", v1->lmm_magic);
+               }
+       }
+}
+EXPORT_SYMBOL(lustre_swab_lov_comp_md_v1);
+
 void lustre_swab_lov_mds_md(struct lov_mds_md *lmm)
 {
        ENTRY;
@@ -2362,41 +2539,51 @@ static inline int req_ptlrpc_body_swabbed(struct ptlrpc_request *req)
 
 static inline int rep_ptlrpc_body_swabbed(struct ptlrpc_request *req)
 {
-        LASSERT(req->rq_repmsg);
+       if (unlikely(!req->rq_repmsg))
+               return 0;
 
-        switch (req->rq_repmsg->lm_magic) {
-        case LUSTRE_MSG_MAGIC_V2:
-                return lustre_rep_swabbed(req, MSG_PTLRPC_BODY_OFF);
-        default:
-                /* uninitialized yet */
-                return 0;
-        }
+       switch (req->rq_repmsg->lm_magic) {
+       case LUSTRE_MSG_MAGIC_V2:
+               return lustre_rep_swabbed(req, MSG_PTLRPC_BODY_OFF);
+       default:
+               /* uninitialized yet */
+               return 0;
+       }
 }
 
 void _debug_req(struct ptlrpc_request *req,
-                struct libcfs_debug_msg_data *msgdata,
-                const char *fmt, ... )
+               struct libcfs_debug_msg_data *msgdata, const char *fmt, ...)
 {
-        int req_ok = req->rq_reqmsg != NULL;
-        int rep_ok = req->rq_repmsg != NULL;
-        lnet_nid_t nid = LNET_NID_ANY;
-        va_list args;
+       bool req_ok = req->rq_reqmsg != NULL;
+       bool rep_ok = false;
+       lnet_nid_t nid = LNET_NID_ANY;
+       va_list args;
+       int rep_flags = -1;
+       int rep_status = -1;
 
-        if (ptlrpc_req_need_swab(req)) {
-                req_ok = req_ok && req_ptlrpc_body_swabbed(req);
-                rep_ok = rep_ok && rep_ptlrpc_body_swabbed(req);
-        }
+       spin_lock(&req->rq_early_free_lock);
+       if (req->rq_repmsg)
+               rep_ok = true;
+
+       if (ptlrpc_req_need_swab(req)) {
+               req_ok = req_ok && req_ptlrpc_body_swabbed(req);
+               rep_ok = rep_ok && rep_ptlrpc_body_swabbed(req);
+       }
 
-        if (req->rq_import && req->rq_import->imp_connection)
-                nid = req->rq_import->imp_connection->c_peer.nid;
-        else if (req->rq_export && req->rq_export->exp_connection)
-                nid = req->rq_export->exp_connection->c_peer.nid;
+       if (rep_ok) {
+               rep_flags = lustre_msg_get_flags(req->rq_repmsg);
+               rep_status = lustre_msg_get_status(req->rq_repmsg);
+       }
+       spin_unlock(&req->rq_early_free_lock);
+
+       if (req->rq_import && req->rq_import->imp_connection)
+               nid = req->rq_import->imp_connection->c_peer.nid;
+       else if (req->rq_export && req->rq_export->exp_connection)
+               nid = req->rq_export->exp_connection->c_peer.nid;
 
        va_start(args, fmt);
        libcfs_debug_vmsg2(msgdata, fmt, args,
-                          " req@%p x%llu/t%lld(%lld) o%d->%s@%s:%d/%d"
-                          " lens %d/%d e %d to %d dl "CFS_TIME_T" ref %d "
-                          "fl "REQ_FLAGS_FMT"/%x/%x rc %d/%d\n",
+                          " req@%p x%llu/t%lld(%lld) o%d->%s@%s:%d/%d lens %d/%d e %d to %lld dl %lld ref %d fl " REQ_FLAGS_FMT "/%x/%x rc %d/%d\n",
                           req, req->rq_xid, req->rq_transno,
                           req_ok ? lustre_msg_get_transno(req->rq_reqmsg) : 0,
                           req_ok ? lustre_msg_get_opc(req->rq_reqmsg) : -1,
@@ -2408,14 +2595,12 @@ void _debug_req(struct ptlrpc_request *req,
                           libcfs_nid2str(nid),
                           req->rq_request_portal, req->rq_reply_portal,
                           req->rq_reqlen, req->rq_replen,
-                          req->rq_early_count, req->rq_timedout,
-                          req->rq_deadline,
+                          req->rq_early_count, (s64)req->rq_timedout,
+                          (s64)req->rq_deadline,
                           atomic_read(&req->rq_refcount),
                           DEBUG_REQ_FLAGS(req),
                           req_ok ? lustre_msg_get_flags(req->rq_reqmsg) : -1,
-                          rep_ok ? lustre_msg_get_flags(req->rq_repmsg) : -1,
-                          req->rq_status,
-                          rep_ok ? lustre_msg_get_status(req->rq_repmsg) : -1);
+                          rep_flags, req->rq_status, rep_status);
        va_end(args);
 }
 EXPORT_SYMBOL(_debug_req);
@@ -2472,12 +2657,17 @@ void lustre_swab_hsm_user_item(struct hsm_user_item *hui)
        lustre_swab_hsm_extent(&hui->hui_extent);
 }
 
+void lustre_swab_lu_extent(struct lu_extent *le)
+{
+       __swab64s(&le->e_start);
+       __swab64s(&le->e_end);
+}
+
 void lustre_swab_layout_intent(struct layout_intent *li)
 {
        __swab32s(&li->li_opc);
        __swab32s(&li->li_flags);
-       __swab64s(&li->li_start);
-       __swab64s(&li->li_end);
+       lustre_swab_lu_extent(&li->li_extent);
 }
 
 void lustre_swab_hsm_progress_kernel(struct hsm_progress_kernel *hpk)
@@ -2589,6 +2779,19 @@ void lustre_swab_close_data(struct close_data *cd)
        __swab64s(&cd->cd_data_version);
 }
 
+void lustre_swab_close_data_resync_done(struct close_data_resync_done *resync)
+{
+       int i;
+
+       __swab32s(&resync->resync_count);
+       /* after swab, resync_count must in CPU endian */
+       if (resync->resync_count <= INLINE_RESYNC_ARRAY_SIZE) {
+               for (i = 0; i < resync->resync_count; i++)
+                       __swab32s(&resync->resync_ids_inline[i]);
+       }
+}
+EXPORT_SYMBOL(lustre_swab_close_data_resync_done);
+
 void lustre_swab_lfsck_request(struct lfsck_request *lr)
 {
        __swab32s(&lr->lr_event);
@@ -2603,9 +2806,11 @@ void lustre_swab_lfsck_request(struct lfsck_request *lr)
        __swab32s(&lr->lr_flags);
        lustre_swab_lu_fid(&lr->lr_fid);
        lustre_swab_lu_fid(&lr->lr_fid2);
-       lustre_swab_lu_fid(&lr->lr_fid3);
+       __swab32s(&lr->lr_comp_id);
+       CLASSERT(offsetof(typeof(*lr), lr_padding_0) != 0);
        CLASSERT(offsetof(typeof(*lr), lr_padding_1) != 0);
        CLASSERT(offsetof(typeof(*lr), lr_padding_2) != 0);
+       CLASSERT(offsetof(typeof(*lr), lr_padding_3) != 0);
 }
 
 void lustre_swab_lfsck_reply(struct lfsck_reply *lr)
@@ -2615,15 +2820,29 @@ void lustre_swab_lfsck_reply(struct lfsck_reply *lr)
        __swab64s(&lr->lr_repaired);
 }
 
+static void lustre_swab_orphan_rec(struct lu_orphan_rec *rec)
+{
+       lustre_swab_lu_fid(&rec->lor_fid);
+       __swab32s(&rec->lor_uid);
+       __swab32s(&rec->lor_gid);
+}
+
 void lustre_swab_orphan_ent(struct lu_orphan_ent *ent)
 {
        lustre_swab_lu_fid(&ent->loe_key);
-       lustre_swab_lu_fid(&ent->loe_rec.lor_fid);
-       __swab32s(&ent->loe_rec.lor_uid);
-       __swab32s(&ent->loe_rec.lor_gid);
+       lustre_swab_orphan_rec(&ent->loe_rec);
 }
 EXPORT_SYMBOL(lustre_swab_orphan_ent);
 
+void lustre_swab_orphan_ent_v2(struct lu_orphan_ent_v2 *ent)
+{
+       lustre_swab_lu_fid(&ent->loe_key);
+       lustre_swab_orphan_rec(&ent->loe_rec.lor_rec);
+       lustre_swab_ost_layout(&ent->loe_rec.lor_layout);
+       CLASSERT(offsetof(typeof(ent->loe_rec), lor_padding) != 0);
+}
+EXPORT_SYMBOL(lustre_swab_orphan_ent_v2);
+
 void lustre_swab_ladvise(struct lu_ladvise *ladvise)
 {
        __swab16s(&ladvise->lla_advice);