SUNRPC: Add a (empty for the moment) destructor for rpc_wait_queues

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust 2008-02-22 17:06:55 -05:00
parent 5d00837b90
commit f6a1cc8930
6 changed files with 28 additions and 8 deletions

View file

@ -170,6 +170,8 @@ static void nfs4_shutdown_client(struct nfs_client *clp)
BUG_ON(!RB_EMPTY_ROOT(&clp->cl_state_owners)); BUG_ON(!RB_EMPTY_ROOT(&clp->cl_state_owners));
if (__test_and_clear_bit(NFS_CS_IDMAP, &clp->cl_res_state)) if (__test_and_clear_bit(NFS_CS_IDMAP, &clp->cl_res_state))
nfs_idmap_delete(clp); nfs_idmap_delete(clp);
rpc_destroy_wait_queue(&clp->cl_rpcwaitq);
#endif #endif
} }

View file

@ -292,8 +292,10 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, struct
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
if (sp == new) if (sp == new)
get_rpccred(cred); get_rpccred(cred);
else else {
rpc_destroy_wait_queue(&new->so_sequence.wait);
kfree(new); kfree(new);
}
return sp; return sp;
} }
@ -310,6 +312,7 @@ void nfs4_put_state_owner(struct nfs4_state_owner *sp)
return; return;
nfs4_remove_state_owner(clp, sp); nfs4_remove_state_owner(clp, sp);
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
rpc_destroy_wait_queue(&sp->so_sequence.wait);
put_rpccred(cred); put_rpccred(cred);
kfree(sp); kfree(sp);
} }
@ -529,6 +532,7 @@ static void nfs4_free_lock_state(struct nfs4_lock_state *lsp)
spin_lock(&clp->cl_lock); spin_lock(&clp->cl_lock);
nfs_free_unique_id(&clp->cl_lockowner_id, &lsp->ls_id); nfs_free_unique_id(&clp->cl_lockowner_id, &lsp->ls_id);
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
rpc_destroy_wait_queue(&lsp->ls_sequence.wait);
kfree(lsp); kfree(lsp);
} }

View file

@ -228,6 +228,7 @@ void rpc_killall_tasks(struct rpc_clnt *);
void rpc_execute(struct rpc_task *); void rpc_execute(struct rpc_task *);
void rpc_init_priority_wait_queue(struct rpc_wait_queue *, const char *); void rpc_init_priority_wait_queue(struct rpc_wait_queue *, const char *);
void rpc_init_wait_queue(struct rpc_wait_queue *, const char *); void rpc_init_wait_queue(struct rpc_wait_queue *, const char *);
void rpc_destroy_wait_queue(struct rpc_wait_queue *);
void rpc_sleep_on(struct rpc_wait_queue *, struct rpc_task *, void rpc_sleep_on(struct rpc_wait_queue *, struct rpc_task *,
rpc_action action); rpc_action action);
void rpc_wake_up_queued_task(struct rpc_wait_queue *, void rpc_wake_up_queued_task(struct rpc_wait_queue *,

View file

@ -266,6 +266,7 @@ gss_release_msg(struct gss_upcall_msg *gss_msg)
BUG_ON(!list_empty(&gss_msg->list)); BUG_ON(!list_empty(&gss_msg->list));
if (gss_msg->ctx != NULL) if (gss_msg->ctx != NULL)
gss_put_ctx(gss_msg->ctx); gss_put_ctx(gss_msg->ctx);
rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue);
kfree(gss_msg); kfree(gss_msg);
} }

View file

@ -214,6 +214,11 @@ void rpc_init_wait_queue(struct rpc_wait_queue *queue, const char *qname)
} }
EXPORT_SYMBOL_GPL(rpc_init_wait_queue); EXPORT_SYMBOL_GPL(rpc_init_wait_queue);
void rpc_destroy_wait_queue(struct rpc_wait_queue *queue)
{
}
EXPORT_SYMBOL_GPL(rpc_destroy_wait_queue);
static int rpc_wait_bit_killable(void *word) static int rpc_wait_bit_killable(void *word)
{ {
if (fatal_signal_pending(current)) if (fatal_signal_pending(current))
@ -1020,11 +1025,20 @@ rpc_destroy_mempool(void)
kmem_cache_destroy(rpc_task_slabp); kmem_cache_destroy(rpc_task_slabp);
if (rpc_buffer_slabp) if (rpc_buffer_slabp)
kmem_cache_destroy(rpc_buffer_slabp); kmem_cache_destroy(rpc_buffer_slabp);
rpc_destroy_wait_queue(&delay_queue);
} }
int int
rpc_init_mempool(void) rpc_init_mempool(void)
{ {
/*
* The following is not strictly a mempool initialisation,
* but there is no harm in doing it here
*/
rpc_init_wait_queue(&delay_queue, "delayq");
if (!rpciod_start())
goto err_nomem;
rpc_task_slabp = kmem_cache_create("rpc_tasks", rpc_task_slabp = kmem_cache_create("rpc_tasks",
sizeof(struct rpc_task), sizeof(struct rpc_task),
0, SLAB_HWCACHE_ALIGN, 0, SLAB_HWCACHE_ALIGN,
@ -1045,13 +1059,6 @@ rpc_init_mempool(void)
rpc_buffer_slabp); rpc_buffer_slabp);
if (!rpc_buffer_mempool) if (!rpc_buffer_mempool)
goto err_nomem; goto err_nomem;
if (!rpciod_start())
goto err_nomem;
/*
* The following is not strictly a mempool initialisation,
* but there is no harm in doing it here
*/
rpc_init_wait_queue(&delay_queue, "delayq");
return 0; return 0;
err_nomem: err_nomem:
rpc_destroy_mempool(); rpc_destroy_mempool();

View file

@ -1052,6 +1052,11 @@ static void xprt_destroy(struct kref *kref)
xprt->shutdown = 1; xprt->shutdown = 1;
del_timer_sync(&xprt->timer); del_timer_sync(&xprt->timer);
rpc_destroy_wait_queue(&xprt->binding);
rpc_destroy_wait_queue(&xprt->pending);
rpc_destroy_wait_queue(&xprt->sending);
rpc_destroy_wait_queue(&xprt->resend);
rpc_destroy_wait_queue(&xprt->backlog);
/* /*
* Tear down transport state and free the rpc_xprt * Tear down transport state and free the rpc_xprt
*/ */