ENTRY;
+ /* Can I remove the OBD_FAIL_CHECK here? because the packing result
+ * has already been checked.
+ */
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETSTATUS_PACK))
result = -ENOMEM;
else {
#ifdef MDT_CODE
const struct mdt_body *body = info->mti_body;
struct req_capsule *pill = &info->mti_pill;
+ struct ptlrpc_request *req = mdt_info_req(info);
#endif
struct md_object *next = mdt_object_child(info->mti_object);
struct lu_attr *la = &info->mti_attr;
CERROR("MD size %d larger than maximum possible %u\n",
rc, MAX_MD_SIZE);
} else {
- req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, rc);
+ req_capsule_set_size(pill, &RMF_MDT_MD,
+ RCL_SERVER, rc);
}
} else if (S_ISLNK(la->la_mode) && (body->valid & OBD_MD_LINKNAME)) {
- /* It also uese the mdt_md to hold symname */
+ /* XXX:It also uese the mdt_md to hold symname.
+ * Are there any problem? will be swabbed? hope not.
+ */
int len = min_t(int, la->la_size + 1, body->eadatasize);
req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, len);
}
#ifdef CONFIG_FS_POSIX_ACL
- if ((mdt_info_req(info)->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
+ if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
(body->valid & OBD_MD_FLACL)) {
rc = mo_xattr_get(info->mti_ctxt, next,
}
req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, 0);
} else
- req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
+ req_capsule_set_size(pill, &RMF_EADATA,
+ RCL_SERVER, rc);
}
#endif
#endif
#ifdef MDT_CODE
void *buffer;
int length;
+ struct ptlrpc_request *req = mdt_info_req(info);
#endif
ENTRY;
repbody->valid |= OBD_MD_LINKNAME;
repbody->eadatasize = rc + 1;
((char*)buffer)[rc] = 0; /* NULL terminate */
- CDEBUG(D_INODE, "read symlink dest %s\n", (char*)buffer);
+ CDEBUG(D_INODE, "symlink dest %s\n", (char*)buffer);
}
}
if (reqbody->valid & OBD_MD_FLMODEASIZE) {
- repbody->max_cookiesize = MAX_MD_SIZE; /*FIXME*/
- repbody->max_mdsize = MAX_MD_SIZE;
+ repbody->max_cookiesize = info->mti_mdt->mdt_max_cookiesize;
+ repbody->max_mdsize = info->mti_mdt->mdt_max_mdsize;
repbody->valid |= OBD_MD_FLMODEASIZE;
}
#ifdef CONFIG_FS_POSIX_ACL
- if ((mdt_info_req(info)->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
+ if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
(reqbody->valid & OBD_MD_FLACL)) {
buffer = req_capsule_server_get(&info->mti_pill,
&RMF_EADATA);
if (result != 0)
GOTO(out_parent, result);
- /*step 3: find the child object by fid */
- child = mdt_object_find(info->mti_ctxt, info->mti_mdt, &child_fid);
+ /*step 3: find the child object by fid & lock it*/
+ lhc->mlh_mode = LCK_CR;
+ child = mdt_object_find_lock(info->mti_ctxt, info->mti_mdt,
+ &child_fid, lhc, child_bits);
if (IS_ERR(child))
GOTO(out_parent, result = PTR_ERR(child));
- /*step 4: lock child: this lock is returned back to caller
- * if successfully get attr.
- */
- lhc->mlh_mode = LCK_CR;
- result = mdt_object_lock(ns, child, lhc, child_bits);
- if (result != 0)
- GOTO(out_child, result);
-
/* finally, we can get attr for child. */
result = mdt_getattr_pack_msg(info);
if (result == 0) {
- struct ldlm_reply *ldlm_rep;
- ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
- LASSERT(ldlm_rep);
- intent_set_disposition(ldlm_rep, DISP_IT_EXECD);
result = mdt_getattr_internal(info);
- if (result)
- intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
- else
- intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
}
if (result != 0)
mdt_object_unlock(ns, child, lhc);
EXIT;
-out_child:
mdt_object_put(info->mti_ctxt, child);
out_parent:
mdt_object_unlock(ns, parent, lhp);
}
rc = mdt_getattr_name_lock(info, &lhc, child_bits);
+ ldlm_rep = req_capsule_server_get(&info->mti_pill,
+ &RMF_DLM_REP);
if (rc)
- RETURN(rc);
- ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
+ intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
+ else
+ intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
ldlm_rep->lock_policy_res2 = rc;
intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
*lockp = new_lock;
- /* FIXME:This only happen when I can handle RESENT */
+ /* FIXME:This only happens when MDT can handle RESENT */
if (new_lock->l_export == req->rq_export) {
/* Already gave this to the client, which means that we
* reconstructed a reply. */
OBD_FREE_PTR(m);
l = ERR_PTR(result);
}
-
} else
l = ERR_PTR(-ENOMEM);
return l;
static int mdt_getxattr_pack_reply(struct mdt_thread_info * info)
{
char *xattr_name;
- int rc = -EOPNOTSUPP, rc2;
- struct req_capsule *pill;
+ int rc = -EOPNOTSUPP;
+ int rc2;
+ struct req_capsule *pill = &info->mti_pill ;
struct ptlrpc_request *req = mdt_info_req(info);
- pill = &info->mti_pill;
-
/* Imagine how many bytes we need */
if (info->mti_body->valid & OBD_MD_FLXATTR) {
xattr_name = req_capsule_client_get(pill, &RMF_NAME);
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) {
CERROR("failed MDS_GETXATTR_PACK test\n");
- req->rq_status = -ENOMEM;
return -ENOMEM;
}
ENTRY;
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) {
- CERROR(LUSTRE_MDT0_NAME": getxattr lustre_pack_reply failed\n");
+ CERROR(LUSTRE_MDT0_NAME":getxattr pack_reply failed\n");
RETURN(rc = -ENOMEM);
}
next = mdt_object_child(info->mti_object);
- buflen = mdt_getxattr_pack_reply(info);
- if (buflen < 0)
- RETURN(rc = buflen);
+ rc = mdt_getxattr_pack_reply(info);
+ if (rc < 0)
+ RETURN(rc);
buf = req_capsule_server_get(&info->mti_pill,
&RMF_EADATA);
+ buflen = req_capsule_get_size(&info->mti_pill,
+ &RMF_EADATA, RCL_SERVER);
rep_body = req_capsule_server_get(&info->mti_pill,
&RMF_MDT_BODY);
}
RETURN(rc);
- return 0;
}
GOTO(out, rc = -EPROTO);
}
- CDEBUG(D_INODE, "%sxattr %s\n",
+ CDEBUG(D_INODE, "%s xattr %s\n",
info->mti_body->valid & OBD_MD_FLXATTR ? "set" : "remove",
xattr_name);
if (rc != 0)
GOTO(out, rc);
-
if (info->mti_body->valid & OBD_MD_FLXATTR) {
char * xattr;
if (!req_capsule_field_present(&info->mti_pill, &RMF_EADATA)) {
}
} else if (info->mti_body->valid & OBD_MD_FLXATTRRM) {
rc = mo_xattr_del(info->mti_ctxt,
- mdt_object_child(info->mti_object),
- xattr_name);
+ mdt_object_child(info->mti_object),
+ xattr_name);
} else {
CERROR("valid bits: "LPX64"\n", info->mti_body->valid);
rc = -EINVAL;
}
-
+ EXIT;
out_unlock:
mdt_object_unlock(info->mti_mdt->mdt_namespace,
info->mti_object, lh);