nfsd: cleanup NFSd state start a bit
[firefly-linux-kernel-4.4.55.git] / fs / nfsd / nfs4state.c
index 84a27a24b806bd19b660ba36153db6a6d697dd50..6f5798623eb1c231f2b5f5024c01a5f838d78c56 100644 (file)
@@ -4770,7 +4770,7 @@ set_max_delegations(void)
        max_delegations = nr_free_buffer_pages() >> (20 - 2 - PAGE_SHIFT);
 }
 
-static int nfs4_state_start_net(struct net *net)
+static int nfs4_state_create_net(struct net *net)
 {
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        int i;
@@ -4813,6 +4813,7 @@ static int nfs4_state_start_net(struct net *net)
        spin_lock_init(&nn->client_lock);
 
        INIT_DELAYED_WORK(&nn->laundromat_work, laundromat_main);
+       get_net(net);
 
        return 0;
 
@@ -4860,37 +4861,35 @@ nfs4_state_destroy_net(struct net *net)
        put_net(net);
 }
 
-/* initialization to perform when the nfsd service is started: */
-
-int
-nfs4_state_start(void)
+static int
+nfs4_state_start_net(struct net *net)
 {
-       struct net *net = &init_net;
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        int ret;
 
-       /*
-        * FIXME: For now, we hang most of the pernet global stuff off of
-        * init_net until nfsd is fully containerized. Eventually, we'll
-        * need to pass a net pointer into this function, take a reference
-        * to that instead and then do most of the rest of this on a per-net
-        * basis.
-        */
-       get_net(net);
-       ret = nfs4_state_start_net(net);
+       ret = nfs4_state_create_net(net);
        if (ret)
                return ret;
        nfsd4_client_tracking_init(net);
        nn->boot_time = get_seconds();
        locks_start_grace(net, &nn->nfsd4_manager);
        nn->grace_ended = false;
-       printk(KERN_INFO "NFSD: starting %ld-second grace period\n",
-              nfsd4_grace);
+       printk(KERN_INFO "NFSD: starting %ld-second grace period (net %p)\n",
+              nfsd4_grace, net);
+       queue_delayed_work(laundry_wq, &nn->laundromat_work, nfsd4_grace * HZ);
+       return 0;
+}
+
+/* initialization to perform when the nfsd service is started: */
+
+int
+nfs4_state_start(void)
+{
+       int ret;
+
        ret = set_callback_cred();
-       if (ret) {
-               ret = -ENOMEM;
-               goto out_recovery;
-       }
+       if (ret)
+               return -ENOMEM;
        laundry_wq = create_singlethread_workqueue("nfsd4");
        if (laundry_wq == NULL) {
                ret = -ENOMEM;
@@ -4900,14 +4899,26 @@ nfs4_state_start(void)
        if (ret)
                goto out_free_laundry;
 
-       queue_delayed_work(laundry_wq, &nn->laundromat_work, nfsd4_grace * HZ);
        set_max_delegations();
+
+       /*
+        * FIXME: For now, we hang most of the pernet global stuff off of
+        * init_net until nfsd is fully containerized. Eventually, we'll
+        * need to pass a net pointer into this function, take a reference
+        * to that instead and then do most of the rest of this on a per-net
+        * basis.
+        */
+       ret = nfs4_state_start_net(&init_net);
+       if (ret)
+               goto out_free_callback;
+
        return 0;
+
+out_free_callback:
+       nfsd4_destroy_callback_queue();
 out_free_laundry:
        destroy_workqueue(laundry_wq);
 out_recovery:
-       nfsd4_client_tracking_exit(net);
-       nfs4_state_destroy_net(net);
        return ret;
 }