patch-2.4.21 linux-2.4.21/fs/nfsd/nfsfh.c
Next file: linux-2.4.21/fs/nfsd/nfsproc.c
Previous file: linux-2.4.21/fs/nfsd/nfs3xdr.c
Back to the patch index
Back to the overall index
- Lines: 33
- Date:
2003-06-13 07:51:37.000000000 -0700
- Orig file:
linux-2.4.20/fs/nfsd/nfsfh.c
- Orig date:
2002-11-28 15:53:15.000000000 -0800
diff -urN linux-2.4.20/fs/nfsd/nfsfh.c linux-2.4.21/fs/nfsd/nfsfh.c
@@ -620,6 +620,13 @@
switch (fh->fh_fileid_type) {
case 0:
dentry = dget(exp->ex_dentry);
+ /* need to revalidate the inode */
+ inode = dentry->d_inode;
+ if (inode->i_op && inode->i_op->revalidate)
+ if (inode->i_op->revalidate(dentry)) {
+ dput(dentry);
+ dentry = ERR_PTR(-ESTALE);
+ }
break;
default:
dentry = find_fh_dentry(exp->ex_dentry->d_inode->i_sb,
@@ -671,11 +678,16 @@
/* Type can be negative to e.g. exclude directories from linking */
if (type > 0 && (inode->i_mode & S_IFMT) != type) {
- error = (type == S_IFDIR)? nfserr_notdir : nfserr_isdir;
+ if (type == S_IFDIR)
+ error = nfserr_notdir;
+ else if ((inode->i_mode & S_IFMT) == S_IFDIR)
+ error = nfserr_isdir;
+ else
+ error = nfserr_inval;
goto out;
}
if (type < 0 && (inode->i_mode & S_IFMT) == -type) {
- error = (type == -S_IFDIR)? nfserr_notdir : nfserr_isdir;
+ error = (type == -S_IFDIR)? nfserr_isdir : nfserr_notdir;
goto out;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)