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