diff mbox

Revert "svcrpc: destroy server sockets all at once" from 2.6.32.y

Message ID 20120706083430.4bdb1bad@notabene.brown (mailing list archive)
State New, archived
Headers show

Commit Message

NeilBrown July 5, 2012, 10:34 p.m. UTC
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).

Cc: "J.Bruce Fields" <bfields@fieldses.org>
Signed-off-by: NeilBrown <neilb@suse.de>

Comments

J. Bruce Fields July 5, 2012, 10:39 p.m. UTC | #1
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@redhat.com>

--b.

> 
> Cc: "J.Bruce Fields" <bfields@fieldses.org>
> Signed-off-by: NeilBrown <neilb@suse.de>
> 
> 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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
  */