* Author: Fan Yong <fanyong@clusterfs.com>
*/
-
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_MDS
#include "mdt_internal.h"
/* 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);
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);
}
*/
/* 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);
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);
}
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;
}
}
- 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);
}
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);
} else {
req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_RMT_ACL);
}
+
rc = mdt_dlmreq_unpack(info);
RETURN(rc);
}
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);
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);
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);
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))
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);
}
/*
*/
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);
}