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 |
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 --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; }
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(-)