|
@@ -510,6 +510,24 @@ svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(svc_create_pooled);
|
|
EXPORT_SYMBOL_GPL(svc_create_pooled);
|
|
|
|
|
|
|
|
+void svc_shutdown_net(struct svc_serv *serv, struct net *net)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * The set of xprts (contained in the sv_tempsocks and
|
|
|
|
+ * sv_permsocks lists) is now constant, since it is modified
|
|
|
|
+ * only by accepting new sockets (done by service threads in
|
|
|
|
+ * svc_recv) or aging old ones (done by sv_temptimer), or
|
|
|
|
+ * configuration changes (excluded by whatever locking the
|
|
|
|
+ * caller is using--nfsd_mutex in the case of nfsd). So it's
|
|
|
|
+ * safe to traverse those lists and shut everything down:
|
|
|
|
+ */
|
|
|
|
+ svc_close_net(serv, net);
|
|
|
|
+
|
|
|
|
+ if (serv->sv_shutdown)
|
|
|
|
+ serv->sv_shutdown(serv, net);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(svc_shutdown_net);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Destroy an RPC service. Should be called with appropriate locking to
|
|
* Destroy an RPC service. Should be called with appropriate locking to
|
|
* protect the sv_nrthreads, sv_permsocks and sv_tempsocks.
|
|
* protect the sv_nrthreads, sv_permsocks and sv_tempsocks.
|
|
@@ -532,16 +550,8 @@ svc_destroy(struct svc_serv *serv)
|
|
printk("svc_destroy: no threads for serv=%p!\n", serv);
|
|
printk("svc_destroy: no threads for serv=%p!\n", serv);
|
|
|
|
|
|
del_timer_sync(&serv->sv_temptimer);
|
|
del_timer_sync(&serv->sv_temptimer);
|
|
- /*
|
|
|
|
- * The set of xprts (contained in the sv_tempsocks and
|
|
|
|
- * sv_permsocks lists) is now constant, since it is modified
|
|
|
|
- * only by accepting new sockets (done by service threads in
|
|
|
|
- * svc_recv) or aging old ones (done by sv_temptimer), or
|
|
|
|
- * configuration changes (excluded by whatever locking the
|
|
|
|
- * caller is using--nfsd_mutex in the case of nfsd). So it's
|
|
|
|
- * safe to traverse those lists and shut everything down:
|
|
|
|
- */
|
|
|
|
- svc_close_net(serv, net);
|
|
|
|
|
|
+
|
|
|
|
+ svc_shutdown_net(serv, net);
|
|
|
|
|
|
/*
|
|
/*
|
|
* The last user is gone and thus all sockets have to be destroyed to
|
|
* The last user is gone and thus all sockets have to be destroyed to
|
|
@@ -550,9 +560,6 @@ svc_destroy(struct svc_serv *serv)
|
|
BUG_ON(!list_empty(&serv->sv_permsocks));
|
|
BUG_ON(!list_empty(&serv->sv_permsocks));
|
|
BUG_ON(!list_empty(&serv->sv_tempsocks));
|
|
BUG_ON(!list_empty(&serv->sv_tempsocks));
|
|
|
|
|
|
- if (serv->sv_shutdown)
|
|
|
|
- serv->sv_shutdown(serv, net);
|
|
|
|
-
|
|
|
|
cache_clean_deferred(serv);
|
|
cache_clean_deferred(serv);
|
|
|
|
|
|
if (svc_serv_is_pooled(serv))
|
|
if (svc_serv_is_pooled(serv))
|