SUNRPC/cache: fix reporting of expired cache entries in 'content' file.

Entries that are in a sunrpc cache but are not valid should be reported
with a leading '#' so they look like a comment.
Commit  d202cce896 (sunrpc: never return expired entries in sunrpc_cache_lookup)
broke this for expired entries.

This particularly applies to entries that have been replaced by newer entries.
sunrpc_cache_update sets the expiry of the replaced entry to '0', but it
remains in the cache until the next 'cache_clean'.
The result is that if you

  echo 0 2000000000 1 0 > /proc/net/rpc/auth.unix.gid/channel

several times, then

  cat /proc/net/rpc/auth.unix.gid/content

It will display multiple entries for the one uid, which is at least confusing:

  #uid cnt: gids...
  0 1: 0
  0 1: 0
  0 1: 0

With this patch, expired entries are marked as comments so you get

  #uid cnt: gids...
  0 1: 0
  # 0 1: 0
  # 0 1: 0

These expired entries will never be seen by cache_check() as they are always
*after* a non-expired entry with the same key - so the extra check is only
needed in c_show()

Signed-off-by:  NeilBrown <neilb@suse.de>

--
It's not a big problem, but it had me confused for a while, so it could
well confuse others.
Thanks,
NeilBrown
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
NeilBrown 2012-07-12 10:37:34 +10:00 коммит произвёл J. Bruce Fields
Родитель bbf43dc888
Коммит 200724a707
1 изменённых файлов: 4 добавлений и 1 удалений

Просмотреть файл

@ -1349,8 +1349,11 @@ static int c_show(struct seq_file *m, void *p)
if (cache_check(cd, cp, NULL)) if (cache_check(cd, cp, NULL))
/* cache_check does a cache_put on failure */ /* cache_check does a cache_put on failure */
seq_printf(m, "# "); seq_printf(m, "# ");
else else {
if (cache_is_expired(cd, cp))
seq_printf(m, "# ");
cache_put(cp, cd); cache_put(cp, cd);
}
return cd->cache_show(m, cd, cp); return cd->cache_show(m, cd, cp);
} }