*/
static void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info,
struct mdt_object *obj,
- struct md_attr *ma)
+ struct md_attr *ma, __u64 open_flags)
{
+ struct req_capsule *pill;
+
if (ma->ma_lmv || ma->ma_lmm) {
CDEBUG(D_INFO, DFID " %s already set.\n",
PFID(mdt_object_fid(obj)),
return;
}
+ pill = info->mti_pill;
if (S_ISDIR(obj->mot_header.loh_attr)) {
- ma->ma_lmv = req_capsule_server_get(info->mti_pill,
- &RMF_MDT_MD);
- ma->ma_lmv_size = req_capsule_get_size(info->mti_pill,
- &RMF_MDT_MD,
+ ma->ma_lmv = req_capsule_server_get(pill, &RMF_MDT_MD);
+ ma->ma_lmv_size = req_capsule_get_size(pill, &RMF_MDT_MD,
RCL_SERVER);
if (ma->ma_lmv_size > 0)
ma->ma_need |= MA_LMV;
+
+ if (open_flags & MDS_OPEN_DEFAULT_LMV) {
+ ma->ma_default_lmv = req_capsule_server_get(pill,
+ &RMF_DEFAULT_MDT_MD);
+ ma->ma_default_lmv_size = req_capsule_get_size(pill,
+ &RMF_DEFAULT_MDT_MD,
+ RCL_SERVER);
+ if (ma->ma_default_lmv_size > 0)
+ ma->ma_need |= MA_LMV_DEF;
+ }
} else {
- ma->ma_lmm = req_capsule_server_get(info->mti_pill,
- &RMF_MDT_MD);
- ma->ma_lmm_size = req_capsule_get_size(info->mti_pill,
- &RMF_MDT_MD,
+ ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD);
+ ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD,
RCL_SERVER);
if (ma->ma_lmm_size > 0)
ma->ma_need |= MA_LOV;
repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_MEA;
}
+ if (ma->ma_valid & MA_LMV_DEF) {
+ LASSERT(ma->ma_default_lmv_size != 0);
+ LASSERT(isdir);
+ repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_DEFAULT_MEA;
+ }
+
if (open_flags & MDS_FMODE_WRITE)
rc = mdt_write_get(o);
else if (open_flags & MDS_FMODE_EXEC)
mdt_set_disposition(info, rep,
DISP_OPEN_CREATE);
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
rc = mdt_attr_get_complex(info, o, ma);
if (rc)
GOTO(out, rc);
mdt_set_disposition(info, rep, (DISP_IT_EXECD | DISP_LOOKUP_EXECD));
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
if (open_flags & MDS_OPEN_RELEASE)
ma->ma_need |= MA_HSM;
rc = mdt_attr_get_complex(info, o, ma);
if (rc)
goto out;
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
rc = mdt_attr_get_complex(info, o, ma);
if (rc != 0)
GOTO(out, rc);
mdt_clear_disposition(info, ldlm_rep, DISP_OPEN_CREATE);
GOTO(out_child, result);
} else {
- mdt_prep_ma_buf_from_rep(info, child, ma);
+ mdt_prep_ma_buf_from_rep(info, child, ma, open_flags);
/* XXX: we should call this once, see few lines below */
if (result == 0)
result = mdt_attr_get_complex(info, child, ma);
/* We have to get attr & LOV EA & HSM for this
* object. */
- mdt_prep_ma_buf_from_rep(info, child, ma);
+ mdt_prep_ma_buf_from_rep(info, child, ma, open_flags);
ma->ma_need |= MA_HSM;
result = mdt_attr_get_complex(info, child, ma);
if (result != 0)