sysctl: remove "struct file *" argument of ->proc_handler
[safe/jmp/linux-2.6] / net / sunrpc / xprtrdma / svc_rdma.c
index 88c0ca2..35fb68b 100644 (file)
@@ -69,6 +69,10 @@ atomic_t rdma_stat_rq_prod;
 atomic_t rdma_stat_sq_poll;
 atomic_t rdma_stat_sq_prod;
 
+/* Temporary NFS request map and context caches */
+struct kmem_cache *svc_rdma_map_cachep;
+struct kmem_cache *svc_rdma_ctxt_cachep;
+
 /*
  * This function implements reading and resetting an atomic_t stat
  * variable through read/write to a proc file. Any write to the file
@@ -76,7 +80,7 @@ atomic_t rdma_stat_sq_prod;
  * current value.
  */
 static int read_reset_stat(ctl_table *table, int write,
-                          struct file *filp, void __user *buffer, size_t *lenp,
+                          void __user *buffer, size_t *lenp,
                           loff_t *ppos)
 {
        atomic_t *stat = (atomic_t *)table->data;
@@ -236,11 +240,14 @@ static ctl_table svcrdma_root_table[] = {
 void svc_rdma_cleanup(void)
 {
        dprintk("SVCRDMA Module Removed, deregister RPC RDMA transport\n");
+       flush_scheduled_work();
        if (svcrdma_table_header) {
                unregister_sysctl_table(svcrdma_table_header);
                svcrdma_table_header = NULL;
        }
        svc_unreg_xprt_class(&svc_rdma_class);
+       kmem_cache_destroy(svc_rdma_map_cachep);
+       kmem_cache_destroy(svc_rdma_ctxt_cachep);
 }
 
 int svc_rdma_init(void)
@@ -255,9 +262,37 @@ int svc_rdma_init(void)
                svcrdma_table_header =
                        register_sysctl_table(svcrdma_root_table);
 
+       /* Create the temporary map cache */
+       svc_rdma_map_cachep = kmem_cache_create("svc_rdma_map_cache",
+                                               sizeof(struct svc_rdma_req_map),
+                                               0,
+                                               SLAB_HWCACHE_ALIGN,
+                                               NULL);
+       if (!svc_rdma_map_cachep) {
+               printk(KERN_INFO "Could not allocate map cache.\n");
+               goto err0;
+       }
+
+       /* Create the temporary context cache */
+       svc_rdma_ctxt_cachep =
+               kmem_cache_create("svc_rdma_ctxt_cache",
+                                 sizeof(struct svc_rdma_op_ctxt),
+                                 0,
+                                 SLAB_HWCACHE_ALIGN,
+                                 NULL);
+       if (!svc_rdma_ctxt_cachep) {
+               printk(KERN_INFO "Could not allocate WR ctxt cache.\n");
+               goto err1;
+       }
+
        /* Register RDMA with the SVC transport switch */
        svc_reg_xprt_class(&svc_rdma_class);
        return 0;
+ err1:
+       kmem_cache_destroy(svc_rdma_map_cachep);
+ err0:
+       unregister_sysctl_table(svcrdma_table_header);
+       return -ENOMEM;
 }
 MODULE_AUTHOR("Tom Tucker <tom@opengridcomputing.com>");
 MODULE_DESCRIPTION("SVC RDMA Transport");