diff options
-rw-r--r-- | fs/nfsd/export.c | 11 | ||||
-rw-r--r-- | fs/nfsd/nfsfh.c | 6 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 2 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 2 | ||||
-rw-r--r-- | net/sunrpc/cache.c | 11 | ||||
-rw-r--r-- | net/sunrpc/svcauth_unix.c | 1 |
6 files changed, 22 insertions, 11 deletions
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index b0591cd172eb..1137d09c5976 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c | |||
@@ -787,15 +787,20 @@ exp_get_by_name(svc_client *clp, struct vfsmount *mnt, struct dentry *dentry, | |||
787 | key.ex_dentry = dentry; | 787 | key.ex_dentry = dentry; |
788 | 788 | ||
789 | exp = svc_export_lookup(&key); | 789 | exp = svc_export_lookup(&key); |
790 | if (exp != NULL) | 790 | if (exp != NULL) { |
791 | switch (cache_check(&svc_export_cache, &exp->h, reqp)) { | 791 | int err; |
792 | |||
793 | err = cache_check(&svc_export_cache, &exp->h, reqp); | ||
794 | switch (err) { | ||
792 | case 0: break; | 795 | case 0: break; |
793 | case -EAGAIN: | 796 | case -EAGAIN: |
794 | exp = ERR_PTR(-EAGAIN); | 797 | case -ETIMEDOUT: |
798 | exp = ERR_PTR(err); | ||
795 | break; | 799 | break; |
796 | default: | 800 | default: |
797 | exp = NULL; | 801 | exp = NULL; |
798 | } | 802 | } |
803 | } | ||
799 | 804 | ||
800 | return exp; | 805 | return exp; |
801 | } | 806 | } |
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 727ab3bd450d..b06bf9f70efc 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
@@ -169,9 +169,11 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
169 | exp = exp_find(rqstp->rq_client, 0, tfh, &rqstp->rq_chandle); | 169 | exp = exp_find(rqstp->rq_client, 0, tfh, &rqstp->rq_chandle); |
170 | } | 170 | } |
171 | 171 | ||
172 | error = nfserr_dropit; | 172 | if (IS_ERR(exp) && (PTR_ERR(exp) == -EAGAIN |
173 | if (IS_ERR(exp) && PTR_ERR(exp) == -EAGAIN) | 173 | || PTR_ERR(exp) == -ETIMEDOUT)) { |
174 | error = nfserrno(PTR_ERR(exp)); | ||
174 | goto out; | 175 | goto out; |
176 | } | ||
175 | 177 | ||
176 | error = nfserr_stale; | 178 | error = nfserr_stale; |
177 | if (!exp || IS_ERR(exp)) | 179 | if (!exp || IS_ERR(exp)) |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 4883d7586229..7a79c23aa6d4 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -99,7 +99,7 @@ static struct raparm_hbucket raparm_hash[RAPARM_HASH_SIZE]; | |||
99 | /* | 99 | /* |
100 | * Called from nfsd_lookup and encode_dirent. Check if we have crossed | 100 | * Called from nfsd_lookup and encode_dirent. Check if we have crossed |
101 | * a mount point. | 101 | * a mount point. |
102 | * Returns -EAGAIN leaving *dpp and *expp unchanged, | 102 | * Returns -EAGAIN or -ETIMEDOUT leaving *dpp and *expp unchanged, |
103 | * or nfs_ok having possibly changed *dpp and *expp | 103 | * or nfs_ok having possibly changed *dpp and *expp |
104 | */ | 104 | */ |
105 | int | 105 | int |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 3bf3520f92d1..066c64a97fd8 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
@@ -1066,7 +1066,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
1066 | } | 1066 | } |
1067 | switch(cache_check(&rsi_cache, &rsip->h, &rqstp->rq_chandle)) { | 1067 | switch(cache_check(&rsi_cache, &rsip->h, &rqstp->rq_chandle)) { |
1068 | case -EAGAIN: | 1068 | case -EAGAIN: |
1069 | goto drop; | 1069 | case -ETIMEDOUT: |
1070 | case -ENOENT: | 1070 | case -ENOENT: |
1071 | goto drop; | 1071 | goto drop; |
1072 | case 0: | 1072 | case 0: |
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 80aff0474572..824e8534e022 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | #define RPCDBG_FACILITY RPCDBG_CACHE | 35 | #define RPCDBG_FACILITY RPCDBG_CACHE |
36 | 36 | ||
37 | static void cache_defer_req(struct cache_req *req, struct cache_head *item); | 37 | static int cache_defer_req(struct cache_req *req, struct cache_head *item); |
38 | static void cache_revisit_request(struct cache_head *item); | 38 | static void cache_revisit_request(struct cache_head *item); |
39 | 39 | ||
40 | static void cache_init(struct cache_head *h) | 40 | static void cache_init(struct cache_head *h) |
@@ -185,6 +185,7 @@ static int cache_make_upcall(struct cache_detail *detail, struct cache_head *h); | |||
185 | * | 185 | * |
186 | * Returns 0 if the cache_head can be used, or cache_puts it and returns | 186 | * Returns 0 if the cache_head can be used, or cache_puts it and returns |
187 | * -EAGAIN if upcall is pending, | 187 | * -EAGAIN if upcall is pending, |
188 | * -ETIMEDOUT if upcall failed and should be retried, | ||
188 | * -ENOENT if cache entry was negative | 189 | * -ENOENT if cache entry was negative |
189 | */ | 190 | */ |
190 | int cache_check(struct cache_detail *detail, | 191 | int cache_check(struct cache_detail *detail, |
@@ -236,7 +237,8 @@ int cache_check(struct cache_detail *detail, | |||
236 | } | 237 | } |
237 | 238 | ||
238 | if (rv == -EAGAIN) | 239 | if (rv == -EAGAIN) |
239 | cache_defer_req(rqstp, h); | 240 | if (cache_defer_req(rqstp, h) != 0) |
241 | rv = -ETIMEDOUT; | ||
240 | 242 | ||
241 | if (rv) | 243 | if (rv) |
242 | cache_put(h, detail); | 244 | cache_put(h, detail); |
@@ -523,14 +525,14 @@ static LIST_HEAD(cache_defer_list); | |||
523 | static struct list_head cache_defer_hash[DFR_HASHSIZE]; | 525 | static struct list_head cache_defer_hash[DFR_HASHSIZE]; |
524 | static int cache_defer_cnt; | 526 | static int cache_defer_cnt; |
525 | 527 | ||
526 | static void cache_defer_req(struct cache_req *req, struct cache_head *item) | 528 | static int cache_defer_req(struct cache_req *req, struct cache_head *item) |
527 | { | 529 | { |
528 | struct cache_deferred_req *dreq; | 530 | struct cache_deferred_req *dreq; |
529 | int hash = DFR_HASH(item); | 531 | int hash = DFR_HASH(item); |
530 | 532 | ||
531 | dreq = req->defer(req); | 533 | dreq = req->defer(req); |
532 | if (dreq == NULL) | 534 | if (dreq == NULL) |
533 | return; | 535 | return -ETIMEDOUT; |
534 | 536 | ||
535 | dreq->item = item; | 537 | dreq->item = item; |
536 | dreq->recv_time = get_seconds(); | 538 | dreq->recv_time = get_seconds(); |
@@ -571,6 +573,7 @@ static void cache_defer_req(struct cache_req *req, struct cache_head *item) | |||
571 | /* must have just been validated... */ | 573 | /* must have just been validated... */ |
572 | cache_revisit_request(item); | 574 | cache_revisit_request(item); |
573 | } | 575 | } |
576 | return 0; | ||
574 | } | 577 | } |
575 | 578 | ||
576 | static void cache_revisit_request(struct cache_head *item) | 579 | static void cache_revisit_request(struct cache_head *item) |
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index a0a953a430c2..177f81608cfb 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c | |||
@@ -435,6 +435,7 @@ svcauth_unix_set_client(struct svc_rqst *rqstp) | |||
435 | default: | 435 | default: |
436 | BUG(); | 436 | BUG(); |
437 | case -EAGAIN: | 437 | case -EAGAIN: |
438 | case -ETIMEDOUT: | ||
438 | return SVC_DROP; | 439 | return SVC_DROP; |
439 | case -ENOENT: | 440 | case -ENOENT: |
440 | return SVC_DENIED; | 441 | return SVC_DENIED; |