Whamcloud - gitweb
LU-144 xattr fixes
authorAlexey Lyashkov <Alexey_Lyashkov@xyratex.com>
Fri, 18 Mar 2011 11:55:56 +0000 (14:55 +0300)
committerOleg Drokin <green@whamcloud.com>
Tue, 5 Apr 2011 03:31:50 +0000 (20:31 -0700)
- generate trusted.lov locally instead of ask MDT about it
- take conflicting LCK_EX lock to properly flush ALCs on update from client

Change-Id: Ic78f21fffb5174f83400e70ab368c80531322663
Signed-off-by: Alexey Lyashkov <Alexey_Lyashkov@xyratex.com>
Signed-off-by: Vitaly Fertman <vitaly_fertman@xyratex.com>
Reviewed-on: http://review.whamcloud.com/341
Tested-by: Hudson
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
lustre/llite/xattr.c
lustre/mdt/mdt_xattr.c

index 668e3dc..567cd82 100644 (file)
@@ -432,20 +432,34 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
                 struct ptlrpc_request *request = NULL;
                 int rc = 0, lmmsize = 0;
 
-                if (S_ISREG(inode->i_mode)) {
-                        rc = ll_lov_getstripe_ea_info(dentry->d_parent->d_inode,
-                                                      dentry->d_name.name, &lmm,
+                if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
+                        return -ENODATA;
+
+                if (size == 0) {
+                        /* size == 0 just ask for buffer size */
+                        rc = ll_get_max_mdsize(ll_i2sbi(inode), &lmmsize);
+                        if (rc == 0)
+                                rc = lmmsize;
+                        GOTO(out, rc);
+                }
+
+                if (!ll_i2info(inode)->lli_smd) {
+                        if (S_ISDIR(inode->i_mode)) {
+                                rc = ll_dir_getstripe(inode, &lmm,
                                                       &lmmsize, &request);
-                } else if (S_ISDIR(inode->i_mode)) {
-                        rc = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);
+                        } else {
+                                rc = -ENODATA;
+                        }
                 } else {
-                        rc = -ENODATA;
+                        /* LSM is present already after lookup/getattr call.
+                         * we need to grab layout lock once it is implemented */
+                        rc = obd_packmd(ll_i2dtexp(inode), &lmm,
+                                        ll_i2info(inode)->lli_smd);
+                        lmmsize = rc;
                 }
 
                 if (rc < 0)
                        GOTO(out, rc);
-                if (size == 0)
-                       GOTO(out, rc = lmmsize);
 
                 if (size < lmmsize) {
                         CERROR("server bug: replied size %d > %d for %s (%s)\n",
@@ -458,7 +472,10 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
 
                 rc = lmmsize;
 out:
-                ptlrpc_req_finished(request);
+                if (request)
+                        ptlrpc_req_finished(request);
+                else if (lmm)
+                        obd_free_diskmd(ll_i2dtexp(inode), &lmm);
                 return(rc);
         }
 
index 631dab5..0db7f33 100644 (file)
@@ -348,7 +348,9 @@ int mdt_reint_setxattr(struct mdt_thread_info *info,
                 lockpart |= MDS_INODELOCK_LOOKUP;
 
         lh = &info->mti_lh[MDT_LH_PARENT];
-        mdt_lock_reg_init(lh, LCK_PW);
+        /* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX
+         * to cancel them. */
+        mdt_lock_reg_init(lh, LCK_EX);
         obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart);
         if (IS_ERR(obj))
                 GOTO(out, rc =  PTR_ERR(obj));