SUNRPC: new svc_bind() routine introduced
[pandora-kernel.git] / fs / nfsd / nfssvc.c
index fce472f..0762f3c 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/fs_struct.h>
 #include <linux/swap.h>
+#include <linux/nsproxy.h>
 
 #include <linux/sunrpc/stats.h>
 #include <linux/sunrpc/svcsock.h>
@@ -220,7 +221,7 @@ static int nfsd_startup(unsigned short port, int nrservs)
        ret = nfsd_init_socks(port);
        if (ret)
                goto out_racache;
-       ret = lockd_up();
+       ret = lockd_up(&init_net);
        if (ret)
                goto out_racache;
        ret = nfs4_state_start();
@@ -229,7 +230,7 @@ static int nfsd_startup(unsigned short port, int nrservs)
        nfsd_up = true;
        return 0;
 out_lockd:
-       lockd_down();
+       lockd_down(&init_net);
 out_racache:
        nfsd_racache_shutdown();
        return ret;
@@ -246,7 +247,7 @@ static void nfsd_shutdown(void)
        if (!nfsd_up)
                return;
        nfs4_state_shutdown();
-       lockd_down();
+       lockd_down(&init_net);
        nfsd_racache_shutdown();
        nfsd_up = false;
 }
@@ -261,7 +262,7 @@ static void nfsd_last_thread(struct svc_serv *serv, struct net *net)
 
        printk(KERN_WARNING "nfsd: last server has exited, flushing export "
                            "cache\n");
-       nfsd_export_flush();
+       nfsd_export_flush(net);
 }
 
 void nfsd_reset_versions(void)
@@ -307,41 +308,53 @@ static void set_max_drc(void)
        dprintk("%s nfsd_drc_max_mem %u \n", __func__, nfsd_drc_max_mem);
 }
 
+static int nfsd_get_default_max_blksize(void)
+{
+       struct sysinfo i;
+       unsigned long long target;
+       unsigned long ret;
+
+       si_meminfo(&i);
+       target = (i.totalram - i.totalhigh) << PAGE_SHIFT;
+       /*
+        * Aim for 1/4096 of memory per thread This gives 1MB on 4Gig
+        * machines, but only uses 32K on 128M machines.  Bottom out at
+        * 8K on 32M and smaller.  Of course, this is only a default.
+        */
+       target >>= 12;
+
+       ret = NFSSVC_MAXBLKSIZE;
+       while (ret > target && ret >= 8*1024*2)
+               ret /= 2;
+       return ret;
+}
+
 int nfsd_create_serv(void)
 {
-       int err = 0;
+       int error;
 
        WARN_ON(!mutex_is_locked(&nfsd_mutex));
        if (nfsd_serv) {
                svc_get(nfsd_serv);
                return 0;
        }
-       if (nfsd_max_blksize == 0) {
-               /* choose a suitable default */
-               struct sysinfo i;
-               si_meminfo(&i);
-               /* Aim for 1/4096 of memory per thread
-                * This gives 1MB on 4Gig machines
-                * But only uses 32K on 128M machines.
-                * Bottom out at 8K on 32M and smaller.
-                * Of course, this is only a default.
-                */
-               nfsd_max_blksize = NFSSVC_MAXBLKSIZE;
-               i.totalram <<= PAGE_SHIFT - 12;
-               while (nfsd_max_blksize > i.totalram &&
-                      nfsd_max_blksize >= 8*1024*2)
-                       nfsd_max_blksize /= 2;
-       }
+       if (nfsd_max_blksize == 0)
+               nfsd_max_blksize = nfsd_get_default_max_blksize();
        nfsd_reset_versions();
-
        nfsd_serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
                                      nfsd_last_thread, nfsd, THIS_MODULE);
        if (nfsd_serv == NULL)
                return -ENOMEM;
 
+       error = svc_bind(nfsd_serv, current->nsproxy->net_ns);
+       if (error < 0) {
+               svc_destroy(nfsd_serv);
+               return error;
+       }
+
        set_max_drc();
        do_gettimeofday(&nfssvc_boot);          /* record boot time */
-       return err;
+       return 0;
 }
 
 int nfsd_nrpools(void)