On Fri, Jul 06, 2012 at 08:34:30AM +1000, NeilBrown wrote: > > This reverts commit 4ad71a69292de1f9d8f7a38a3f7e6508e89b3089 from 2.6.32.y > > That commit (2fefb8a09e7ed251ae8996e0c69066e74c5aa560 in mainline) > was not a bugfix. It was sent to -stable because it is a necessary > precursor for > commit b4f36f88b3ee7cf26bf0be84e6c7fc15f84dcb71 > svcrpc: avoid memory-corruption on pool shutdown > > However that patch didn't make it to 2.6.32.y, presumably because it > doesn't apply. So this commit (2fefb8a09e7e) shouldn't have been > applied either. > > It is a problem because in 2.6.32, it is important to delay destroying > the permsocks until after ->sv_shutdown has been called. The nfsd > sv_shutdown walks the list of permsocks and calls lockd_down() for each. > If the permsocks have already been closed, lockd_down() isn't called > so the lockd thread never exits. > > (upstream commit > commit ac77efbe2b4d2a1e571a4f1e5b6e47de72a7d737 > nfsd: just keep single lockd reference for nfsd > changes nfsd so that the patch being reverted here is safe. > It went into 2.6.36). Acked-by: J. Bruce Fields <bfields@xxxxxxxxxx> --b. > > Cc: "J.Bruce Fields" <bfields@xxxxxxxxxxxx> > Signed-off-by: NeilBrown <neilb@xxxxxxx> > > diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h > index da2e7df..1b353a7 100644 > --- a/include/linux/sunrpc/svcsock.h > +++ b/include/linux/sunrpc/svcsock.h > @@ -34,7 +34,7 @@ struct svc_sock { > /* > * Function prototypes. > */ > -void svc_close_all(struct svc_serv *); > +void svc_close_all(struct list_head *); > int svc_recv(struct svc_rqst *, long); > int svc_send(struct svc_rqst *); > void svc_drop(struct svc_rqst *); > diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c > index 3d98b6e..e664aa5 100644 > --- a/net/sunrpc/svc.c > +++ b/net/sunrpc/svc.c > @@ -475,11 +475,16 @@ svc_destroy(struct svc_serv *serv) > > del_timer_sync(&serv->sv_temptimer); > > - svc_close_all(serv); > + svc_close_all(&serv->sv_tempsocks); > > if (serv->sv_shutdown) > serv->sv_shutdown(serv); > > + svc_close_all(&serv->sv_permsocks); > + > + BUG_ON(!list_empty(&serv->sv_permsocks)); > + BUG_ON(!list_empty(&serv->sv_tempsocks)); > + > cache_clean_deferred(serv); > > if (svc_serv_is_pooled(serv)) > diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c > index 314320a..cc1fb36 100644 > --- a/net/sunrpc/svc_xprt.c > +++ b/net/sunrpc/svc_xprt.c > @@ -927,7 +927,7 @@ void svc_close_xprt(struct svc_xprt *xprt) > } > EXPORT_SYMBOL_GPL(svc_close_xprt); > > -static void svc_close_list(struct list_head *xprt_list) > +void svc_close_all(struct list_head *xprt_list) > { > struct svc_xprt *xprt; > struct svc_xprt *tmp; > @@ -945,15 +945,6 @@ static void svc_close_list(struct list_head *xprt_list) > } > } > > -void svc_close_all(struct svc_serv *serv) > -{ > - svc_close_list(&serv->sv_tempsocks); > - svc_close_list(&serv->sv_permsocks); > - BUG_ON(!list_empty(&serv->sv_permsocks)); > - BUG_ON(!list_empty(&serv->sv_tempsocks)); > - > -} > - > /* > * Handle defer and revisit of requests > */ -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html