diff options
author | NeilBrown <neilb@suse.de> | 2006-10-02 05:17:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:18 -0400 |
commit | 4a3ae42dc312dbdffee803efaf393421b79f997a (patch) | |
tree | d18249c89fc1a5ab273beec1639cde769a0b6e96 /fs/nfsd | |
parent | 7dcf91ec6698fe8564ad91bbe42740aacaa0d9ee (diff) |
[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>
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfssvc.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index f1314c63e823..cdec3993e0d5 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -221,18 +221,22 @@ static int nfsd_init_socks(int port) | |||
221 | if (!list_empty(&nfsd_serv->sv_permsocks)) | 221 | if (!list_empty(&nfsd_serv->sv_permsocks)) |
222 | return 0; | 222 | return 0; |
223 | 223 | ||
224 | error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); | ||
225 | if (error < 0) | ||
226 | return error; | ||
227 | error = lockd_up(IPPROTO_UDP); | 224 | error = lockd_up(IPPROTO_UDP); |
225 | if (error >= 0) { | ||
226 | error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); | ||
227 | if (error < 0) | ||
228 | lockd_down(); | ||
229 | } | ||
228 | if (error < 0) | 230 | if (error < 0) |
229 | return error; | 231 | return error; |
230 | 232 | ||
231 | #ifdef CONFIG_NFSD_TCP | 233 | #ifdef CONFIG_NFSD_TCP |
232 | error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); | ||
233 | if (error < 0) | ||
234 | return error; | ||
235 | error = lockd_up(IPPROTO_TCP); | 234 | error = lockd_up(IPPROTO_TCP); |
235 | if (error >= 0) { | ||
236 | error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); | ||
237 | if (error < 0) | ||
238 | lockd_down(); | ||
239 | } | ||
236 | if (error < 0) | 240 | if (error < 0) |
237 | return error; | 241 | return error; |
238 | #endif | 242 | #endif |