• NeilBrown's avatar
    sunrpc/cache: use cache_fresh_unlocked consistently and correctly. · 2a1c7f53
    NeilBrown authored
    cache_fresh_unlocked() is called when a cache entry
    has been updated and ensures that if there were any
    pending upcalls, they are cleared.
    
    So every time we update a cache entry, we should call this,
    and this should be the only way that we try to clear
    pending calls (that sort of uniformity makes code sooo much
    easier to read).
    
    try_to_negate_entry() will (possibly) mark an entry as
    negative.  If it doesn't, it is because the entry already
    is VALID.
    So the entry will be valid on exit, so it is appropriate to
    call cache_fresh_unlocked().
    So tidy up try_to_negate_entry() to do that, and remove
    partial open-coded cache_fresh_unlocked() from the one
    call-site of try_to_negate_entry().
    
    In the other branch of the 'switch(cache_make_upcall())',
    we again have a partial open-coded version of cache_fresh_unlocked().
    Replace that with a real call.
    
    And again in cache_clean(), use a real call to cache_fresh_unlocked().
    
    These call sites might previously have called
    cache_revisit_request() if CACHE_PENDING wasn't set.
    This is never necessary because cache_revisit_request() can
    only do anything if the item is in the cache_defer_hash,
    However any time that an item is added to the cache_defer_hash
    (setup_deferral), the code immediately tests CACHE_PENDING,
    and removes the entry again if it is clear.  So all other
    places we only need to 'cache_revisit_request' if we've
    just cleared CACHE_PENDING.
    Reported-by: default avatarBodo Stroesser <bstroesser@ts.fujitsu.com>
    Signed-off-by: default avatarNeilBrown  <neilb@suse.de>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    2a1c7f53
cache.c 43.6 KB