struct md_object *next = mdt_object_child(o);
const struct mdt_body *reqbody = info->mti_body;
struct ptlrpc_request *req = mdt_info_req(info);
- struct lu_attr *la = &info->mti_attr;
+ struct lu_attr *la = &info->mti_attr.ma_attr;
struct req_capsule *pill = &info->mti_pill;
const struct lu_context *ctxt = info->mti_ctxt;
struct mdt_body *repbody;
next = mdt_object_child(info->mti_object);
fid = mdt_object_fid(info->mti_object);
rc = mo_attr_get(info->mti_ctxt,
- next, &info->mti_attr);
+ next, &info->mti_attr.ma_attr);
if (rc == 0) {
body = req_capsule_server_get(pill,
&RMF_MDT_BODY);
mdt_pack_attr2body(body,
- &info->mti_attr,
+ &info->mti_attr.ma_attr,
fid);
}
}
ldlm_policy_data_t *policy,
struct ldlm_res_id *res_id)
{
- int flags = 0;
+ int flags = 0; /*XXX: LDLM_FL_LOCAL_ONLY?*/
int rc;
LASSERT(ns != NULL);
static void mdt_thread_info_init(struct ptlrpc_request *req,
struct mdt_thread_info *info)
{
- memset(info, 0, sizeof *info);
-/*
int i;
- memset(&info->mti_rr, 0, sizeof info->mti_rr);
- memset(&info->mti_attr, 0, sizeof info->mti_attr);
- for (i = 0; i < ARRAY_SIZE(info->mti_rep_buf_size); i++)
- info->mti_rep_buf_size[i] = 0;
- info->mti_rep_buf_nr = i;
+ memset(info, 0, sizeof(*info));
+
+ info->mti_rep_buf_nr = ARRAY_SIZE(info->mti_rep_buf_size);
for (i = 0; i < ARRAY_SIZE(info->mti_lh); i++)
mdt_lock_handle_init(&info->mti_lh[i]);
-*/
info->mti_fail_id = OBD_FAIL_MDS_ALL_REPLY_NET;
info->mti_ctxt = req->rq_svc_thread->t_ctx;
ctx = req->rq_svc_thread->t_ctx;
LASSERT(ctx != NULL);
LASSERT(ctx->lc_thread == req->rq_svc_thread);
-
info = lu_context_key_get(ctx, &mdt_thread_key);
LASSERT(info != NULL);
/*
* Object attributes.
*/
- struct lu_attr mti_attr;
+ struct md_attr mti_attr;
/*
* reint record. Containing information for reint operations.
*/
#include "mdt_internal.h"
-/* if object is dying, pack the lov/llog data */
+/* if object is dying, pack the lov/llog data,
+ * parameter info->mti_attr should be valid at this point! */
int mdt_handle_last_unlink(struct mdt_thread_info *info,
struct mdt_object *mo, const struct req_format *fmt)
{
struct mdt_body *body;
+ struct lu_attr *la = &info->mti_attr.ma_attr;
int rc = 0;
ENTRY;
- rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mo),
- &info->mti_attr);
- if (rc)
- RETURN(rc);
-
body = req_capsule_server_get(&info->mti_pill,
&RMF_MDT_BODY);
- mdt_pack_attr2body(body, &info->mti_attr, mdt_object_fid(mo));
+ mdt_pack_attr2body(body, la, mdt_object_fid(mo));
/* if last unlinked object reference so client should destroy ost
* objects*/
- if (S_ISREG(info->mti_attr.la_mode) &&
- info->mti_attr.la_nlink == 0 && mo->mot_header.loh_ref == 1) {
+ if (S_ISREG(la->la_mode) &&
+ la->la_nlink == 0 && mo->mot_header.loh_ref == 1) {
struct lov_mds_md *lmm;
- CERROR("Last object!\n");
/* reply should contains more data,
* * so we need to extend it */
req_capsule_extend(&info->mti_pill, fmt);
static int mdt_setattr_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_setattr *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
ENTRY;
static int mdt_create_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_create *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
int result = 0;
static int mdt_link_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_link *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
ENTRY;
static int mdt_unlink_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_unlink *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
ENTRY;
static int mdt_rename_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_rename *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
ENTRY;
static int mdt_open_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_create *rec;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct req_capsule *pill = &info->mti_pill;
struct mdt_reint_record *rr = &info->mti_rr;
int result;
struct mdt_file_data *mfd;
struct mdt_body *repbody;
struct lov_mds_md *lmm = NULL;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct ptlrpc_request *req = mdt_info_req(info);
int rc = 0;
ENTRY;
struct mdt_lock_handle *lh;
struct ldlm_reply *ldlm_rep;
struct lu_fid *child_fid = &info->mti_tmp_fid1;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
int result;
int created = 0;
struct mdt_reint_record *rr = &info->mti_rr;
if (strlen(rr->rr_name) == 0) {
/* reint partial remote open */
- RETURN(mdt_open_by_fid(info, rr->rr_fid1,
- info->mti_attr.la_flags));
+ RETURN(mdt_open_by_fid(info, rr->rr_fid1, attr->la_flags));
}
/* we now have no resent message, so it must be an intent */
if (result == -ENOENT) {
intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
- if (!(info->mti_attr.la_flags & MDS_OPEN_CREAT))
+ if (!(attr->la_flags & MDS_OPEN_CREAT))
GOTO(out_parent, result);
*child_fid = *info->mti_rr.rr_fid2;
} else {
intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
- if (info->mti_attr.la_flags & MDS_OPEN_EXCL &&
- info->mti_attr.la_flags & MDS_OPEN_CREAT)
+ if (attr->la_flags & MDS_OPEN_EXCL &&
+ attr->la_flags & MDS_OPEN_CREAT)
GOTO(out_parent, result = -EEXIST);
/* child_fid is filled by mdo_lookup(). */
LASSERT(lu_fid_eq(child_fid, info->mti_rr.rr_fid2));
}
/* Open it now. */
- result = mdt_mfd_open(info, child, info->mti_attr.la_flags);
+ result = mdt_mfd_open(info, child, attr->la_flags);
intent_set_disposition(ldlm_rep, DISP_OPEN_OPEN);
GOTO(finish_open, result);
finish_open:
- if (result != 0 && result != -EREMOTE && created) {
+ if (result != 0 && created) {
mdo_unlink(info->mti_ctxt, mdt_object_child(parent),
- mdt_object_child(child), rr->rr_name);
+ mdt_object_child(child), rr->rr_name,
+ &info->mti_attr);
}
out_child:
mdt_object_put(info->mti_ctxt, child);
struct mdt_object *child;
struct mdt_lock_handle *lh;
struct mdt_body *repbody;
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
int rc;
ENTRY;
struct md_object *next = mdt_object_child(parent);
rc = mdo_create(info->mti_ctxt, next, rr->rr_name,
- mdt_object_child(child), rr->rr_tgt, attr);
+ mdt_object_child(child), rr->rr_tgt, &info->mti_attr);
if (rc == 0) {
/* return fid & attr to client. attr is over-written!*/
rc = mo_attr_get(info->mti_ctxt,
/* return fid to client. */
rc = mo_attr_get(info->mti_ctxt,
next,
- &info->mti_attr);
+ &info->mti_attr.ma_attr);
if (rc == 0) {
- mdt_pack_attr2body(repbody, &info->mti_attr,
+ mdt_pack_attr2body(repbody,
+ &info->mti_attr.ma_attr,
mdt_object_fid(o));
}
}
* We use the ATTR_FROM_OPEN flag to tell these cases apart. */
static int mdt_reint_setattr(struct mdt_thread_info *info)
{
- struct lu_attr *attr = &info->mti_attr;
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_object *mo;
int rc;
ENTRY;
- switch (info->mti_attr.la_mode & S_IFMT) {
+ switch (info->mti_attr.ma_attr.la_mode & S_IFMT) {
case S_IFREG:
case S_IFDIR:{
if (strlen(info->mti_rr.rr_name) > 0)
if (strlen(rr->rr_name) == 0) {
/* remote partial operation */
- rc = mo_ref_del(info->mti_ctxt, mdt_object_child(mp));
+ rc = mo_ref_del(info->mti_ctxt, mdt_object_child(mp),
+ &info->mti_attr);
GOTO(out_unlock_parent, rc);
}
/* step 4: delete it */
/* cmm will take care if child is local or remote */
rc = mdo_unlink(info->mti_ctxt, mdt_object_child(mp),
- mdt_object_child(mc), rr->rr_name);
+ mdt_object_child(mc), rr->rr_name, &info->mti_attr);
if (rc)
GOTO(out_unlock_child, rc);