The following commit has been merged in the openafs-stable-1_6_x branch:
commit ef5fe95fdf4e063daafcfee4435f0f9026bf9ada
Author: Mark Vitale <[email protected]>
Date:   Thu Nov 30 20:26:46 2017 -0500

    LINUX: Avoid d_invalidate() during afs_ShakeLooseVCaches()
    
    With recent changes to d_invalidate's semantics (it returns void in Linux 
3.11,
    and always returns success in RHEL 7.4), it has become increasingly clear 
that
    d_invalidate() is not the best function for use in our best-effort
    (nondisruptive) attempt to free up vcaches that is afs_ShakeLooseVCaches().
    The new d_invalidate() semantics always force the invalidation of a 
directory
    dentry, which contradicts our desire to be nondisruptive, especially when
    that directory is being used as the current working directory for a process.
    Our call to d_invalidate(), intended to merely probe for whether a dentry
    can be discarded without affecting other consumers, instead would cause
    processes using that dentry as a CWD to receive ENOENT errors from getcwd().
    
    A previous commit (c3bbf0b4444db88192eea4580ac9e9ca3de0d286) tried to 
address
    this issue by calling d_prune_aliases() instead of d_invalidate(), but
    d_prune_aliases() does not recursively descend into children of the given
    dentry while pruning, leaving it an incomplete solution for our use-case.
    
    To address these issues, modify the shakeloose routine TryEvictDentries() to
    call shrink_dcache_parent() and maybe __d_drop() for directories, and
    d_prune_aliases() for non-directories, instead of d_invalidate().  (Calls to
    d_prune_aliases() for directories have already been removed by reverting 
commit
    c3bbf0b4444db88192eea4580ac9e9ca3de0d286.)
    
    Just like d_invalidate(), shrink_dcache_parent() has been around "forever"
    (since pre-git v2.6.12).  Also like d_invalidate(), it "walks" the parent
    dentry's subdirectories and "shrinks" (unhashes) unused dentries.  But 
unlike
    d_invalidate(), shrink_dcache_parent() will not unhash an in-use dentry, and
    has never changed its signature or semantics.
    
    d_prune_aliases() has also been available "forever", and has also never 
changed
    its signature or semantics.  The lack of recursive descent is not an issue 
for
    non-directories, which cannot have such children.
    
    [[email protected]: apply review feedback to fix locking and avoid extraneous
    changes, and reword commit message]
    
    Reviewed-on: https://gerrit.openafs.org/12830
    Reviewed-by: Benjamin Kaduk <[email protected]>
    Tested-by: BuildBot <[email protected]>
    (cherry picked from commit afbc199f152cc06edc877333f229604c28638d07)
    
    Reviewed-on: https://gerrit.openafs.org/12851
    Tested-by: BuildBot <[email protected]>
    Tested-by: Benjamin Kaduk <[email protected]>
    Reviewed-by: Benjamin Kaduk <[email protected]>
    (cherry picked from commit 4feec06c7bdc7102ae654cff20eb02650ec32800)
    
    Change-Id: Id509e51f027bd96df155e7ed714e0c7dfce126eb
    Reviewed-on: https://gerrit.openafs.org/12860
    Tested-by: BuildBot <[email protected]>
    Reviewed-by: Andrew Deason <[email protected]>
    Reviewed-by: Stephan Wiesand <[email protected]>

 src/afs/LINUX/osi_vcache.c |   51 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 44 insertions(+), 7 deletions(-)

-- 
OpenAFS Master Repository
_______________________________________________
OpenAFS-cvs mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-cvs

Reply via email to