|
@@ -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
|