--- linux-2.4.24orig/include/linux/fs.h.orig 2006-07-21 13:03:15.000000000 +0300 +++ linux-2.4.24/include/linux/fs.h 2006-07-21 13:03:46.000000000 +0300 @@ -1128,6 +1128,8 @@ extern int open_namei_it(const char *fil extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, struct lookup_intent *it); extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); +struct dentry * lookup_one_len_getattr(const char * name, struct dentry * base, + int len); extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, struct lookup_intent *it); extern int filp_close(struct file *, fl_owner_t id); --- linux-2.4.24orig/fs/nfsd/vfs.c.orig 2006-07-21 12:52:07.000000000 +0300 +++ linux-2.4.24/fs/nfsd/vfs.c 2006-07-21 13:28:15.000000000 +0300 @@ -198,6 +198,30 @@ int revalidate_it(struct dentry *dentry, return err; } +struct dentry * lookup_one_len_getattr(const char * name, struct dentry * base, + int len) +{ + struct lookup_intent it; + struct dentry *de; + + intent_init(&it, IT_GETATTR, 0); + + de = lookup_one_len_it(name, base, len, NULL); + + if (!IS_ERR(de) && de->d_inode) { + if (de->d_inode->i_op && de->d_inode->i_op->revalidate_it) + de->d_inode->i_op->revalidate_it(de, &it); + else if (de->d_inode->i_op && de->d_inode->i_op->revalidate) + de->d_inode->i_op->revalidate(de); + } + + if (it.it_op_release) + intent_release(&it); + + return de; +} + + /* * Look up one component of a pathname. * N.B. After this call _both_ fhp and resfh need an fh_put @@ -263,7 +287,7 @@ nfsd_lookup(struct svc_rqst *rqstp, stru } } else { fh_lock(fhp); - dentry = lookup_one_len(name, dparent, len); + dentry = lookup_one_len_getattr(name, dparent, len); err = PTR_ERR(dentry); if (IS_ERR(dentry)) goto out_nfserr; --- linux-2.4.24orig/fs/nfsd/nfs3xdr.c.orig 2006-07-21 13:02:18.000000000 +0300 +++ linux-2.4.24/fs/nfsd/nfs3xdr.c 2006-07-21 13:02:29.000000000 +0300 @@ -715,7 +715,7 @@ encode_entry(struct readdir_cd *cd, cons dchild = dchild->d_parent; dchild = dget(dchild); } else - dchild = lookup_one_len(name, dparent,namlen); + dchild = lookup_one_len_getattr(name, dparent,namlen); if (IS_ERR(dchild)) goto noexec; if (fh_compose(&fh, exp, dchild, cd->dirfh) != 0 || !dchild->d_inode)