Whamcloud - gitweb
Branch HEAD
authorfanyong <fanyong>
Thu, 6 Mar 2008 04:13:32 +0000 (04:13 +0000)
committerfanyong <fanyong>
Thu, 6 Mar 2008 04:13:32 +0000 (04:13 +0000)
b=14976
i=eric.mei
i=h.huang

(1) Miss to call "req_capsule_set_size()" in "mdc_get_remote_perm()".
(2) misc fix after mixed_layout_req landed.

lustre/llite/remote_perm.c
lustre/mdc/mdc_request.c
lustre/mdt/mdt_xattr.c

index 3e4ef7e..ae7b453 100644 (file)
@@ -239,50 +239,55 @@ int lustre_check_remote_perm(struct inode *inode, int mask)
         int i = 0, rc;
         ENTRY;
 
-check:
-        utime = lli->lli_rmtperm_utime;
-        rc = do_check_remote_perm(lli, mask);
-        if (!rc || ((rc != -ENOENT) && i))
-                RETURN(rc);
+        do {
+                utime = lli->lli_rmtperm_utime;
+                rc = do_check_remote_perm(lli, mask);
+                if (!rc || (rc != -ENOENT && i))
+                        break;
+
+                might_sleep();
+
+                down(&lli->lli_rmtperm_sem);
+                /* check again */
+                if (utime != lli->lli_rmtperm_utime) {
+                        rc = do_check_remote_perm(lli, mask);
+                        if (!rc || (rc != -ENOENT && i)) {
+                                up(&lli->lli_rmtperm_sem);
+                                break;
+                        }
+                }
 
-        might_sleep();
+                if (i++ > 5) {
+                        CERROR("check remote perm falls in dead loop!\n");
+                        LBUG();
+                }
 
-        down(&lli->lli_rmtperm_sem);
-        /* check again */
-        if (utime != lli->lli_rmtperm_utime) {
-                rc = do_check_remote_perm(lli, mask);
-                if (!rc || ((rc != -ENOENT) && i)) {
+                oc = ll_mdscapa_get(inode);
+                rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), oc,
+                                        ll_i2suppgid(inode), &req);
+                capa_put(oc);
+                if (rc) {
                         up(&lli->lli_rmtperm_sem);
-                        RETURN(rc);
+                        break;
                 }
-        }
 
-        if (i++ > 5) {
-                CERROR("check remote perm falls in dead loop!\n");
-                LBUG();
-        }
+                perm = req_capsule_server_swab_get(&req->rq_pill, &RMF_ACL,
+                                                   lustre_swab_mdt_remote_perm);
+                if (unlikely(perm == NULL)) {
+                        up(&lli->lli_rmtperm_sem);
+                        rc = -EPROTO;
+                        break;
+                }
 
-        oc = ll_mdscapa_get(inode);
-        rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), oc,
-                                ll_i2suppgid(inode), &req);
-        capa_put(oc);
-        if (rc) {
+                rc = ll_update_remote_perm(inode, perm);
                 up(&lli->lli_rmtperm_sem);
-                RETURN(rc);
-        }
-
-        perm = req_capsule_server_get(&req->rq_pill, &RMF_ACL);
-        LASSERT(perm);
-
-        rc = ll_update_remote_perm(inode, perm);
-        up(&lli->lli_rmtperm_sem);
+                if (rc == -ENOMEM)
+                        break;
 
+                ptlrpc_req_finished(req);
+        } while (1);
         ptlrpc_req_finished(req);
-
-        if (rc == -ENOMEM)
-                RETURN(rc);
-
-        goto check;
+        RETURN(rc);
 }
 
 #if 0  /* NB: remote perms can't be freed in ll_mdc_blocking_ast of UPDATE lock,
index b0f3159..0d16809 100644 (file)
@@ -225,9 +225,11 @@ int mdc_getattr(struct obd_export *exp, const struct lu_fid *fid,
         mdc_pack_body(req, fid, oc, valid, ea_size, -1, MDS_BFLAG_EXT_FLAGS);
 
         req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER, ea_size);
-        if (valid & OBD_MD_FLRMTPERM)
+        if (valid & OBD_MD_FLRMTPERM) {
+                LASSERT(client_is_remote(exp));
                 req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
                                      sizeof(struct mdt_remote_perm));
+        }
         ptlrpc_request_set_replen(req);
 
         rc = mdc_getattr_common(exp, req);
@@ -548,7 +550,9 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
 
         if (md->body->valid & OBD_MD_FLRMTPERM) {
                 /* remote permission */
-                md->remote_perm = req_capsule_server_get(pill, &RMF_ACL);
+                LASSERT(client_is_remote(exp));
+                md->remote_perm = req_capsule_server_swab_get(pill, &RMF_ACL,
+                                                lustre_swab_mdt_remote_perm);
                 if (!md->remote_perm)
                         GOTO(out, rc = -EPROTO);
         }
