Commit dc3033e1 authored by Vasily Averin's avatar Vasily Averin Committed by J. Bruce Fields
Browse files

lockd: double unregister of inetaddr notifiers



lockd_up() can call lockd_unregister_notifiers twice:
inside lockd_start_svc() when it calls lockd_svc_exit_thread()
and then in error path of lockd_up()

Patch forces lockd_start_svc() to unregister notifiers in all error cases
and removes extra unregister in error path of lockd_up().

Fixes: cb7d224f "lockd: unregister notifier blocks if the service ..."
Signed-off-by: default avatarVasily Averin <vvs@virtuozzo.com>
Cc: stable@vger.kernel.org
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 53da6a53
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -369,6 +369,7 @@ static int lockd_start_svc(struct svc_serv *serv)
		printk(KERN_WARNING
			"lockd_up: svc_rqst allocation failed, error=%d\n",
			error);
		lockd_unregister_notifiers();
		goto out_rqst;
	}

@@ -459,13 +460,16 @@ int lockd_up(struct net *net)
	}

	error = lockd_up_net(serv, net);
	if (error < 0)
		goto err_net;
	if (error < 0) {
		lockd_unregister_notifiers();
		goto err_put;
	}

	error = lockd_start_svc(serv);
	if (error < 0)
		goto err_start;

	if (error < 0) {
		lockd_down_net(serv, net);
		goto err_put;
	}
	nlmsvc_users++;
	/*
	 * Note: svc_serv structures have an initial use count of 1,
@@ -476,12 +480,6 @@ err_put:
err_create:
	mutex_unlock(&nlmsvc_mutex);
	return error;

err_start:
	lockd_down_net(serv, net);
err_net:
	lockd_unregister_notifiers();
	goto err_put;
}
EXPORT_SYMBOL_GPL(lockd_up);