Whamcloud - gitweb
LU-1606 api: Do not include lustre_idl.h from lustreapi.h
[fs/lustre-release.git] / lustre / mdt / mdt_lib.c
index 6b2e0f5..5b40877 100644 (file)
  * Author: Fan Yong <fanyong@clusterfs.com>
  */
 
-
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
 #define DEBUG_SUBSYSTEM S_MDS
 
 #include "mdt_internal.h"
@@ -590,7 +586,7 @@ int mdt_fix_reply(struct mdt_thread_info *info)
 
         /* MDT_MD buffer may be bigger than packed value, let's shrink all
          * buffers before growing it */
-        if (info->mti_attr.ma_big_lmm_used) {
+       if (info->mti_big_lmm_used) {
                 LASSERT(req_capsule_has_field(pill, &RMF_MDT_MD, RCL_SERVER));
                 md_packed = req_capsule_get_size(pill, &RMF_MDT_MD,
                                                  RCL_SERVER);
@@ -601,7 +597,7 @@ int mdt_fix_reply(struct mdt_thread_info *info)
                 req_capsule_shrink(pill, &RMF_MDT_MD, 0, RCL_SERVER);
                 /* free big lmm if md_size is not needed */
                 if (md_size == 0)
-                        info->mti_attr.ma_big_lmm_used = 0;
+                       info->mti_big_lmm_used = 0;
         } else if (req_capsule_has_field(pill, &RMF_MDT_MD, RCL_SERVER)) {
                 req_capsule_shrink(pill, &RMF_MDT_MD, md_size, RCL_SERVER);
         }
@@ -626,7 +622,7 @@ int mdt_fix_reply(struct mdt_thread_info *info)
          */
 
         /* Grow MD buffer if needed finally */
-        if (info->mti_attr.ma_big_lmm_used) {
+       if (info->mti_big_lmm_used) {
                 void *lmm;
 
                 LASSERT(md_size > md_packed);
@@ -653,7 +649,7 @@ int mdt_fix_reply(struct mdt_thread_info *info)
                 if (info->mti_mdt->mdt_max_mdsize < info->mti_attr.ma_lmm_size)
                         info->mti_mdt->mdt_max_mdsize =
                                                     info->mti_attr.ma_lmm_size;
-                info->mti_attr.ma_big_lmm_used = 0;
+               info->mti_big_lmm_used = 0;
         }
         RETURN(rc);
 }
@@ -676,25 +672,10 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
                 mdt_pack_attr2body(info, repbody, la, mdt_object_fid(mo));
 
         if (ma->ma_valid & MA_LOV) {
-                __u32 mode;
-
-                if (mdt_object_exists(mo) < 0)
-                        /* If it is a remote object, and we do not retrieve
-                         * EA back unlink reg file*/
-                        mode = S_IFREG;
-                else
-                        mode = lu_object_attr(&mo->mot_obj.mo_lu);
-
-                LASSERT(ma->ma_lmm_size);
-                mdt_dump_lmm(D_INFO, ma->ma_lmm);
-                repbody->eadatasize = ma->ma_lmm_size;
-                if (S_ISREG(mode))
-                        repbody->valid |= OBD_MD_FLEASIZE;
-                else if (S_ISDIR(mode))
-                        repbody->valid |= OBD_MD_FLDIREA;
-                else
-                        LBUG();
+               CERROR("No need in LOV EA upon unlink\n");
+               dump_stack();
         }
+       repbody->eadatasize = 0;
 
         if (ma->ma_cookie_size && (ma->ma_valid & MA_COOKIE)) {
                 repbody->aclsize = ma->ma_cookie_size;
@@ -907,13 +888,6 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info)
                 }
         }
 
-        ma->ma_cookie_size = req_capsule_get_size(pill, &RMF_LOGCOOKIES,
-                                                  RCL_CLIENT);
-        if (ma->ma_cookie_size) {
-                ma->ma_cookie = req_capsule_client_get(pill, &RMF_LOGCOOKIES);
-                ma->ma_valid |= MA_COOKIE;
-        }
-
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
 }
@@ -965,62 +939,18 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
                          LA_CTIME | LA_MTIME | LA_ATIME;
         memset(&sp->u, 0, sizeof(sp->u));
         sp->sp_cr_flags = get_mrc_cr_flags(rec);
