]> git.hungrycats.org Git - linux/commitdiff
[PATCH] kNFSd: correct symlink related error returns.
authorAndrew Morton <akpm@osdl.org>
Thu, 26 Feb 2004 14:48:26 +0000 (06:48 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 26 Feb 2004 14:48:26 +0000 (06:48 -0800)
From: NeilBrown <neilb@cse.unsw.edu.au>

unlike v2/v3, nfsv4 returns nfserr_inval when attempting to read, write,
commit or test lock a symlink.  nfsv4 does return nfserr_symlink on lookup
and open, so a simple fix in fh_verify() will not work.

fs/nfsd/nfs4proc.c
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c

index 7fdaa1ef51422c62f5e8d09bb33ef80aa04474bd..1821092b2164961a052125c1138d8e930b7ec170 100644 (file)
@@ -224,11 +224,16 @@ nfsd4_access(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_acc
 static inline int
 nfsd4_commit(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_commit *commit)
 {
+       int status;
+
        u32 *p = (u32 *)commit->co_verf.data;
        *p++ = nfssvc_boot.tv_sec;
        *p++ = nfssvc_boot.tv_usec;
 
-       return nfsd_commit(rqstp, current_fh, commit->co_offset, commit->co_count);
+       status = nfsd_commit(rqstp, current_fh, commit->co_offset, commit->co_count);
+       if (status == nfserr_symlink)
+               status = nfserr_inval;
+       return status;
 }
 
 static inline int
@@ -558,9 +563,12 @@ zero_stateid:
        *p++ = nfssvc_boot.tv_sec;
        *p++ = nfssvc_boot.tv_usec;
 
-       return (nfsd_write(rqstp, current_fh, write->wr_offset,
+       status =  nfsd_write(rqstp, current_fh, write->wr_offset,
                          write->wr_vec, write->wr_vlen, write->wr_buflen,
-                         &write->wr_how_written));
+                         &write->wr_how_written);
+       if (status == nfserr_symlink)
+               status = nfserr_inval;
+       return status;
 out:
        nfs4_unlock_state();
        return status;
index c60449aec0b1c264635cb984a177721871b2d2fd..f92464da97b1cffdf594ab4d33b5b48630b701a2 100644 (file)
@@ -1974,6 +1974,8 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
 
        if ((status = fh_verify(rqstp, current_fh, S_IFREG, 0))) {
                printk("NFSD: nfsd4_lockt: fh_verify() failed!\n");
+               if (status == nfserr_symlink)
+                       status = nfserr_inval;
                goto out;
        }
 
index d69ef5af8c9c1938511ecbaa7052049ce3923a5c..3ced62b6031a0f7a443a81a59c8655473f61abbc 100644 (file)
@@ -2005,6 +2005,8 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_read
                           read->rd_offset,
                           read->rd_iov, read->rd_vlen,
                           &maxcount);
+       if (nfserr == nfserr_symlink)
+               nfserr = nfserr_inval;
        if (nfserr)
                return nfserr;
        eof = (read->rd_offset + maxcount >= read->rd_fhp->fh_dentry->d_inode->i_size);