locks: don't check for race with close when setting OFD lock
authorJeff Layton <jeff.layton@primarydata.com>
Fri, 8 Jan 2016 12:30:43 +0000 (07:30 -0500)
committerJeff Layton <jeff.layton@primarydata.com>
Fri, 8 Jan 2016 16:38:07 +0000 (11:38 -0500)
We don't clean out OFD locks on close(), so there's no need to check
for a race with them here. They'll get cleaned out at the same time
that flock locks are.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Acked-by: "J. Bruce Fields" <bfields@fieldses.org>
fs/locks.c

index c263aff793bc8c7ed264a870fd428a323a494021..e72077d5a664f0aa61c08c3f9fec47e16f6480b4 100644 (file)
@@ -2219,10 +2219,12 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
        error = do_lock_file_wait(filp, cmd, file_lock);
 
        /*
-        * Attempt to detect a close/fcntl race and recover by
-        * releasing the lock that was just acquired.
+        * Attempt to detect a close/fcntl race and recover by releasing the
+        * lock that was just acquired. There is no need to do that when we're
+        * unlocking though, or for OFD locks.
         */
-       if (!error && file_lock->fl_type != F_UNLCK) {
+       if (!error && file_lock->fl_type != F_UNLCK &&
+           !(file_lock->fl_flags & FL_OFDLCK)) {
                /*
                 * We need that spin_lock here - it prevents reordering between
                 * update of i_flctx->flc_posix and check for it done in
@@ -2361,10 +2363,12 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,
        error = do_lock_file_wait(filp, cmd, file_lock);
 
        /*
-        * Attempt to detect a close/fcntl race and recover by
-        * releasing the lock that was just acquired.
+        * Attempt to detect a close/fcntl race and recover by releasing the
+        * lock that was just acquired. There is no need to do that when we're
+        * unlocking though, or for OFD locks.
         */
-       if (!error && file_lock->fl_type != F_UNLCK) {
+       if (!error && file_lock->fl_type != F_UNLCK &&
+           !(file_lock->fl_flags & FL_OFDLCK)) {
                /*
                 * We need that spin_lock here - it prevents reordering between
                 * update of i_flctx->flc_posix and check for it done in