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>
/* normal open holds read mode of open sem */
down_read(&obj->mot_open_sem);
/* 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;
*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. */
+ *ibits = MDS_INODELOCK_OPEN;
lhc = &info->mti_lh[MDT_LH_LOCAL];
}
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);
}
mdt_lock_reg_init(lhc, lm);
}
run_test 14d "chmod of executing file is still possible ========"
}
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
test_15() { # bug 974 - ENOSPC
echo "PATH=$PATH"
sh oos2.sh $MOUNT1 $MOUNT2