Re: [PATCH 1/2] lockd: fix server crash on reboot of client holding lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Jan 18, 2022, at 5:00 PM, Bruce Fields <bfields@xxxxxxxxxxxx> wrote:
> 
> From: "J. Bruce Fields" <bfields@xxxxxxxxxx>
> 
> I thought I was iterating over the array when actually the iteration is
> over the values contained in the array?
> 
> Ugh, keep it simple.
> 
> Symptoms were a null deference in vfs_lock_file() when an NFSv3 client
> that previously held a lock came back up and sent a notify.
> 
> Reported-by: Jonathan Woithe <jwoithe@xxxxxxxxxx>
> Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
> Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxx>
> ---
> fs/lockd/svcsubs.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c
> index cb3a7512c33e..54c2e42130ca 100644
> --- a/fs/lockd/svcsubs.c
> +++ b/fs/lockd/svcsubs.c
> @@ -179,19 +179,20 @@ nlm_delete_file(struct nlm_file *file)
> static int nlm_unlock_files(struct nlm_file *file)
> {
> 	struct file_lock lock;
> -	struct file *f;
> 
> 	lock.fl_type  = F_UNLCK;
> 	lock.fl_start = 0;
> 	lock.fl_end   = OFFSET_MAX;
> -	for (f = file->f_file[0]; f <= file->f_file[1]; f++) {
> -		if (f && vfs_lock_file(f, F_SETLK, &lock, NULL) < 0) {
> -			pr_warn("lockd: unlock failure in %s:%d\n",
> -				__FILE__, __LINE__);
> -			return 1;
> -		}
> -	}
> +	if (file->f_file[O_RDONLY] &&
> +	    vfs_lock_file(file->f_file[O_RDONLY], F_SETLK, &lock, NULL))
> +		goto out_err;
> +	if (file->f_file[O_WRONLY] &&
> +	    vfs_lock_file(file->f_file[O_WRONLY], F_SETLK, &lock, NULL))
> +		goto out_err;
> 	return 0;
> +out_err:
> +	pr_warn("lockd: unlock failure in %s:%d\n", __FILE__, __LINE__);
> +	return 1;
> }
> 
> /*
> -- 
> 2.34.1
> 

Hi Bruce, thanks for the fixes. They've passed my basic smoke tests.
I've applied both patches for the very next nfsd PR. See:

git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git for-next

--
Chuck Lever







[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux