> 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