LockD: mark host per network namespace on garbage collect
This is required for per-network NLM shutdown and cleanup. This patch passes init_net for a while. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
99dbb8fe09
commit
b26411f85d
3 changed files with 16 additions and 8 deletions
|
@ -628,13 +628,14 @@ nlm_gc_hosts(void)
|
||||||
struct hlist_head *chain;
|
struct hlist_head *chain;
|
||||||
struct hlist_node *pos, *next;
|
struct hlist_node *pos, *next;
|
||||||
struct nlm_host *host;
|
struct nlm_host *host;
|
||||||
|
struct net *net = &init_net;
|
||||||
|
|
||||||
dprintk("lockd: host garbage collection\n");
|
dprintk("lockd: host garbage collection\n");
|
||||||
for_each_host(host, pos, chain, nlm_server_hosts)
|
for_each_host(host, pos, chain, nlm_server_hosts)
|
||||||
host->h_inuse = 0;
|
host->h_inuse = 0;
|
||||||
|
|
||||||
/* Mark all hosts that hold locks, blocks or shares */
|
/* Mark all hosts that hold locks, blocks or shares */
|
||||||
nlmsvc_mark_resources();
|
nlmsvc_mark_resources(net);
|
||||||
|
|
||||||
for_each_host_safe(host, pos, next, chain, nlm_server_hosts) {
|
for_each_host_safe(host, pos, next, chain, nlm_server_hosts) {
|
||||||
if (atomic_read(&host->h_count) || host->h_inuse
|
if (atomic_read(&host->h_count) || host->h_inuse
|
||||||
|
|
|
@ -309,7 +309,8 @@ nlm_release_file(struct nlm_file *file)
|
||||||
* Helpers function for resource traversal
|
* Helpers function for resource traversal
|
||||||
*
|
*
|
||||||
* nlmsvc_mark_host:
|
* nlmsvc_mark_host:
|
||||||
* used by the garbage collector; simply sets h_inuse.
|
* used by the garbage collector; simply sets h_inuse only for those
|
||||||
|
* hosts, which passed network check.
|
||||||
* Always returns 0.
|
* Always returns 0.
|
||||||
*
|
*
|
||||||
* nlmsvc_same_host:
|
* nlmsvc_same_host:
|
||||||
|
@ -320,12 +321,15 @@ nlm_release_file(struct nlm_file *file)
|
||||||
* returns 1 iff the host is a client.
|
* returns 1 iff the host is a client.
|
||||||
* Used by nlmsvc_invalidate_all
|
* Used by nlmsvc_invalidate_all
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nlmsvc_mark_host(void *data, struct nlm_host *dummy)
|
nlmsvc_mark_host(void *data, struct nlm_host *hint)
|
||||||
{
|
{
|
||||||
struct nlm_host *host = data;
|
struct nlm_host *host = data;
|
||||||
|
|
||||||
host->h_inuse = 1;
|
if ((hint->net == NULL) ||
|
||||||
|
(host->net == hint->net))
|
||||||
|
host->h_inuse = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,10 +362,13 @@ nlmsvc_is_client(void *data, struct nlm_host *dummy)
|
||||||
* Mark all hosts that still hold resources
|
* Mark all hosts that still hold resources
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
nlmsvc_mark_resources(void)
|
nlmsvc_mark_resources(struct net *net)
|
||||||
{
|
{
|
||||||
dprintk("lockd: nlmsvc_mark_resources\n");
|
struct nlm_host hint;
|
||||||
nlm_traverse_files(NULL, nlmsvc_mark_host, NULL);
|
|
||||||
|
dprintk("lockd: nlmsvc_mark_resources for net %p\n", net);
|
||||||
|
hint.net = net;
|
||||||
|
nlm_traverse_files(&hint, nlmsvc_mark_host, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -279,7 +279,7 @@ void nlmsvc_release_call(struct nlm_rqst *);
|
||||||
__be32 nlm_lookup_file(struct svc_rqst *, struct nlm_file **,
|
__be32 nlm_lookup_file(struct svc_rqst *, struct nlm_file **,
|
||||||
struct nfs_fh *);
|
struct nfs_fh *);
|
||||||
void nlm_release_file(struct nlm_file *);
|
void nlm_release_file(struct nlm_file *);
|
||||||
void nlmsvc_mark_resources(void);
|
void nlmsvc_mark_resources(struct net *);
|
||||||
void nlmsvc_free_host_resources(struct nlm_host *);
|
void nlmsvc_free_host_resources(struct nlm_host *);
|
||||||
void nlmsvc_invalidate_all(void);
|
void nlmsvc_invalidate_all(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue