]> nv-tegra.nvidia Code Review - linux-2.6.git/commitdiff
nfsd4: allow nfs4 state startup to fail
authorJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 15 Sep 2009 19:56:50 +0000 (15:56 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Wed, 16 Sep 2009 00:49:33 +0000 (20:49 -0400)
The failure here is pretty unlikely, but we should handle it anyway.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4state.c
fs/nfsd/nfssvc.c
include/linux/nfsd/nfsd.h

index 46e9ac5268720cde89232139e5604703b4fc5ad0..11db40cb2f2b8a9a3f364079cf79a4cf46e230f1 100644 (file)
@@ -4004,7 +4004,7 @@ set_max_delegations(void)
 
 /* initialization to perform when the nfsd service is started: */
 
-static void
+static int
 __nfs4_state_start(void)
 {
        unsigned long grace_time;
@@ -4016,19 +4016,26 @@ __nfs4_state_start(void)
        printk(KERN_INFO "NFSD: starting %ld-second grace period\n",
               grace_time/HZ);
        laundry_wq = create_singlethread_workqueue("nfsd4");
+       if (laundry_wq == NULL)
+               return -ENOMEM;
        queue_delayed_work(laundry_wq, &laundromat_work, grace_time);
        set_max_delegations();
+       return 0;
 }
 
-void
+int
 nfs4_state_start(void)
 {
+       int ret;
+
        if (nfs4_init)
-               return;
+               return 0;
        nfsd4_load_reboot_recovery_data();
-       __nfs4_state_start();
+       ret = __nfs4_state_start();
+       if (ret)
+               return ret;
        nfs4_init = 1;
-       return;
+       return 0;
 }
 
 time_t
index 4472449c0937c15a6db24d2c51b3e7fd8b3ab77d..fcc0010882617831d487d71fb0984646adef14f7 100644 (file)
@@ -411,7 +411,9 @@ nfsd_svc(unsigned short port, int nrservs)
        error = nfsd_racache_init(2*nrservs);
        if (error<0)
                goto out;
-       nfs4_state_start();
+       error = nfs4_state_start();
+       if (error)
+               goto out;
 
        nfsd_reset_versions();
 
index 2812ed52669d8fff20e5537e65f493f7655769dc..24fdf89cea831e2e4f20d07abab30b2083c96808 100644 (file)
@@ -166,7 +166,7 @@ extern int nfsd_max_blksize;
 extern unsigned int max_delegations;
 int nfs4_state_init(void);
 void nfsd4_free_slabs(void);
-void nfs4_state_start(void);
+int nfs4_state_start(void);
 void nfs4_state_shutdown(void);
 time_t nfs4_lease_time(void);
 void nfs4_reset_lease(time_t leasetime);
@@ -174,7 +174,7 @@ int nfs4_reset_recoverydir(char *recdir);
 #else
 static inline int nfs4_state_init(void) { return 0; }
 static inline void nfsd4_free_slabs(void) { }
-static inline void nfs4_state_start(void) { }
+static inline int nfs4_state_start(void) { }
 static inline void nfs4_state_shutdown(void) { }
 static inline time_t nfs4_lease_time(void) { return 0; }
 static inline void nfs4_reset_lease(time_t leasetime) { }