2022-07-11 18:43:11

by Jeff Layton

[permalink] [raw]
Subject: [PATCH 0/2] lockd: fix hang on shutdown when there are active locks

We had a report that shutting down nfsd would hang when there were
active NFSv3 locks. The first patch fixes that. While testing that I
hit a crash in nlm_close_files. The second patch fixes that one.

Jeff Layton (2):
lockd: set fl_owner when unlocking files
lockd: fix nlm_close_files

fs/lockd/svcsubs.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

--
2.36.1


2022-07-11 18:43:52

by Jeff Layton

[permalink] [raw]
Subject: [PATCH 2/2] lockd: fix nlm_close_files

This loop condition tries a bit too hard to be clever. Just test for
the two indices we care about explicitly.

Cc: J. Bruce Fields <[email protected]>
Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
Signed-off-by: Jeff Layton <[email protected]>
---
fs/lockd/svcsubs.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c
index b2f277727469..e1c4617de771 100644
--- a/fs/lockd/svcsubs.c
+++ b/fs/lockd/svcsubs.c
@@ -283,11 +283,10 @@ nlm_file_inuse(struct nlm_file *file)

static void nlm_close_files(struct nlm_file *file)
{
- struct file *f;
-
- for (f = file->f_file[0]; f <= file->f_file[1]; f++)
- if (f)
- nlmsvc_ops->fclose(f);
+ if (file->f_file[O_RDONLY])
+ nlmsvc_ops->fclose(file->f_file[O_RDONLY]);
+ if (file->f_file[O_WRONLY])
+ nlmsvc_ops->fclose(file->f_file[O_WRONLY]);
}

/*
--
2.36.1

2022-07-11 18:43:56

by Jeff Layton

[permalink] [raw]
Subject: [PATCH 1/2] lockd: set fl_owner when unlocking files

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 <[email protected]>
Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
Signed-off-by: Jeff Layton <[email protected]>
---
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;
}
--
2.36.1

2022-07-11 18:46:53

by Jeff Layton

[permalink] [raw]
Subject: Re: [PATCH 1/2] lockd: set fl_owner when unlocking files

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 <[email protected]>
> Fixes: 7f024fcd5c97 ("Keep read and write fds with each nlm_file")
> Signed-off-by: Jeff Layton <[email protected]>
> ---
> 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;
> }

--
Jeff Layton <[email protected]>

2022-07-11 19:49:32

by Chuck Lever III

[permalink] [raw]
Subject: Re: [PATCH 0/2] lockd: fix hang on shutdown when there are active locks



> On Jul 11, 2022, at 2:30 PM, Jeff Layton <[email protected]> wrote:
>
> We had a report that shutting down nfsd would hang when there were
> active NFSv3 locks. The first patch fixes that. While testing that I
> hit a crash in nlm_close_files. The second patch fixes that one.
>
> Jeff Layton (2):
> lockd: set fl_owner when unlocking files
> lockd: fix nlm_close_files
>
> fs/lockd/svcsubs.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)

Grabbed both for the next 5.18-rc PR.

--
Chuck Lever