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

unlike v2/v3, nfsv4 returns nfserr_exist in some situations where the
underlying filesystem returns nfserr_isdir, nfserr_notdir.

on rename, nfsv4 returns nfserr_notdir instead of nfserr_symlink.

fs/nfsd/nfs4proc.c

index 1821092b2164961a052125c1138d8e930b7ec170..3a47421b1057a0fe13d57a47400371833cd5d246 100644 (file)
@@ -476,6 +476,18 @@ nfsd4_rename(struct svc_rqst *rqstp, struct svc_fh *current_fh,
        status = nfsd_rename(rqstp, save_fh, rename->rn_sname,
                             rename->rn_snamelen, current_fh,
                             rename->rn_tname, rename->rn_tnamelen);
+
+       /* the underlying filesystem returns different error's than required
+        * by NFSv4. both save_fh and current_fh have been verified.. */
+       if (status == nfserr_isdir)
+               status = nfserr_exist;
+       else if ((status == nfserr_notdir) &&
+                  (S_ISDIR(save_fh->fh_dentry->d_inode->i_mode) &&
+                   S_ISDIR(current_fh->fh_dentry->d_inode->i_mode)))
+               status = nfserr_exist;
+       else if (status == nfserr_symlink)
+               status = nfserr_notdir;
+
        if (!status) {
                set_change_info(&rename->rn_sinfo, current_fh);
                set_change_info(&rename->rn_tinfo, save_fh);