@@ -1669,6 +1673,8 @@ int mdc_get_remote_perm(struct obd_export *exp, const struct lu_fid *fid,
         int                    rc;
         ENTRY;
 
+        LASSERT(client_is_remote(exp));
+
         *request = NULL;
         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_GETATTR);
         if (req == NULL)
@@ -1684,6 +1690,9 @@ int mdc_get_remote_perm(struct obd_export *exp, const struct lu_fid *fid,
 
         mdc_pack_body(req, fid, oc, OBD_MD_FLRMTPERM, 0, suppgid, 0);
 
+        req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
+                             sizeof(struct mdt_remote_perm));
+
         ptlrpc_request_set_replen(req);
 
         rc = ptlrpc_queue_wait(req);
index 2aaaeaf..83ecc74 100644 (file)
@@ -68,9 +68,9 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info)
                     !strncmp(xattr_name, user_string, sizeof(user_string) - 1))
                         RETURN(-EOPNOTSUPP);
                 
-                        size = mo_xattr_get(info->mti_env,
-                                            mdt_object_child(info->mti_object),
-                                            &LU_BUF_NULL, xattr_name);
+                size = mo_xattr_get(info->mti_env,
+                                    mdt_object_child(info->mti_object),
+                                    &LU_BUF_NULL, xattr_name);
         } else if ((valid & OBD_MD_FLXATTRLS) == OBD_MD_FLXATTRLS) {
                 size = mo_xattr_list(info->mti_env,
                                      mdt_object_child(info->mti_object),
@@ -110,10 +110,10 @@ int mdt_getxattr(struct mdt_thread_info *info)
         struct ptlrpc_request  *req = mdt_info_req(info);
         struct mdt_export_data *med = mdt_req2med(req);
         struct md_ucred        *uc  = mdt_ucred(info);
-        struct  mdt_body       *reqbody;
-        struct  mdt_body       *repbody = NULL;
-        struct  md_object      *next;
-        struct  lu_buf         *buf;
+        struct mdt_body        *reqbody;
+        struct mdt_body        *repbody = NULL;
+        struct md_object       *next;
+        struct lu_buf          *buf;
         int                     easize, rc;
         ENTRY;
 
@@ -168,7 +168,7 @@ int mdt_getxattr(struct mdt_thread_info *info)
                                                           &RMF_NAME);
                 CDEBUG(D_INODE, "getxattr %s\n", xattr_name);
 
-                        rc = mo_xattr_get(info->mti_env, next, buf, xattr_name);
+                rc = mo_xattr_get(info->mti_env, next, buf, xattr_name);
                 if (rc < 0) {
                         CERROR("getxattr failed: %d\n", rc);
                         GOTO(out, rc);
@@ -210,16 +210,17 @@ out:
         return rc;
 }
 
-static int mdt_rmtlsetfacl(struct mdt_thread_info *info, const char *xattr_name,
+static int mdt_rmtlsetfacl(struct mdt_thread_info *info,
+                           struct md_object *next,
+                           const char *xattr_name,
                            ext_acl_xattr_header *header,
                            posix_acl_xattr_header **out)
 {
-        struct ptlrpc_request *req = mdt_info_req(info);
+        struct ptlrpc_request  *req = mdt_info_req(info);
         struct mdt_export_data *med = mdt_req2med(req);
-        struct md_ucred *uc = mdt_ucred(info);
-        struct md_object *next = mdt_object_child(info->mti_object);
-        struct lu_buf         *buf = &info->mti_buf;
-        int rc;
+        struct md_ucred        *uc = mdt_ucred(info);
+        struct lu_buf          *buf = &info->mti_buf;
+        int                     rc;
         ENTRY;
 
         rc = lustre_ext_acl_xattr_id2server(uc, med->med_idmap, header);
@@ -273,7 +274,7 @@ int mdt_reint_setxattr(struct mdt_thread_info *info,
         struct mdt_object       *obj; 
         struct md_object        *child;
         __u64                    valid = attr->la_valid;
-        const char               *xattr_name;
+        const char              *xattr_name;
         int                      xattr_len = 0;
         __u64                    lockpart;
         int                      rc;
@@ -346,7 +347,8 @@ int mdt_reint_setxattr(struct mdt_thread_info *info,
 
                         if (valid & OBD_MD_FLRMTLSETFACL) {
                                 LASSERT(med->med_rmtclient);
-                                xattr_len = mdt_rmtlsetfacl(info, xattr_name,
+                                xattr_len = mdt_rmtlsetfacl(info, child,
+                                                xattr_name,
                                                 (ext_acl_xattr_header *)xattr,
                                                 &new_xattr);
                                 if (xattr_len < 0)