X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Ffile.c;h=08465645c0db03ab5c85e60d454e5ee7b1ff94b4;hb=7f8af8f37eadb0d332c94472ae9cb9556f4425d2;hp=bc8905bf63a8a41109febec691abf0b7e641d988;hpb=8c88d744294609bf282e71c4de74a96c8a495051;p=fs%2Flustre-release.git diff --git a/lustre/llite/file.c b/lustre/llite/file.c index bc8905b..0846564 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -5108,6 +5108,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; @@ -5188,6 +5189,11 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) case F_GETLK64: #endif 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: rc = -EINVAL; @@ -5240,6 +5246,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));