-        sp->sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT);
-        info->mti_cross_ref = !!(rec->cr_bias & MDS_CROSS_REF);
 
         if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
                 mdt_set_capainfo(info, 0, rr->rr_fid1,
                                  req_capsule_client_get(pill, &RMF_CAPA1));
         mdt_set_capainfo(info, 1, rr->rr_fid2, BYPASS_CAPA);
 
-        if (!info->mti_cross_ref) {
-                rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
-                rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME,
-                                                      RCL_CLIENT) - 1;
-                LASSERT(rr->rr_name && rr->rr_namelen > 0);
-        } else {
-                rr->rr_name = NULL;
-                rr->rr_namelen = 0;
-        }
+       rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
+       rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME,
+                                             RCL_CLIENT) - 1;
+       LASSERT(rr->rr_name && rr->rr_namelen > 0);
 
-#ifdef CONFIG_FS_POSIX_ACL
-        if (sp->sp_cr_flags & MDS_CREATE_RMT_ACL) {
-                if (S_ISDIR(attr->la_mode))
-                        sp->u.sp_pfid = rr->rr_fid1;
-                req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_RMT_ACL);
-                LASSERT(req_capsule_field_present(pill, &RMF_EADATA,
-                                                  RCL_CLIENT));
-                rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA);
-                rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA,
-                                                        RCL_CLIENT);
-                sp->u.sp_ea.eadata = rr->rr_eadata;
-                sp->u.sp_ea.eadatalen = rr->rr_eadatalen;
-                sp->u.sp_ea.fid = rr->rr_fid1;
-                RETURN(0);
-        }
-#endif
-        if (S_ISDIR(attr->la_mode)) {
-                /* pass parent fid for cross-ref cases */
-                sp->u.sp_pfid = rr->rr_fid1;
-                if (sp->sp_cr_flags & MDS_CREATE_SLAVE_OBJ) {
-                        /* create salve object req, need
-                         * unpack split ea here
-                         */
-                       req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_SLAVE);
-                       LASSERT(req_capsule_field_present(pill, &RMF_EADATA,
-                                                         RCL_CLIENT));
-                       rr->rr_eadata = req_capsule_client_get(pill,
-                                                              &RMF_EADATA);
-                       rr->rr_eadatalen = req_capsule_get_size(pill,
-                                                               &RMF_EADATA,
-                                                               RCL_CLIENT);
-                       sp->u.sp_ea.eadata = rr->rr_eadata;
-                       sp->u.sp_ea.eadatalen = rr->rr_eadatalen;
-                       sp->u.sp_ea.fid = rr->rr_fid1;
-                       RETURN(0);
-                }
-                req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_RMT_ACL);
-        } else if (S_ISLNK(attr->la_mode)) {
+       if (S_ISLNK(attr->la_mode)) {
                 const char *tgt = NULL;
 
                 req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_SYM);
@@ -1033,6 +963,7 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
         } else {
                 req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_RMT_ACL);
         }
+
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
 }
@@ -1073,14 +1004,12 @@ static int mdt_link_unpack(struct mdt_thread_info *info)
                 mdt_set_capainfo(info, 1, rr->rr_fid2,
                                  req_capsule_client_get(pill, &RMF_CAPA2));
 
-        info->mti_spec.sp_ck_split = !!(rec->lk_bias & MDS_CHECK_SPLIT);
-        info->mti_cross_ref = !!(rec->lk_bias & MDS_CROSS_REF);
         rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
         if (rr->rr_name == NULL)
                 RETURN(-EFAULT);
         rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1;
-        if (!info->mti_cross_ref)
-                LASSERT(rr->rr_namelen > 0);
+
+       LASSERT(rr->rr_namelen > 0);
 
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
@@ -1121,25 +1050,17 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info)
                 mdt_set_capainfo(info, 0, rr->rr_fid1,
                                  req_capsule_client_get(pill, &RMF_CAPA1));
 
