NeilBrown 990a1b
From: Vasily Averin <vvs@virtuozzo.com>
NeilBrown 990a1b
Date: Fri, 20 Oct 2017 17:33:18 +0300
NeilBrown 990a1b
Subject: [PATCH] lockd: double unregister of inetaddr notifiers
NeilBrown 990a1b
Git-commit: dc3033e16c59a2c4e62b31341258a5786cbcee56
NeilBrown 990a1b
Patch-mainline: v4.15
NeilBrown 990a1b
References: git-fixes
NeilBrown 990a1b
NeilBrown 990a1b
lockd_up() can call lockd_unregister_notifiers twice:
NeilBrown 990a1b
inside lockd_start_svc() when it calls lockd_svc_exit_thread()
NeilBrown 990a1b
and then in error path of lockd_up()
NeilBrown 990a1b
NeilBrown 990a1b
Patch forces lockd_start_svc() to unregister notifiers in all error cases
NeilBrown 990a1b
and removes extra unregister in error path of lockd_up().
NeilBrown 990a1b
NeilBrown 990a1b
Fixes: cb7d224f82e4 "lockd: unregister notifier blocks if the service ..."
NeilBrown 990a1b
Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
NeilBrown 990a1b
Cc: stable@vger.kernel.org
NeilBrown 990a1b
Reviewed-by: Jeff Layton <jlayton@kernel.org>
NeilBrown 990a1b
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
NeilBrown 990a1b
Acked-by: NeilBrown <neilb@suse.com>
NeilBrown 990a1b
NeilBrown 990a1b
---
NeilBrown 990a1b
 fs/lockd/svc.c |   20 +++++++++-----------
NeilBrown 990a1b
 1 file changed, 9 insertions(+), 11 deletions(-)
NeilBrown 990a1b
NeilBrown 990a1b
--- a/fs/lockd/svc.c
NeilBrown 990a1b
+++ b/fs/lockd/svc.c
NeilBrown 990a1b
@@ -369,6 +369,7 @@ static int lockd_start_svc(struct svc_se
NeilBrown 990a1b
 		printk(KERN_WARNING
NeilBrown 990a1b
 			"lockd_up: svc_rqst allocation failed, error=%d\n",
NeilBrown 990a1b
 			error);
NeilBrown 990a1b
+		lockd_unregister_notifiers();
NeilBrown 990a1b
 		goto out_rqst;
NeilBrown 990a1b
 	}
NeilBrown 990a1b
 
NeilBrown 990a1b
@@ -459,13 +460,16 @@ int lockd_up(struct net *net)
NeilBrown 990a1b
 	}
NeilBrown 990a1b
 
NeilBrown 990a1b
 	error = lockd_up_net(serv, net);
NeilBrown 990a1b
-	if (error < 0)
NeilBrown 990a1b
-		goto err_net;
NeilBrown 990a1b
+	if (error < 0) {
NeilBrown 990a1b
+		lockd_unregister_notifiers();
NeilBrown 990a1b
+		goto err_put;
NeilBrown 990a1b
+	}
NeilBrown 990a1b
 
NeilBrown 990a1b
 	error = lockd_start_svc(serv);
NeilBrown 990a1b
-	if (error < 0)
NeilBrown 990a1b
-		goto err_start;
NeilBrown 990a1b
-
NeilBrown 990a1b
+	if (error < 0) {
NeilBrown 990a1b
+		lockd_down_net(serv, net);
NeilBrown 990a1b
+		goto err_put;
NeilBrown 990a1b
+	}
NeilBrown 990a1b
 	nlmsvc_users++;
NeilBrown 990a1b
 	/*
NeilBrown 990a1b
 	 * Note: svc_serv structures have an initial use count of 1,
NeilBrown 990a1b
@@ -476,12 +480,6 @@ err_put:
NeilBrown 990a1b
 err_create:
NeilBrown 990a1b
 	mutex_unlock(&nlmsvc_mutex);
NeilBrown 990a1b
 	return error;
NeilBrown 990a1b
-
NeilBrown 990a1b
-err_start:
NeilBrown 990a1b
-	lockd_down_net(serv, net);
NeilBrown 990a1b
-err_net:
NeilBrown 990a1b
-	lockd_unregister_notifiers();
NeilBrown 990a1b
-	goto err_put;
NeilBrown 990a1b
 }
NeilBrown 990a1b
 EXPORT_SYMBOL_GPL(lockd_up);
NeilBrown 990a1b