• Eric W. Biederman's avatar
    vfs: More precise tests in d_invalidate · bafc9b75
    Eric W. Biederman authored
    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).
    
    [AV] What we really need to avoid is multiple dentry aliases of the
    same directory inode; on all filesystems that have ->d_revalidate()
    we either declare all positive dentries always valid (and thus never
    fed to d_invalidate()) or use d_materialise_unique() and/or d_splice_alias(),
    which take care of alias prevention.
    
    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: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    bafc9b75
dcache.c 88.1 KB