-        info->mti_cross_ref = !!(rec->ul_bias & MDS_CROSS_REF);
-        if (!info->mti_cross_ref) {
-                rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
-                rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1;
-                if (rr->rr_name == NULL || rr->rr_namelen == 0)
-                        RETURN(-EFAULT);
-        } else {
-                rr->rr_name = NULL;
-                rr->rr_namelen = 0;
-        }
-        info->mti_spec.sp_ck_split = !!(rec->ul_bias & MDS_CHECK_SPLIT);
+       rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
+       rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1;
+       if (rr->rr_name == NULL || rr->rr_namelen == 0)
+               RETURN(-EFAULT);
+
         if (rec->ul_bias & MDS_VTX_BYPASS)
                 ma->ma_attr_flags |= MDS_VTX_BYPASS;
         else
                 ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
 
         info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
-        /* last unlink need LOV EA sent back */
-        rr->rr_eadatalen = info->mti_mdt->mdt_max_mdsize;
 
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
@@ -1184,29 +1105,49 @@ static int mdt_rename_unpack(struct mdt_thread_info *info)
                 mdt_set_capainfo(info, 1, rr->rr_fid2,
                                  req_capsule_client_get(pill, &RMF_CAPA2));
 
-        info->mti_spec.sp_ck_split = !!(rec->rn_bias & MDS_CHECK_SPLIT);
-        info->mti_cross_ref = !!(rec->rn_bias & MDS_CROSS_REF);
         rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
         rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT);
         if (rr->rr_name == NULL || rr->rr_tgt == NULL)
                 RETURN(-EFAULT);
         rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1;
         rr->rr_tgtlen = req_capsule_get_size(pill, &RMF_SYMTGT, RCL_CLIENT) - 1;
-        if (!info->mti_cross_ref)
-                LASSERT(rr->rr_namelen > 0 && rr->rr_tgtlen > 0);
+       LASSERT(rr->rr_namelen > 0 && rr->rr_tgtlen > 0);
+
         if (rec->rn_bias & MDS_VTX_BYPASS)
                 ma->ma_attr_flags |= MDS_VTX_BYPASS;
         else
                 ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
 
         info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
-        /* rename may contain unlink so we might need LOV EA sent back */
-        rr->rr_eadatalen = info->mti_mdt->mdt_max_mdsize;
 
         rc = mdt_dlmreq_unpack(info);
         RETURN(rc);
 }
 
+/*
+ * please see comment above LOV_MAGIC_V1_DEF
+ */
+static void mdt_fix_lov_magic(struct mdt_thread_info *info)
+{
+       struct mdt_reint_record *rr = &info->mti_rr;
+       struct lov_user_md_v1   *v1;
+
+       v1 = (void *)rr->rr_eadata;
+       LASSERT(v1);
+
+       if (unlikely(req_is_replay(mdt_info_req(info)))) {
+               if (v1->lmm_magic == LOV_USER_MAGIC_V1) {
+                       v1->lmm_magic = LOV_MAGIC_V1_DEF;
+               } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V1)) {
+                       v1->lmm_magic = __swab32(LOV_MAGIC_V1_DEF);
+               } else if (v1->lmm_magic == LOV_USER_MAGIC_V3) {
+                       v1->lmm_magic = LOV_MAGIC_V3_DEF;
+               } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_V3)) {
+                       v1->lmm_magic = __swab32(LOV_MAGIC_V3_DEF);
+               }
+       }
+}
+
 static int mdt_open_unpack(struct mdt_thread_info *info)
 {
         struct md_ucred         *uc = mdt_ucred(info);
@@ -1248,7 +1189,6 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                 RETURN(-EPROTO);
         info->mti_replayepoch = rec->cr_ioepoch;
 
-        info->mti_spec.sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT);
         info->mti_cross_ref = !!(rec->cr_bias & MDS_CROSS_REF);
 
         if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
@@ -1283,6 +1223,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                         sp->u.sp_ea.eadatalen = rr->rr_eadatalen;
                         sp->u.sp_ea.eadata = rr->rr_eadata;
                         sp->no_create = !!req_is_replay(req);
+                       mdt_fix_lov_magic(info);
                 }
 
                 /*
@@ -1292,7 +1233,8 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                  */
                 if (rr->rr_eadatalen == 0 &&
                     !(info->mti_spec.sp_cr_flags & MDS_OPEN_DELAY_CREATE))
-                        rr->rr_eadatalen = MIN_MD_SIZE;        }
+                       rr->rr_eadatalen = MIN_MD_SIZE;
+       }
 
         RETURN(0);
 }