[PATCH] knfsd: nfsd4: add missing rpciod_down()
We should be shutting down rpciod for the callback channel when we shut down the server. Also note that we do rpciod_up() and create the callback client *before* setting cb_set--the cb_set only determines whether the initial null was succesful. So cb_set is not a reliable determiner of whether we need to clean up, only cb_client is. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
					parent
					
						
							
								541e0e0981
							
						
					
				
			
			
				commit
				
					
						4e2fd495b5
					
				
			
		
					 1 changed files with 14 additions and 7 deletions
				
			
		| 
						 | 
					@ -329,23 +329,30 @@ put_nfs4_client(struct nfs4_client *clp)
 | 
				
			||||||
		free_client(clp);
 | 
							free_client(clp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					shutdown_callback_client(struct nfs4_client *clp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rpc_clnt *clnt = clp->cl_callback.cb_client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* shutdown rpc client, ending any outstanding recall rpcs */
 | 
				
			||||||
 | 
						if (clnt) {
 | 
				
			||||||
 | 
							clp->cl_callback.cb_client = NULL;
 | 
				
			||||||
 | 
							rpc_shutdown_client(clnt);
 | 
				
			||||||
 | 
							rpciod_down();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
expire_client(struct nfs4_client *clp)
 | 
					expire_client(struct nfs4_client *clp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct nfs4_stateowner *sop;
 | 
						struct nfs4_stateowner *sop;
 | 
				
			||||||
	struct nfs4_delegation *dp;
 | 
						struct nfs4_delegation *dp;
 | 
				
			||||||
	struct nfs4_callback *cb = &clp->cl_callback;
 | 
					 | 
				
			||||||
	struct rpc_clnt *clnt = clp->cl_callback.cb_client;
 | 
					 | 
				
			||||||
	struct list_head reaplist;
 | 
						struct list_head reaplist;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dprintk("NFSD: expire_client cl_count %d\n",
 | 
						dprintk("NFSD: expire_client cl_count %d\n",
 | 
				
			||||||
	                    atomic_read(&clp->cl_count));
 | 
						                    atomic_read(&clp->cl_count));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* shutdown rpc client, ending any outstanding recall rpcs */
 | 
						shutdown_callback_client(clp);
 | 
				
			||||||
	if (atomic_read(&cb->cb_set) == 1 && clnt) {
 | 
					 | 
				
			||||||
		rpc_shutdown_client(clnt);
 | 
					 | 
				
			||||||
		clnt = clp->cl_callback.cb_client = NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	INIT_LIST_HEAD(&reaplist);
 | 
						INIT_LIST_HEAD(&reaplist);
 | 
				
			||||||
	spin_lock(&recall_lock);
 | 
						spin_lock(&recall_lock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue