From 708d85a652a77f85153790e6cca1b7a2b91947cf Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Thu, 30 Jan 2014 11:07:13 -0600 Subject: [PATCH] LU-4398 mdt: acquire an open lock for write or execute 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 Change-Id: I8092bca4c418ec99a25584abdfb635ffec19a26e Reviewed-on: http://review.whamcloud.com/9063 Reviewed-by: Jinshan Xiong Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_open.c | 37 ++++++++++++++++++------------------- lustre/tests/sanityn.sh | 10 ++++++++++ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 6ab847a..85b7568 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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); diff --git a/lustre/tests/sanityn.sh b/lustre/tests/sanityn.sh index ddfd6ee..d02dddc 100644 --- a/lustre/tests/sanityn.sh +++ b/lustre/tests/sanityn.sh @@ -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 -- 1.8.3.1