From: Yang Sheng Date: Thu, 28 Mar 2024 19:54:06 +0000 (+0800) Subject: LU-17692 flock: get extra reference for lockd X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=16c36bc62ddae782588bf3a64ff079010065e331;p=fs%2Flustre-release.git LU-17692 flock: get extra reference for lockd We should get local locking first for GETLK. Else the lock_owner could be released while working with lockd. Lustre-change: https://review.whamcloud.com/54622 Lustre-commit: 7f8af8f37eadb0d332c94472ae9cb9556f4425d2 Signed-off-by: Yang Sheng Change-Id: I56e4204e315c2bdbc496b7961519ae45ab1820fe Reviewed-by: Andreas Dilger Reviewed-by: Lai Siyao Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54886 Tested-by: jenkins Tested-by: Maloo --- diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 83f8b10..c6d7a36 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -5088,6 +5088,7 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) struct md_op_data *op_data; struct lustre_handle lockh = { 0 }; union ldlm_policy_data flock = { { 0 } }; + struct file_lock flbuf = *file_lock; int fl_type = file_lock->fl_type; ktime_t kstart = ktime_get(); __u64 flags = 0; @@ -5165,8 +5166,13 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) #ifdef F_GETLK64 case F_GETLK64: #endif - flags = LDLM_FL_TEST_LOCK; - break; + flags = LDLM_FL_TEST_LOCK; + /* + * To work with lockd we should check local lock first, + * else lock_owner could disappear in conflict case. + */ + posix_test_lock(file, &flbuf); + break; default: CERROR("unknown fcntl lock command: %d\n", cmd); RETURN (-EINVAL); @@ -5216,6 +5222,19 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) ll_finish_md_op_data(op_data); + if (rc == 0 && (flags & LDLM_FL_TEST_LOCK) && + flbuf.fl_type != file_lock->fl_type) { /* Verify local & remote */ + CERROR("Flock LR mismatch! inode="DFID", flags=%#llx, mode=%u, " + "pid=%u/%u, start=%llu/%llu, end=%llu/%llu,type=%u/%u\n", + PFID(ll_inode2fid(inode)), flags, einfo.ei_mode, + file_lock->fl_pid, flbuf.fl_pid, + file_lock->fl_start, flbuf.fl_start, + file_lock->fl_end, flbuf.fl_end, + file_lock->fl_type, flbuf.fl_type); + /* return local */ + *file_lock = flbuf; + } + if (!rc) ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FLOCK, ktime_us_delta(ktime_get(), kstart));