diff options
author | Anton Arapov <anton@redhat.com> | 2012-06-21 08:44:47 +0200 |
---|---|---|
committer | Anton Arapov <anton@redhat.com> | 2012-06-21 08:44:47 +0200 |
commit | 35df99f47c4246df74ed7571c692138b83c3c486 (patch) | |
tree | 1f14dd15cf001e590e7f7406c8e594a0003fcff0 /fs/lockd/svc.c | |
parent | 8a6c6e11d3f0dcecf13668e33f5095b1fe9cb613 (diff) | |
download | kernel-uprobes-35df99f47c4246df74ed7571c692138b83c3c486.tar.gz kernel-uprobes-35df99f47c4246df74ed7571c692138b83c3c486.tar.xz kernel-uprobes-35df99f47c4246df74ed7571c692138b83c3c486.zip |
fedora kernel: 3d47c715a4a94b9d700c9e4ec1fc3a786bfde746v3.4.3-3
Signed-off-by: Anton Arapov <anton@redhat.com>
Diffstat (limited to 'fs/lockd/svc.c')
-rw-r--r-- | fs/lockd/svc.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index f49b9afc443..f1b3cce4d08 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -257,7 +257,7 @@ static int lockd_up_net(struct net *net) struct svc_serv *serv = nlmsvc_rqst->rq_server; int error; - if (ln->nlmsvc_users) + if (ln->nlmsvc_users++) return 0; error = svc_rpcb_setup(serv, net); @@ -272,6 +272,7 @@ static int lockd_up_net(struct net *net) err_socks: svc_rpcb_cleanup(serv, net); err_rpcb: + ln->nlmsvc_users--; return error; } @@ -300,6 +301,7 @@ int lockd_up(void) struct svc_serv *serv; int error = 0; struct net *net = current->nsproxy->net_ns; + struct lockd_net *ln = net_generic(net, lockd_net_id); mutex_lock(&nlmsvc_mutex); /* @@ -325,9 +327,17 @@ int lockd_up(void) goto out; } + error = svc_bind(serv, net); + if (error < 0) { + printk(KERN_WARNING "lockd_up: bind service failed\n"); + goto destroy_and_out; + } + + ln->nlmsvc_users++; + error = make_socks(serv, net); if (error < 0) - goto destroy_and_out; + goto err_start; /* * Create the kernel thread and wait for it to start. @@ -339,7 +349,7 @@ int lockd_up(void) printk(KERN_WARNING "lockd_up: svc_rqst allocation failed, error=%d\n", error); - goto destroy_and_out; + goto err_start; } svc_sock_update_bufs(serv); @@ -353,7 +363,7 @@ int lockd_up(void) nlmsvc_rqst = NULL; printk(KERN_WARNING "lockd_up: kthread_run failed, error=%d\n", error); - goto destroy_and_out; + goto err_start; } /* @@ -363,14 +373,14 @@ int lockd_up(void) destroy_and_out: svc_destroy(serv); out: - if (!error) { - struct lockd_net *ln = net_generic(net, lockd_net_id); - - ln->nlmsvc_users++; + if (!error) nlmsvc_users++; - } mutex_unlock(&nlmsvc_mutex); return error; + +err_start: + lockd_down_net(net); + goto destroy_and_out; } EXPORT_SYMBOL_GPL(lockd_up); @@ -381,11 +391,10 @@ void lockd_down(void) { mutex_lock(&nlmsvc_mutex); + lockd_down_net(current->nsproxy->net_ns); if (nlmsvc_users) { - if (--nlmsvc_users) { - lockd_down_net(current->nsproxy->net_ns); + if (--nlmsvc_users) goto out; - } } else { printk(KERN_ERR "lockd_down: no users! task=%p\n", nlmsvc_task); |