mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
lockd: set other missing fields when unlocking files
[ Upstream commit18ebd35b61
] 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:aec158242b
("lockd: set fl_owner when unlocking files") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Link: https://bugzilla.kernel.org/show_bug.cgi?id=216582 Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
5c8e13a2b6
commit
d7aa9f7778
1 changed files with 10 additions and 7 deletions
|
@ -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)
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue