}
static int mdt_getattr_internal(struct mdt_thread_info *info,
- struct mdt_object *o, int offset)
+ struct mdt_object *o)
{
struct md_object *next = mdt_object_child(o);
const struct mdt_body *reqbody = info->mti_body;
/* This object is located on remote node.*/
repbody->fid1 = *mdt_object_fid(o);
repbody->valid |= OBD_MD_FLID;
- GOTO(shrink, rc = 0);
+ RETURN(rc);
} else if (rc){
CERROR("getattr error for "DFID": %d\n",
PFID(mdt_object_fid(o)), rc);
}
#endif
-shrink:
- /* FIXME: determine the offset of MDT_MD. but it does not work */
-/*
- if (req_capsule_has_field(pill, &RMF_DLM_REP)) {
- offset = 2;
- } else
- offset = 1;
-*/
- lustre_shrink_reply(req, offset, repbody->eadatasize, 1);
- if (repbody->eadatasize)
- offset ++;
- lustre_shrink_reply(req, offset, repbody->aclsize, 0);
RETURN(rc);
}
if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
result = -ENOMEM;
} else {
- result = mdt_getattr_internal(info, info->mti_object, 1);
+ result = mdt_getattr_internal(info, info->mti_object);
}
+ mdt_shrink_reply(info, 1);
RETURN(result);
}
result = mdt_object_lock(info, child, lhc, child_bits);
if (result == 0) {
/* finally, we can get attr for child. */
- result = mdt_getattr_internal(info, child,
- ldlm_rep ? 2 : 1);
+ result = mdt_getattr_internal(info, child);
if (result != 0)
mdt_object_unlock(info, child, lhc, 1);
}
GOTO(out_parent, result = PTR_ERR(child));
/* finally, we can get attr for child. */
- result = mdt_getattr_internal(info, child,
- ldlm_rep ? 2 : 1);
+ result = mdt_getattr_internal(info, child);
if (result != 0)
mdt_object_unlock(info, child, lhc, 1);
else {
ldlm_lock_decref(&lhc->mlh_lh, lhc->mlh_mode);
lhc->mlh_lh.cookie = 0;
}
+ mdt_shrink_reply(info, 1);
RETURN(rc);
}
ldlm_rep->lock_policy_res2 =
mdt_getattr_name_lock(info, lhc, child_bits, ldlm_rep);
+ mdt_shrink_reply(info, 2);
if (intent_disposition(ldlm_rep, DISP_LOOKUP_NEG))
ldlm_rep->lock_policy_res2 = 0;
.o_destroy_export = mdt_destroy_export, /* By Huang Hua*/
};
-static struct lu_device *mdt_device_free(const struct lu_context *ctx,
- struct lu_device *d)
+static void mdt_device_free(const struct lu_context *ctx, struct lu_device *d)
{
struct mdt_device *m = mdt_dev(d);
int mdt_close(struct mdt_thread_info *info);
int mdt_done_writing(struct mdt_thread_info *info);
-void mdt_shrink_reply(struct mdt_thread_info *info);
+void mdt_shrink_reply(struct mdt_thread_info *info, int offset);
int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
const struct md_attr *);
}
}
-void mdt_shrink_reply(struct mdt_thread_info *info)
+void mdt_shrink_reply(struct mdt_thread_info *info, int offset)
{
struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_body *body;
- struct lov_mds_md *lmm;
- int cookie_size = 0;
+ int acl_size = 0;
int md_size = 0;
body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ LASSERT(body != NULL);
- if (body && body->valid & OBD_MD_FLEASIZE) {
- md_size = body->eadatasize;
- }
- if (body && body->valid & OBD_MD_FLCOOKIE) {
- LASSERT(body->valid & OBD_MD_FLEASIZE);
- lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
- cookie_size = le32_to_cpu(lmm->lmm_stripe_count) *
- sizeof(struct llog_cookie);
- }
+ md_size = body->eadatasize;
+ acl_size = body->aclsize;
CDEBUG(D_INFO, "Shrink to md_size %d cookie_size %d \n",
- md_size, cookie_size);
+ md_size, acl_size);
- lustre_shrink_reply(req, 1, md_size, 1);
- lustre_shrink_reply(req, md_size? 2:1, cookie_size, 0);
+ lustre_shrink_reply(req, offset, md_size, 1);
+ lustre_shrink_reply(req, md_size? offset + 1: offset, acl_size, 0);
}
}
/*FIXME: should determine the offset dynamicly,
*did not get ACL before shrink*/
- lustre_shrink_reply(req, 2, repbody->eadatasize, 1);
- lustre_shrink_reply(req, repbody->eadatasize ? 3 : 2, repbody->aclsize,
- 0);
+ mdt_shrink_reply(info, 2);
ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
intent_set_disposition(ldlm_rep, DISP_OPEN_OPEN);
struct mdt_file_data *mfd;
struct mdt_object *o;
struct md_attr *ma = &info->mti_attr;
+ struct mdt_body *repbody;
int rc;
ENTRY;
if (rc)
RETURN(rc);
+ repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ repbody->eadatasize = 0;
+ repbody->aclsize = 0;
+
med = &mdt_info_req(info)->rq_export->exp_mdt_data;
spin_lock(&med->med_open_lock);
/* release reference on this object. */
mdt_object_put(info->mti_ctxt, o);
}
- mdt_shrink_reply(info);
+ mdt_shrink_reply(info, 1);
RETURN(rc);
}
mdt_object_unlock_put(info, mc, lhc, rc);
out_unlock_parent:
mdt_object_unlock_put(info, mp, lhp, rc);
- mdt_shrink_reply(info);
+ mdt_shrink_reply(info, 1);
return rc;
}
EXCEPT="$EXCEPT 24o"
# Tests that always fail with mountconf -- FIXME
# 48a moving the working dir succeeds
-EXCEPT="$EXCEPT 48 31"
+EXCEPT="$EXCEPT 76 99"
case `uname -r` in
2.4*) FSTYPE=${FSTYPE:-ext3}; ALWAYS_EXCEPT="$ALWAYS_EXCEPT 76" ;;