Patch "lockd: fix lockd shutdown race" has been added to the 3.18-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
lockd: fix lockd shutdown race
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
lockd-fix-lockd-shutdown-race.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Apr 10 13:58:07 CEST 2018
From: "J. Bruce Fields" <[email protected]>
Date: Tue, 28 Mar 2017 21:25:08 -0400
Subject: lockd: fix lockd shutdown race
From: "J. Bruce Fields" <[email protected]>
[ Upstream commit efda760fe95ea15291853c8fa9235c32d319cd98 ]
As reported by David Jeffery: "a signal was sent to lockd while lockd was shutting down from a request to stop nfs. The signal causes lockd to call restart_grace() which puts the lockd_net structure on the grace list. If this signal is received at the wrong time, it will occur after lockd_down_net() has called locks_end_grace() but before lockd_down_net() stops the lockd thread. This leads to lockd putting the lockd_net structure back on the grace list, then exiting without anything removing it from the list."
So, perform the final locks_end_grace() from the the lockd thread; this ensures it's serialized with respect to restart_grace().
--- fs/lockd/svc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/lockd/svc.c +4 -2
@@ -129,6 +129,8 @@ lockd(void *vrqstp) {int err =0 ;struct svc_rqst *rqstp = vrqstp; +struct net *net = &init_net; +struct lockd_net *ln =net_generic (net, lockd_net_id);/* try_to_freeze() is called from svc_recv() */ set_freezable ();
@@ -173,6 +175,8 @@ lockd(void *vrqstp)if (nlmsvc_ops)nlmsvc_invalidate_all ();nlm_shutdown_hosts (); +cancel_delayed_work_sync (&ln->grace_period_end); +locks_end_grace (&ln->lockd_manager);return 0 ; }
@@ -267,8 +271,6 @@ static void lockd_down_net(struct svc_seif (ln->nlmsvc_users) {if (--ln->nlmsvc_users ==0 ) {nlm_shutdown_hosts_net (net); -cancel_delayed_work_sync (&ln->grace_period_end); -locks_end_grace (&ln->lockd_manager);svc_shutdown_net (serv, net);dprintk ("lockd_down_net: per-net data destroyed; net=%p\n" , net); }
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/lockd-fix-lockd-shutdown-race.patch