]> git.karo-electronics.de Git - karo-tx-linux.git/commit
vfs: More precise tests in d_invalidate
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 13 Feb 2014 15:54:28 +0000 (07:54 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Sun, 23 Feb 2014 22:50:08 +0000 (14:50 -0800)
commit2e07018e27fa43b9e7dbe64692c7f0d9deda43b9
tree4a41407a3cd62bb53c3ce100454c0f6f5a971725
parent60a5dd57aad99af51996fc373206e140b4c2c53e
vfs: More precise tests in d_invalidate

The current comments in d_invalidate about what and why it is doing
what it is doing are wildly off-base.  Which is not surprising as
the comments date back to last minute bug fix of the 2.2 kernel.

The big fat lie of a comment said: If it's a directory, we can't drop
it for fear of somebody re-populating it with children (even though
dropping it would make it unreachable from that root, we still might
repopulate it if it was a working directory or similar).

The truth is that for remote filesystems the failure of d_revalidate
and d_weak_revalidate prevents us from populating or otherwise
inappropriately using a directory.  For local filesystems and for
local directory removals the setting of S_DEAD prevents us from
populating or otherwise inappropriate using a directory.

The current rules are:
- To prevent mount point leaks dentries that are mount points or that
  have childrent that are mount points may not be be unhashed.
- All dentries may be unhashed.
- Directories may be rehashed with d_materialise_unique

check_submounts_and_drop implements this already for well maintained
remote filesystems so implement the current rules in d_invalidate
by just calling check_submounts_and_drop.

The one difference between d_invalidate and check_submounts_and_drop
is that d_invalidate must respect it when a d_revalidate method has
earlier called d_drop so preserve the d_unhashed check in
d_invalidate.

Reviewed-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/dcache.c