From ab751503b2fe54b392c9a8e6f99abd41c3f1b602 Mon Sep 17 00:00:00 2001 From: tappro Date: Mon, 18 Sep 2006 21:04:34 +0000 Subject: [PATCH] - add mode field in mdt_rec_rename. used for cross-ref request - copy lmm and unlink cookie from cross-ref unlink to the initial reply buffers --- lustre/cmm/mdc_object.c | 55 ++++++++++++++++++++++++++++++++++---- lustre/include/lustre/lustre_idl.h | 8 +++--- lustre/mdc/mdc_lib.c | 1 + lustre/mdt/mdt_lib.c | 5 +++- lustre/ptlrpc/pack_generic.c | 2 +- 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index a5d4c3f..1c5e3b5 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -144,19 +144,62 @@ static void mdc_body2attr(struct mdt_body *body, struct md_attr *ma) ma->ma_valid = MA_INODE; } -static void mdc_req2attr_update(const struct lu_context *ctx, +static int mdc_req2attr_update(const struct lu_context *ctx, struct md_attr *ma) { struct mdc_thread_info *mci; struct ptlrpc_request *req; struct mdt_body *body; + struct lov_mds_md *lov; + struct llog_cookie *cookie; + ENTRY; mci = mdc_info_get(ctx); req = mci->mci_req; LASSERT(req); body = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(*body)); LASSERT(body); mdc_body2attr(body, ma); + + if (!(body->valid & OBD_MD_FLEASIZE)) + RETURN(0); + + if (body->eadatasize == 0) { + CERROR("OBD_MD_FLEASIZE is set but eadatasize is zero\n"); + RETURN(-EPROTO); + } + + lov = lustre_swab_repbuf(req, REPLY_REC_OFF + 1, + body->eadatasize, NULL); + if (lov == NULL) { + CERROR("Can't unpack MDS EA data\n"); + RETURN(-EPROTO); + } + + LASSERT(ma->ma_lmm != NULL); + LASSERT(ma->ma_lmm_size == body->eadatasize); + memcpy(ma->ma_lmm, lov, ma->ma_lmm_size); + ma->ma_valid |= MA_LOV; + if (!(body->valid & OBD_MD_FLCOOKIE)) + RETURN(0); + + if (body->aclsize == 0) { + CERROR("OBD_MD_FLCOOKIE is set but cookie size is zero\n"); + RETURN(-EPROTO); + } + + cookie = lustre_msg_buf(req->rq_repmsg, + REPLY_REC_OFF + 2, body->aclsize); + if (cookie == NULL) { + CERROR("Can't unpack unlink cookie data\n"); + RETURN(-EPROTO); + } + + LASSERT(ma->ma_cookie != NULL); + LASSERT(ma->ma_cookie_size == body->aclsize); + memcpy(ma->ma_cookie, cookie, ma->ma_cookie_size); + ma->ma_valid |= MA_COOKIE; + RETURN(0); } static int mdc_attr_get(const struct lu_context *ctx, struct md_object *mo, @@ -173,12 +216,13 @@ static int mdc_attr_get(const struct lu_context *ctx, struct md_object *mo, memset(&mci->mci_opdata, 0, sizeof(mci->mci_opdata)); rc = md_getattr(mc->mc_desc.cl_exp, lu_object_fid(&mo->mo_lu), - OBD_MD_FLMODE | OBD_MD_FLUID | OBD_MD_FLGID, + OBD_MD_FLMODE | OBD_MD_FLUID | OBD_MD_FLGID | + OBD_MD_FLFLAGS, 0, &mci->mci_req); if (rc == 0) { /* get attr from request */ - mdc_req2attr_update(ctx, ma); + rc = mdc_req2attr_update(ctx, ma); } ptlrpc_req_finished(mci->mci_req); @@ -224,7 +268,7 @@ static int mdc_object_create(const struct lu_context *ctx, if (rc == 0) { /* get attr from request */ - mdc_req2attr_update(ctx, ma); + rc = mdc_req2attr_update(ctx, ma); } ptlrpc_req_finished(mci->mci_req); @@ -273,7 +317,7 @@ static int mdc_ref_del(const struct lu_context *ctx, struct md_object *mo, rc = md_unlink(mc->mc_desc.cl_exp, &mci->mci_opdata, &mci->mci_req); if (rc == 0) { /* get attr from request */ - mdc_req2attr_update(ctx, ma); + rc = mdc_req2attr_update(ctx, ma); } ptlrpc_req_finished(mci->mci_req); @@ -319,6 +363,7 @@ static int mdc_rename_tgt(const struct lu_context *ctx, mci = mdc_info_init(ctx); mci->mci_opdata.fid1 = *lu_object_fid(&mo_p->mo_lu); mci->mci_opdata.fid2 = *lf; + mci->mci_opdata.create_mode = la->la_mode; mci->mci_opdata.mod_time = la->la_ctime; mci->mci_opdata.fsuid = la->la_uid; mci->mci_opdata.fsgid = la->la_gid; diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 23b835b..eb7a1d7 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -1278,10 +1278,10 @@ struct mdt_rec_rename { struct lu_fid rn_fid1; struct lu_fid rn_fid2; __u64 rn_time; - __u32 rn_padding_1; /* also fix lustre_swab_mds_rec_rename */ - __u32 rn_padding_2; /* also fix lustre_swab_mds_rec_rename */ - __u32 rn_padding_3; /* also fix lustre_swab_mds_rec_rename */ - __u32 rn_padding_4; /* also fix lustre_swab_mds_rec_rename */ + __u32 rn_mode; /* cross-ref rename has mode */ + __u32 rn_padding_2; /* also fix lustre_swab_mdt_rec_rename */ + __u32 rn_padding_3; /* also fix lustre_swab_mdt_rec_rename */ + __u32 rn_padding_4; /* also fix lustre_swab_mdt_rec_rename */ }; extern void lustre_swab_mdt_rec_rename (struct mdt_rec_rename *rn); diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 670a55d..504d82e 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -319,6 +319,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset, rec->rn_fid1 = op_data->fid1; rec->rn_fid2 = op_data->fid2; rec->rn_time = op_data->mod_time; + rec->rn_mode = op_data->create_mode; tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, oldlen + 1); LOGL0(old, oldlen, tmp); diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index a1e5baf..ae801c6 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -385,7 +385,10 @@ static int mdt_rename_unpack(struct mdt_thread_info *info) rr->rr_fid2 = &rec->rn_fid2; attr->la_ctime = rec->rn_time; attr->la_mtime = rec->rn_time; - attr->la_valid = LA_UID | LA_GID | LA_CTIME | LA_MTIME; + /* rename_tgt contains the mode already */ + attr->la_mode = rec->rn_mode; + attr->la_valid = LA_UID | LA_GID | LA_CTIME | + LA_MTIME | LA_MODE; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT); if (rr->rr_name == NULL || rr->rr_tgt == NULL) diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 764ead0..5869fcf 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -1902,7 +1902,7 @@ void lustre_swab_mdt_rec_rename (struct mdt_rec_rename *rn) lustre_swab_lu_fid (&rn->rn_fid1); lustre_swab_lu_fid (&rn->rn_fid2); __swab64s (&rn->rn_time); - CLASSERT(offsetof(typeof(*rn), rn_padding_1) != 0); + __swab32s (&rn->rn_mode); CLASSERT(offsetof(typeof(*rn), rn_padding_2) != 0); CLASSERT(offsetof(typeof(*rn), rn_padding_3) != 0); CLASSERT(offsetof(typeof(*rn), rn_padding_4) != 0); -- 1.8.3.1