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;
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;
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));