]> git.karo-electronics.de Git - linux-beck.git/commitdiff
nfsd4: stop using nfserr_resource for transitory errors
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 10 Aug 2011 23:07:33 +0000 (19:07 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Sat, 27 Aug 2011 18:21:21 +0000 (14:21 -0400)
The server is returning nfserr_resource for both permanent errors and
for errors (like allocation failures) that might be resolved by retrying
later.  Save nfserr_resource for the former and use delay/jukebox for
the latter.

Cc: stable@kernel.org
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4recover.c
fs/nfsd/nfs4state.c

index b5530984db917c1a23ec667a024557b730d769f9..50bae747114752e656198b0006044e4e7cfea58e 100644 (file)
@@ -940,7 +940,7 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        count = 4 + (verify->ve_attrlen >> 2);
        buf = kmalloc(count << 2, GFP_KERNEL);
        if (!buf)
-               return nfserr_resource;
+               return nfserr_jukebox;
 
        status = nfsd4_encode_fattr(&cstate->current_fh,
                                    cstate->current_fh.fh_export,
index 493851b844fe5697257dd10896c768e099f51d98..ed083b9a731b630b02ddaac5957a6a558cead62c 100644 (file)
@@ -89,7 +89,7 @@ nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname)
        struct xdr_netobj cksum;
        struct hash_desc desc;
        struct scatterlist sg;
-       __be32 status = nfserr_resource;
+       __be32 status = nfserr_jukebox;
 
        dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n",
                        clname->len, clname->data);
index 36d0beb76864c6df0811d2fca8d8f35429447da2..c7d54f6a19c950c86bf85cd437efbe4eeaffe8e5 100644 (file)
@@ -1944,7 +1944,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
         * of 5 bullet points, labeled as CASE0 - CASE4 below.
         */
        unconf = find_unconfirmed_client_by_str(dname, strhashval);
-       status = nfserr_resource;
+       status = nfserr_jukebox;
        if (!conf) {
                /*
                 * RFC 3530 14.2.33 CASE 4:
@@ -2481,7 +2481,7 @@ renew:
        if (open->op_stateowner == NULL) {
                sop = alloc_init_open_stateowner(strhashval, clp, open);
                if (sop == NULL)
-                       return nfserr_resource;
+                       return nfserr_jukebox;
                open->op_stateowner = sop;
        }
        list_del_init(&sop->so_close_lru);
@@ -2617,7 +2617,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp,
 
        stp = nfs4_alloc_stateid();
        if (stp == NULL)
-               return nfserr_resource;
+               return nfserr_jukebox;
 
        status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open);
        if (status) {
@@ -2848,7 +2848,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
                status = nfserr_bad_stateid;
                if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR)
                        goto out;
-               status = nfserr_resource;
+               status = nfserr_jukebox;
                fp = alloc_init_file(ino);
                if (fp == NULL)
                        goto out;
@@ -4033,7 +4033,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                /* XXX: Do we need to check for duplicate stateowners on
                 * the same file, or should they just be allowed (and
                 * create new stateids)? */
-               status = nfserr_resource;
+               status = nfserr_jukebox;
                lock_sop = alloc_init_lock_stateowner(strhashval,
                                open_sop->so_client, open_stp, lock);
                if (lock_sop == NULL)
@@ -4117,9 +4117,9 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        case (EDEADLK):
                status = nfserr_deadlock;
                break;
-       default:        
+       default:
                dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err);
-               status = nfserr_resource;
+               status = nfserrno(err);
                break;
        }
 out: