]> git.baikalelectronics.ru Git - kernel.git/commit
vfs: allow umount to handle mountpoints without revalidating them
authorJeff Layton <jlayton@redhat.com>
Fri, 26 Jul 2013 10:23:25 +0000 (06:23 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 4 Sep 2013 02:50:29 +0000 (22:50 -0400)
commitddcccea8268b680f1e0e7a87f0f4c0fe579205a3
treec6f1a95b751575b7d3af19df48bea3bd0a0c4748
parent8ea78b3b4b6cbe26a04ee9aa10ce10872f2c7f3c
vfs: allow umount to handle mountpoints without revalidating them

Christopher reported a regression where he was unable to unmount a NFS
filesystem where the root had gone stale. The problem is that
d_revalidate handles the root of the filesystem differently from other
dentries, but d_weak_revalidate does not. We could simply fix this by
making d_weak_revalidate return success on IS_ROOT dentries, but there
are cases where we do want to revalidate the root of the fs.

A umount is really a special case. We generally aren't interested in
anything but the dentry and vfsmount that's attached at that point. If
the inode turns out to be stale we just don't care since the intent is
to stop using it anyway.

Try to handle this situation better by treating umount as a special
case in the lookup code. Have it resolve the parent using normal
means, and then do a lookup of the final dentry without revalidating
it. In most cases, the final lookup will come out of the dcache, but
the case where there's a trailing symlink or !LAST_NORM entry on the
end complicates things a bit.

Cc: Neil Brown <neilb@suse.de>
Reported-by: Christopher T Vogan <cvogan@us.ibm.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c
fs/namespace.c
include/linux/namei.h