@@ -1387,9 +1387,6 @@ static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker)
{
bool rc;
- if (lease->fl_lmops->lm_breaker_owns_lease
- && lease->fl_lmops->lm_breaker_owns_lease(lease))
- return false;
if ((breaker->fl_flags & FL_LAYOUT) != (lease->fl_flags & FL_LAYOUT)) {
rc = false;
goto trace;
@@ -1400,6 +1397,9 @@ static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker)
}
rc = locks_conflict(breaker, lease);
+ if (rc && lease->fl_lmops->lm_breaker_owns_lease &&
+ lease->fl_lmops->lm_breaker_owns_lease(lease))
+ rc = false;
trace:
trace_leases_conflict(rc, lease, breaker);
return rc;
Modify leases_conflict to call lm_breaker_owns_lease only if there is real conflict. This is to allow the lock manager to resolve the conflict if possible. Signed-off-by: Dai Ngo <dai.ngo@oracle.com> --- fs/locks.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)