forked from Minki/linux
[PATCH] knfsd: Correctly handle error condition from lockd_up
If lockd_up fails - what should we expect? Do we have to later call lockd_down? Well the nfs client thinks "no", the nfs server thinks "yes". lockd thinks "yes". The only answer that really makes sense is "no" !! So: Make lockd_up only increment nlmsvc_users on success. Make nfsd handle errors from lockd_up properly. Make sure lockd_up(0) never fails when lockd is running so that the 'reclaimer' call to lockd_up doesn't need to be error checked. Cc: "J. Bruce Fields" <bfields@fieldses.org> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
7dcf91ec66
commit
4a3ae42dc3
@ -202,7 +202,7 @@ reclaimer(void *ptr)
|
||||
/* This one ensures that our parent doesn't terminate while the
|
||||
* reclaim is in progress */
|
||||
lock_kernel();
|
||||
lockd_up(0);
|
||||
lockd_up(0); /* note: this cannot fail as lockd is already running */
|
||||
|
||||
nlmclnt_prepare_reclaim(host);
|
||||
/* First, reclaim all locks that have been marked. */
|
||||
|
@ -253,16 +253,12 @@ lockd_up(int proto) /* Maybe add a 'family' option when IPv6 is supported ?? */
|
||||
int error = 0;
|
||||
|
||||
mutex_lock(&nlmsvc_mutex);
|
||||
/*
|
||||
* Unconditionally increment the user count ... this is
|
||||
* the number of clients who _want_ a lockd process.
|
||||
*/
|
||||
nlmsvc_users++;
|
||||
/*
|
||||
* Check whether we're already up and running.
|
||||
*/
|
||||
if (nlmsvc_pid) {
|
||||
error = make_socks(nlmsvc_serv, proto);
|
||||
if (proto)
|
||||
error = make_socks(nlmsvc_serv, proto);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -270,7 +266,7 @@ lockd_up(int proto) /* Maybe add a 'family' option when IPv6 is supported ?? */
|
||||
* Sanity check: if there's no pid,
|
||||
* we should be the first user ...
|
||||
*/
|
||||
if (nlmsvc_users > 1)
|
||||
if (nlmsvc_users)
|
||||
printk(KERN_WARNING
|
||||
"lockd_up: no pid, %d users??\n", nlmsvc_users);
|
||||
|
||||
@ -302,6 +298,8 @@ lockd_up(int proto) /* Maybe add a 'family' option when IPv6 is supported ?? */
|
||||
destroy_and_out:
|
||||
svc_destroy(serv);
|
||||
out:
|
||||
if (!error)
|
||||
nlmsvc_users++;
|
||||
mutex_unlock(&nlmsvc_mutex);
|
||||
return error;
|
||||
}
|
||||
|
@ -221,18 +221,22 @@ static int nfsd_init_socks(int port)
|
||||
if (!list_empty(&nfsd_serv->sv_permsocks))
|
||||
return 0;
|
||||
|
||||
error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
|
||||
if (error < 0)
|
||||
return error;
|
||||
error = lockd_up(IPPROTO_UDP);
|
||||
if (error >= 0) {
|
||||
error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
|
||||
if (error < 0)
|
||||
lockd_down();
|
||||
}
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
#ifdef CONFIG_NFSD_TCP
|
||||
error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
|
||||
if (error < 0)
|
||||
return error;
|
||||
error = lockd_up(IPPROTO_TCP);
|
||||
if (error >= 0) {
|
||||
error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
|
||||
if (error < 0)
|
||||
lockd_down();
|
||||
}
|
||||
if (error < 0)
|
||||
return error;
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user