Whamcloud - gitweb
- add mode field in mdt_rec_rename. used for cross-ref request
authortappro <tappro>
Mon, 18 Sep 2006 21:04:34 +0000 (21:04 +0000)
committertappro <tappro>
Mon, 18 Sep 2006 21:04:34 +0000 (21:04 +0000)
- copy lmm and unlink cookie from cross-ref unlink to the initial reply buffers

lustre/cmm/mdc_object.c
lustre/include/lustre/lustre_idl.h
lustre/mdc/mdc_lib.c
lustre/mdt/mdt_lib.c
lustre/ptlrpc/pack_generic.c

index a5d4c3f..1c5e3b5 100644 (file)
@@ -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;
index 23b835b..eb7a1d7 100644 (file)
@@ -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);
index 670a55d..504d82e 100644 (file)
@@ -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);
index a1e5baf..ae801c6 100644 (file)
@@ -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)
index 764ead0..5869fcf 100644 (file)
@@ -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);