The 'cred_unused' list, that is traversed by rpcauth_cache_shrinker is
ordered by time. If we hit a credential that is under the 60 second garbage
collection moratorium, we should exit because we know at that point that
all successive credentials are subject to the same moratorium...
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
list_for_each_entry_safe(cred, next, &cred_unused, cr_lru) {
list_for_each_entry_safe(cred, next, &cred_unused, cr_lru) {
- /* Enforce a 60 second garbage collection moratorium */
+ /*
+ * Enforce a 60 second garbage collection moratorium
+ * Note that the cred_unused list must be time-ordered.
+ */
if (time_in_range(cred->cr_expire, expired, jiffies) &&
test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0)
if (time_in_range(cred->cr_expire, expired, jiffies) &&
test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0)
list_del_init(&cred->cr_lru);
number_cred_unused--;
list_del_init(&cred->cr_lru);
number_cred_unused--;
if (nr_to_scan == 0)
break;
}
if (nr_to_scan == 0)
break;
}
+ return (number_cred_unused / 100) * sysctl_vfs_cache_pressure;
if (list_empty(&cred_unused))
return 0;
spin_lock(&rpc_credcache_lock);
if (list_empty(&cred_unused))
return 0;
spin_lock(&rpc_credcache_lock);
- nr_to_scan = rpcauth_prune_expired(&free, nr_to_scan);
- res = (number_cred_unused / 100) * sysctl_vfs_cache_pressure;
+ res = rpcauth_prune_expired(&free, nr_to_scan);
spin_unlock(&rpc_credcache_lock);
rpcauth_destroy_credlist(&free);
return res;
spin_unlock(&rpc_credcache_lock);
rpcauth_destroy_credlist(&free);
return res;