Whamcloud - gitweb
LU-4398 mdt: acquire an open lock for write or execute 63/9063/3
authorJohn L. Hammond <john.hammond@intel.com>
Thu, 30 Jan 2014 17:07:13 +0000 (11:07 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 21 Mar 2014 14:03:24 +0000 (14:03 +0000)
In mdt_object_open_lock() opens for write or execute will always
acquire an open lock of the appropriate mode so that any conflicting
cached open locks on other clients will be canceled. Add a regression
test to sanityn.sh.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I8092bca4c418ec99a25584abdfb635ffec19a26e
Reviewed-on: http://review.whamcloud.com/9063
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdt/mdt_open.c
lustre/tests/sanityn.sh

index 6ab847a..85b7568 100644 (file)
@@ -1245,30 +1245,29 @@ static int mdt_object_open_lock(struct mdt_thread_info *info,
                /* normal open holds read mode of open sem */
                down_read(&obj->mot_open_sem);
 
-               if (open_flags & MDS_OPEN_LOCK) {
-                       if (open_flags & FMODE_WRITE)
-                               lm = LCK_CW;
-                       else if (open_flags & MDS_FMODE_EXEC)
-                               lm = LCK_PR;
-                       else
-                               lm = LCK_CR;
+               if (open_flags & FMODE_WRITE)
+                       lm = LCK_CW;
+               else if (open_flags & MDS_FMODE_EXEC)
+                       lm = LCK_PR;
+               else
+                       lm = LCK_CR;
 
+               if (open_flags & MDS_OPEN_LOCK) {
                        *ibits = MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN;
-               } else if (atomic_read(&obj->mot_lease_count) > 0) {
-                       if (open_flags & FMODE_WRITE)
-                               lm = LCK_CW;
-                       else
-                               lm = LCK_CR;
-
-                       /* revoke lease */
-                       *ibits = MDS_INODELOCK_OPEN;
+               } else if (open_flags & (FMODE_WRITE | MDS_FMODE_EXEC) ||
+                          atomic_read(&obj->mot_lease_count) > 0) {
+                       /* We need to flush conflicting locks or revoke a lease.
+                        * In either case there is no need to acquire a layout
+                        * lock since it won't be returned to the client. */
                        try_layout = false;
-
+                       *ibits = MDS_INODELOCK_OPEN;
                        lhc = &info->mti_lh[MDT_LH_LOCAL];
                }
-               CDEBUG(D_INODE, "normal open:"DFID" lease count: %d, lm: %d\n",
-                       PFID(mdt_object_fid(obj)),
-                       atomic_read(&obj->mot_open_count), lm);
+
+               CDEBUG(D_INODE, "normal open FID = "DFID", open_count = %d, "
+                      "lm = %d\n",
+                      PFID(mdt_object_fid(obj)),
+                      atomic_read(&obj->mot_open_count), lm);
        }
 
        mdt_lock_reg_init(lhc, lm);
index ddfd6ee..d02dddc 100644 (file)
@@ -358,6 +358,16 @@ test_14d() { # bug 10921
 }
 run_test 14d "chmod of executing file is still possible ========"
 
+test_14e() { # LU-4398
+       test_mkdir -p $DIR1/$tdir
+       rm -f $DIR1/$tdir/echo
+       cp /bin/echo $DIR1/$tdir/echo
+       $DIR1/$tdir/echo Hi
+       $DIR1/$tdir/echo Hi
+       echo Bye > $DIR2/$tdir/echo
+}
+run_test 14e "conflicting locks are flushed on open"
+
 test_15() {    # bug 974 - ENOSPC
        echo "PATH=$PATH"
        sh oos2.sh $MOUNT1 $MOUNT2