]> git.baikalelectronics.ru Git - kernel.git/commit
fix EBUSY on umount() from MNT_SHRINKABLE
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 30 Aug 2014 22:32:05 +0000 (18:32 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 30 Aug 2014 22:32:05 +0000 (18:32 -0400)
commitb7e1da5a62caa4191e5ef1e9178da66a051127b2
tree81d548e2161c8b9ccae34497df40251268bf3050
parent6cfa75d1ea746c241f4a11b47fb489bfedad2126
fix EBUSY on umount() from MNT_SHRINKABLE

We need the parents of victims alive until namespace_unlock() gets to
dput() of the (ex-)mountpoints.  However, that screws up the "is it
busy" checks in case when we have shrinkable mounts that need to be
killed.  Solution: go ahead and decrement refcounts of parents right
in umount_tree(), increment them again just before dropping rwsem in
namespace_unlock() (and let the loop in the end of namespace_unlock()
finally drop those references for good, as we do now).  Parents can't
get freed until we drop rwsem - at least one reference is kept until
then, both in case when parent is among the victims and when it is
not.  So they'll still be around when we get to namespace_unlock().

Cc: stable@vger.kernel.org # 3.12+
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c