diff -urN -X dontdiff linux/fs/nfsd/nfsfh.c nfsd/fs/nfsd/nfsfh.c --- linux/fs/nfsd/nfsfh.c Tue Jul 11 19:26:50 2000 +++ nfsd/fs/nfsd/nfsfh.c Fri Jul 14 23:01:20 2000 @@ -134,7 +134,14 @@ struct inode *inode; struct list_head *lp; struct dentry *result; - inode = iget(sb, ino); + void (*__iput)(struct inode *); + + __iput = sb->s_op->nfsd_iput ? : iput; + if (sb->s_op->nfsd_iget) + inode = sb->s_op->nfsd_iget(sb, ino); + else + inode = iget(sb, ino); + if (is_bad_inode(inode) || (generation && inode->i_generation != generation) ) { @@ -145,7 +152,7 @@ inode->i_generation, generation); - iput(inode); + __iput(inode); return ERR_PTR(-ESTALE); } /* now to find a dentry. @@ -157,14 +164,14 @@ if (! (result->d_flags & DCACHE_NFSD_DISCONNECTED)) { dget_locked(result); spin_unlock(&dcache_lock); - iput(inode); + __iput(inode); return result; } } spin_unlock(&dcache_lock); result = d_alloc_root(inode); if (result == NULL) { - iput(inode); + __iput(inode); return ERR_PTR(-ENOMEM); } result->d_flags |= DCACHE_NFSD_DISCONNECTED; diff -urN -X dontdiff linux/include/linux/fs.h nfsd/include/linux/fs.h --- linux/include/linux/fs.h Tue Jul 11 19:26:51 2000 +++ nfsd/include/linux/fs.h Fri Jul 14 23:01:25 2000 @@ -769,6 +769,8 @@ int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); + struct inode * (*nfsd_iget)(struct super_block *, unsigned long); + void (*nfsd_iput)(struct inode *); }; struct dquot_operations {