lockd: ensure we use the correct file descriptor when unlocking
authorJeff Layton <jlayton@kernel.org>
Fri, 11 Nov 2022 19:36:37 +0000 (14:36 -0500)
committerChuck Lever <cel@kernel.org>
Sat, 10 Dec 2022 16:01:11 +0000 (11:01 -0500)
Shared locks are set on O_RDONLY descriptors and exclusive locks are set
on O_WRONLY ones. nlmsvc_unlock however calls vfs_lock_file twice, once
for each descriptor, but it doesn't reset fl_file. Ensure that it does.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/lockd/svclock.c

index 9c1aa75..9eae99e 100644 (file)
@@ -659,11 +659,13 @@ nlmsvc_unlock(struct net *net, struct nlm_file *file, struct nlm_lock *lock)
        nlmsvc_cancel_blocked(net, file, lock);
 
        lock->fl.fl_type = F_UNLCK;
-       if (file->f_file[O_RDONLY])
-               error = vfs_lock_file(file->f_file[O_RDONLY], F_SETLK,
+       lock->fl.fl_file = file->f_file[O_RDONLY];
+       if (lock->fl.fl_file)
+               error = vfs_lock_file(lock->fl.fl_file, F_SETLK,
                                        &lock->fl, NULL);
-       if (file->f_file[O_WRONLY])
-               error = vfs_lock_file(file->f_file[O_WRONLY], F_SETLK,
+       lock->fl.fl_file = file->f_file[O_WRONLY];
+       if (lock->fl.fl_file)
+               error |= vfs_lock_file(lock->fl.fl_file, F_SETLK,
                                        &lock->fl, NULL);
 
        return (error < 0)? nlm_lck_denied_nolocks : nlm_granted;