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