} else if (it->it_op & (IT_GETATTR | IT_LOOKUP)) {
obd_valid valid = OBD_MD_FLGETATTR | OBD_MD_FLEASIZE |
OBD_MD_FLMODEASIZE | OBD_MD_FLDIREA |
- OBD_MD_FLMDSCAPA;
+ OBD_MD_FLMDSCAPA | OBD_MD_MEA;;
valid |= client_is_remote(exp) ? OBD_MD_FLRMTPERM :
OBD_MD_FLACL;
size[DLM_INTENT_REC_OFF] = sizeof(struct mdt_body);
repbody = req_capsule_server_get(pill, &RMF_MDT_BODY);
- if (reqbody->valid & OBD_MD_MEA) {
- /* Assumption: MDT_MD size is enough for lmv size FIXME */
- 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);
- ma->ma_need = MA_INODE | MA_LMV;
- } else {
- ma->ma_need = MA_INODE | MA_LOV ;
- 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);
- }
+ /* First got the inode attr */
ma->ma_valid = 0;
+ ma->ma_need = MA_INODE;
rc = mo_attr_get(env, next, ma);
if (rc == -EREMOTE) {
/* This object is located on remote node.*/
else
RETURN(-EFAULT);
+ /* If it is dir object and client require MEA, then we got MEA */
+ if (S_ISDIR(la->la_mode) && reqbody->valid & OBD_MD_MEA) {
+ /* Assumption: MDT_MD size is enough for lmv size FIXME */
+ 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);
+ ma->ma_need = MA_LMV;
+ } else {
+ 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);
+ ma->ma_need = MA_LOV;
+ }
+ rc = mo_attr_get(env, next, ma);
+ if (rc) {
+ CERROR("getattr error for "DFID": %d\n",
+ PFID(mdt_object_fid(o)), rc);
+ RETURN(rc);
+ }
+
if (mdt_body_has_lov(la, reqbody)) {
if (ma->ma_valid & MA_LOV) {
LASSERT(ma->ma_lmm_size);