afs: Split the usage count on struct afs_server
authorDavid Howells <dhowells@redhat.com>
Fri, 17 Apr 2020 16:31:26 +0000 (17:31 +0100)
committerDavid Howells <dhowells@redhat.com>
Sun, 31 May 2020 14:19:51 +0000 (15:19 +0100)
commit977e5f8ed0ab2786755f8d2a96b78a3c7320f7c4
tree770d0ffe055cd48fec774f9a671ee5c8353391a7
parent810068059234551b6973b46ca572e654f0c5e665
afs: Split the usage count on struct afs_server

Split the usage count on the afs_server struct to have an active count that
registers who's actually using it separately from the reference count on
the object.

This allows a future patch to dispatch polling probes without advancing the
"unuse" time into the future each time we emit a probe, which would
otherwise prevent unused server records from expiring.

Included in this:

 (1) The latter part of afs_destroy_server() in which the RCU destruction
     of afs_server objects is invoked and the outstanding server count is
     decremented is split out into __afs_put_server().

 (2) afs_put_server() now calls __afs_put_server() rather then setting the
     management timer.

 (3) The calls begun by afs_fs_give_up_all_callbacks() and
     afs_fs_get_capabilities() can now take a ref on the server record, so
     afs_destroy_server() can just drop its ref and needn't wait for the
     completion of these calls.  They'll put the ref when they're done.

 (4) Because of (3), afs_fs_probe_done() no longer needs to wake up
     afs_destroy_server() with server->probe_outstanding.

 (5) afs_gc_servers can be simplified.  It only needs to check if
     server->active is 0 rather than playing games with the refcount.

 (6) afs_manage_servers() can propose a server for gc if usage == 0 rather
     than if ref == 1.  The gc is effected by (5).

Signed-off-by: David Howells <dhowells@redhat.com>
fs/afs/cmservice.c
fs/afs/fs_probe.c
fs/afs/fsclient.c
fs/afs/internal.h
fs/afs/proc.c
fs/afs/rxrpc.c
fs/afs/server.c
fs/afs/server_list.c
include/trace/events/afs.h