printk(KERN_WARNING
                        "lockd_up: makesock failed, error=%d\n", err);
        svc_shutdown_net(serv, net);
+       svc_rpcb_cleanup(serv, net);
        return err;
 }
 
                        cancel_delayed_work_sync(&ln->grace_period_end);
                        locks_end_grace(&ln->lockd_manager);
                        svc_shutdown_net(serv, net);
-                       dprintk("%s: per-net data destroyed; net=%x\n",
-                               __func__, net->ns.inum);
+                       svc_rpcb_cleanup(serv, net);
                }
        } else {
                pr_err("%s: no users! net=%x\n",
 #endif
 
 static const struct svc_serv_ops lockd_sv_ops = {
-       .svo_shutdown           = svc_rpcb_cleanup,
        .svo_function           = lockd,
        .svo_module             = THIS_MODULE,
 };
 
 }
 
 static const struct svc_serv_ops nfsd_thread_sv_ops = {
-       .svo_shutdown           = nfsd_last_thread,
        .svo_function           = nfsd,
        .svo_module             = THIS_MODULE,
 };
 
        if (kref_put(&nn->nfsd_serv->sv_refcnt, nfsd_noop)) {
                svc_shutdown_net(nn->nfsd_serv, net);
+               nfsd_last_thread(nn->nfsd_serv, net);
                svc_destroy(&nn->nfsd_serv->sv_refcnt);
                spin_lock(&nfsd_notifier_lock);
                nn->nfsd_serv = NULL;
 
 struct svc_serv;
 
 struct svc_serv_ops {
-       /* Callback to use when last thread exits. */
-       void            (*svo_shutdown)(struct svc_serv *, struct net *);
-
        /* function for service threads to run */
        int             (*svo_function)(void *);
 
 
 void svc_shutdown_net(struct svc_serv *serv, struct net *net)
 {
        svc_close_net(serv, net);
-
-       if (serv->sv_ops->svo_shutdown)
-               serv->sv_ops->svo_shutdown(serv, net);
 }
 EXPORT_SYMBOL_GPL(svc_shutdown_net);