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)
commit8033426e6bdb2690d302872ac1e1fadaec1a5581
treec6f1a95b751575b7d3af19df48bea3bd0a0c4748
parent590fb51f1cf99c4a48a3b1bd65885192e877b561
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