filelock: fix deadlock detection in POSIX locking
authorJeff Layton <jlayton@kernel.org>
Sun, 18 Feb 2024 13:33:28 +0000 (08:33 -0500)
committerChristian Brauner <brauner@kernel.org>
Tue, 20 Feb 2024 08:53:33 +0000 (09:53 +0100)
The FL_POSIX check in __locks_insert_block was inadvertantly broken
recently and is now inserting only OFD locks instead of only legacy
POSIX locks.

This breaks deadlock detection in POSIX locks, and may also be the root
cause of a performance regression noted by the kernel test robot.
Restore the proper sense of the test.

Fixes: b6be3714005c ("filelock: convert __locks_insert_block, conflict and deadlock checks to use file_lock_core")
Reported-by: kernel test robot <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202402181229.f8147f40-oliver.sang@intel.com
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://lore.kernel.org/r/20240218-flsplit4-v1-1-26454fc090f2@kernel.org
Reviewed-by: NeilBrown <neilb@suse.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/locks.c

index 26d52ef5314a28493ff5f13e89c403e6a31a73d0..90c8746874dedbbb71e14b8269bbbcd216fd1bf7 100644 (file)
@@ -812,7 +812,7 @@ new_blocker:
        list_add_tail(&waiter->flc_blocked_member,
                      &blocker->flc_blocked_requests);
 
-       if ((blocker->flc_flags & (FL_POSIX|FL_OFDLCK)) == (FL_POSIX|FL_OFDLCK))
+       if ((blocker->flc_flags & (FL_POSIX|FL_OFDLCK)) == FL_POSIX)
                locks_insert_global_blocked(waiter);
 
        /* The requests in waiter->flc_blocked are known to conflict with