--- linux-2.4.19-NFS_ALL/fs/nfs/dir.c.orig Fri Mar 1 15:41:54 2002 +++ linux-2.4.19-NFS_ALL/fs/nfs/dir.c Mon Mar 4 17:20:19 2002 @@ -760,6 +760,12 @@ struct inode *inode; int error = -EACCES; + if (fhandle->size == 0 || !(fattr->valid & NFS_ATTR_FATTR)) { + struct inode *dir = dentry->d_parent->d_inode; + error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr); + if (error) + goto out_err; + } inode = nfs_fhget(dentry, fhandle, fattr); if (inode) { d_instantiate(dentry, inode); @@ -767,6 +773,9 @@ error = 0; } return error; +out_err: + d_drop(dentry); + return error; } /* @@ -797,9 +806,9 @@ nfs_zap_caches(dir); error = NFS_PROTO(dir)->create(dir, &dentry->d_name, &attr, 0, &fhandle, &fattr); - if (!error && fhandle.size != 0) + if (!error) error = nfs_instantiate(dentry, &fhandle, &fattr); - if (error || fhandle.size == 0) + else d_drop(dentry); return error; } @@ -823,9 +832,9 @@ nfs_zap_caches(dir); error = NFS_PROTO(dir)->mknod(dir, &dentry->d_name, &attr, rdev, &fhandle, &fattr); - if (!error && fhandle.size != 0) + if (!error) error = nfs_instantiate(dentry, &fhandle, &fattr); - if (error || fhandle.size == 0) + else d_drop(dentry); return error; } @@ -858,9 +867,9 @@ nfs_zap_caches(dir); error = NFS_PROTO(dir)->mkdir(dir, &dentry->d_name, &attr, &fhandle, &fattr); - if (!error && fhandle.size != 0) + if (!error) error = nfs_instantiate(dentry, &fhandle, &fattr); - if (error || fhandle.size == 0) + else d_drop(dentry); return error; } @@ -1057,7 +1066,7 @@ nfs_zap_caches(dir); error = NFS_PROTO(dir)->symlink(dir, &dentry->d_name, &qsymname, &attr, &sym_fh, &sym_attr); - if (!error && sym_fh.size != 0 && (sym_attr.valid & NFS_ATTR_FATTR)) { + if (!error) { error = nfs_instantiate(dentry, &sym_fh, &sym_attr); } else { if (error == -EEXIST)