diff options
| author | Stanislav Kinsbursky <skinsbursky@parallels.com> | 2012-07-25 16:55:54 +0400 | 
|---|---|---|
| committer | J. Bruce Fields <bfields@redhat.com> | 2012-07-27 16:48:43 -0400 | 
| commit | b26411f85d3763ec5fc553854d9c3c0966072090 (patch) | |
| tree | 7d8437dee426b9d0000a9e5b2553e0e3fade822f | |
| parent | 99dbb8fe0992ecefd061e5efa7604b92eab58ccc (diff) | |
| download | olio-linux-3.10-b26411f85d3763ec5fc553854d9c3c0966072090.tar.xz olio-linux-3.10-b26411f85d3763ec5fc553854d9c3c0966072090.zip  | |
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>
| -rw-r--r-- | fs/lockd/host.c | 3 | ||||
| -rw-r--r-- | fs/lockd/svcsubs.c | 19 | ||||
| -rw-r--r-- | include/linux/lockd/lockd.h | 2 | 
3 files changed, 16 insertions, 8 deletions
diff --git a/fs/lockd/host.c b/fs/lockd/host.c index eb75ca7c2d6..2c5f41b098e 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c @@ -628,13 +628,14 @@ nlm_gc_hosts(void)  	struct hlist_head *chain;  	struct hlist_node *pos, *next;  	struct nlm_host	*host; +	struct net *net = &init_net;  	dprintk("lockd: host garbage collection\n");  	for_each_host(host, pos, chain, nlm_server_hosts)  		host->h_inuse = 0;  	/* 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) {  		if (atomic_read(&host->h_count) || host->h_inuse diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index 2240d384d78..0deb5f6c9dd 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -309,7 +309,8 @@ nlm_release_file(struct nlm_file *file)   * Helpers function for resource traversal   *   * 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.   *   * nlmsvc_same_host: @@ -320,12 +321,15 @@ nlm_release_file(struct nlm_file *file)   *	returns 1 iff the host is a client.   *	Used by nlmsvc_invalidate_all   */ +  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; -	host->h_inuse = 1; +	if ((hint->net == NULL) || +	    (host->net == hint->net)) +		host->h_inuse = 1;  	return 0;  } @@ -358,10 +362,13 @@ nlmsvc_is_client(void *data, struct nlm_host *dummy)   * Mark all hosts that still hold resources   */  void -nlmsvc_mark_resources(void) +nlmsvc_mark_resources(struct net *net)  { -	dprintk("lockd: nlmsvc_mark_resources\n"); -	nlm_traverse_files(NULL, nlmsvc_mark_host, NULL); +	struct nlm_host hint; + +	dprintk("lockd: nlmsvc_mark_resources for net %p\n", net); +	hint.net = net; +	nlm_traverse_files(&hint, nlmsvc_mark_host, NULL);  }  /* diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index f04ce6ac6d0..50e31a2c1a9 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -279,7 +279,7 @@ void		  nlmsvc_release_call(struct nlm_rqst *);  __be32		  nlm_lookup_file(struct svc_rqst *, struct nlm_file **,  					struct nfs_fh *);  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_invalidate_all(void);  |