diff mbox series

[1/2] lockd: set fl_owner when unlocking files

Message ID 20220711183014.15161-2-jlayton@kernel.org (mailing list archive)
State New, archived
Headers show
Series lockd: fix hang on shutdown when there are active locks | expand

Commit Message

Jeff Layton July 11, 2022, 6:30 p.m. UTC
Unlocking a POSIX inode with vfs_lock_file only works if the owner
matches. Ensure we set it in the request.

Cc: J. Bruce Fields <bfields@fieldses.org>
Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 fs/lockd/svcsubs.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Jeff Layton July 11, 2022, 6:36 p.m. UTC | #1
On Mon, 2022-07-11 at 14:30 -0400, Jeff Layton wrote:
> Unlocking a POSIX inode with vfs_lock_file only works if the owner
> matches. Ensure we set it in the request.
> 

Oof, that description makes no sense. How about:

"Unlocking a POSIX lock on an inode with vfs_lock_file..."

> Cc: J. Bruce Fields <bfields@fieldses.org>
> Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
>  fs/lockd/svcsubs.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c
> index 0a22a2faf552..b2f277727469 100644
> --- a/fs/lockd/svcsubs.c
> +++ b/fs/lockd/svcsubs.c
> @@ -176,7 +176,7 @@ nlm_delete_file(struct nlm_file *file)
>  	}
>  }
>  
> -static int nlm_unlock_files(struct nlm_file *file)
> +static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner)
>  {
>  	struct file_lock lock;
>  
> @@ -184,6 +184,7 @@ static int nlm_unlock_files(struct nlm_file *file)
>  	lock.fl_type  = F_UNLCK;
>  	lock.fl_start = 0;
>  	lock.fl_end   = OFFSET_MAX;
> +	lock.fl_owner = owner;
>  	if (file->f_file[O_RDONLY] &&
>  	    vfs_lock_file(file->f_file[O_RDONLY], F_SETLK, &lock, NULL))
>  		goto out_err;
> @@ -225,7 +226,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
>  		if (match(lockhost, host)) {
>  
>  			spin_unlock(&flctx->flc_lock);
> -			if (nlm_unlock_files(file))
> +			if (nlm_unlock_files(file, fl->fl_owner))
>  				return 1;
>  			goto again;
>  		}
diff mbox series

Patch

diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c
index 0a22a2faf552..b2f277727469 100644
--- a/fs/lockd/svcsubs.c
+++ b/fs/lockd/svcsubs.c
@@ -176,7 +176,7 @@  nlm_delete_file(struct nlm_file *file)
 	}
 }
 
-static int nlm_unlock_files(struct nlm_file *file)
+static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner)
 {
 	struct file_lock lock;
 
@@ -184,6 +184,7 @@  static int nlm_unlock_files(struct nlm_file *file)
 	lock.fl_type  = F_UNLCK;
 	lock.fl_start = 0;
 	lock.fl_end   = OFFSET_MAX;
+	lock.fl_owner = owner;
 	if (file->f_file[O_RDONLY] &&
 	    vfs_lock_file(file->f_file[O_RDONLY], F_SETLK, &lock, NULL))
 		goto out_err;
@@ -225,7 +226,7 @@  nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
 		if (match(lockhost, host)) {
 
 			spin_unlock(&flctx->flc_lock);
-			if (nlm_unlock_files(file))
+			if (nlm_unlock_files(file, fl->fl_owner))
 				return 1;
 			goto again;
 		}