Commit 18ebd35b authored by Trond Myklebust's avatar Trond Myklebust Committed by Chuck Lever

lockd: set other missing fields when unlocking files

vfs_lock_file() expects the struct file_lock to be fully initialised by
the caller. Re-exported NFSv3 has been seen to Oops if the fl_file field
is NULL.

Fixes: aec15824 ("lockd: set fl_owner when unlocking files")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216582Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent d7064eaf
...@@ -176,7 +176,7 @@ nlm_delete_file(struct nlm_file *file) ...@@ -176,7 +176,7 @@ nlm_delete_file(struct nlm_file *file)
} }
} }
static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner) static int nlm_unlock_files(struct nlm_file *file, const struct file_lock *fl)
{ {
struct file_lock lock; struct file_lock lock;
...@@ -184,12 +184,15 @@ static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner) ...@@ -184,12 +184,15 @@ static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner)
lock.fl_type = F_UNLCK; lock.fl_type = F_UNLCK;
lock.fl_start = 0; lock.fl_start = 0;
lock.fl_end = OFFSET_MAX; lock.fl_end = OFFSET_MAX;
lock.fl_owner = owner; lock.fl_owner = fl->fl_owner;
if (file->f_file[O_RDONLY] && lock.fl_pid = fl->fl_pid;
vfs_lock_file(file->f_file[O_RDONLY], F_SETLK, &lock, NULL)) lock.fl_flags = FL_POSIX;
lock.fl_file = file->f_file[O_RDONLY];
if (lock.fl_file && vfs_lock_file(lock.fl_file, F_SETLK, &lock, NULL))
goto out_err; goto out_err;
if (file->f_file[O_WRONLY] && lock.fl_file = file->f_file[O_WRONLY];
vfs_lock_file(file->f_file[O_WRONLY], F_SETLK, &lock, NULL)) if (lock.fl_file && vfs_lock_file(lock.fl_file, F_SETLK, &lock, NULL))
goto out_err; goto out_err;
return 0; return 0;
out_err: out_err:
...@@ -226,7 +229,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file, ...@@ -226,7 +229,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
if (match(lockhost, host)) { if (match(lockhost, host)) {
spin_unlock(&flctx->flc_lock); spin_unlock(&flctx->flc_lock);
if (nlm_unlock_files(file, fl->fl_owner)) if (nlm_unlock_files(file, fl))
return 1; return 1;
goto again; goto again;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment