]> www.infradead.org Git - users/jedix/linux-maple.git/commit
locks: fix unlock when fcntl_setlk races with a close
authorJeff Layton <jeff.layton@primarydata.com>
Thu, 7 Jan 2016 21:38:10 +0000 (16:38 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:43:51 +0000 (15:43 -0700)
commitbacb3c9a81d64062de615a5c5371a5b12ee10cab
treebcfe0eafd91bec3a1bf1e1694c2174bfa68138ab
parenteef46b5b833faacdb3b92301ab5ad530ea3e3c3a
locks: fix unlock when fcntl_setlk races with a close

Orabug: 23330621

[ Upstream commit 7f3697e24dc3820b10f445a4a7d914fc356012d1 ]

Dmitry reported that he was able to reproduce the WARN_ON_ONCE that
fires in locks_free_lock_context when the flc_posix list isn't empty.

The problem turns out to be that we're basically rebuilding the
file_lock from scratch in fcntl_setlk when we discover that the setlk
has raced with a close. If the l_whence field is SEEK_CUR or SEEK_END,
then we may end up with fl_start and fl_end values that differ from
when the lock was initially set, if the file position or length of the
file has changed in the interim.

Fix this by just reusing the same lock request structure, and simply
override fl_type value with F_UNLCK as appropriate. That ensures that
we really are unlocking the lock that was initially set.

While we're there, make sure that we do pop a WARN_ON_ONCE if the
removal ever fails. Also return -EBADF in this event, since that's
what we would have returned if the close had happened earlier.

Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: <stable@vger.kernel.org>
Fixes: c293621bbf67 (stale POSIX lock handling)
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Acked-by: "J. Bruce Fields" <bfields@fieldses.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit 2e21928b854d0201e5af8413daaa8dfe1b32690d)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
fs/locks.c