The attached patch adds a new directory cache management function that prepares a disconnected anonymous function to be connected into the dentry tree. The anonymous dentry is transferred the name and parentage from another dentry. Signed-Off-By: David Howells <dhowells@xxxxxxxxxx> --- warthog>diffstat -p1 materialise-dentry-2616rc4.diff fs/dcache.c | 18 ++++++++++++++++++ include/linux/dcache.h | 1 + 2 files changed, 19 insertions(+) diff -uNrp linux-2.6.16-rc4-getsb/include/linux/dcache.h linux-2.6.16-rc4-getsb-nfs/include/linux/dcache.h --- linux-2.6.16-rc4-getsb/include/linux/dcache.h 2006-02-22 17:00:41.000000000 +0000 +++ linux-2.6.16-rc4-getsb-nfs/include/linux/dcache.h 2006-02-22 17:34:57.000000000 +0000 @@ -208,6 +208,7 @@ static inline int dname_external(struct extern void d_instantiate(struct dentry *, struct inode *); extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *); extern void d_delete(struct dentry *); +extern void d_materialise_dentry(struct dentry *, struct dentry *); /* allocate/de-allocate */ extern struct dentry * d_alloc(struct dentry *, const struct qstr *); diff -uNrp linux-2.6.16-rc4-getsb/fs/dcache.c linux-2.6.16-rc4-getsb-nfs/fs/dcache.c --- linux-2.6.16-rc4-getsb/fs/dcache.c 2006-02-22 17:00:36.000000000 +0000 +++ linux-2.6.16-rc4-getsb-nfs/fs/dcache.c 2006-02-22 17:34:57.000000000 +0000 @@ -1345,6 +1345,23 @@ already_unhashed: } /** + * d_materialise_dentry - connect a disconnected dentry into the tree + * @dentry: dentry to replace + * @anon: dentry to place into the tree + * + * Prepare an anonymous dentry for life in the superblock's dentry tree as a + * named dentry in place of the dentry to be replaced. + */ +void d_materialise_dentry(struct dentry *dentry, struct dentry *anon) +{ + switch_names(dentry, anon); + do_switch(dentry->d_name.len, anon->d_name.len); + do_switch(dentry->d_name.hash, anon->d_name.hash); + do_switch(dentry->d_parent, anon->d_parent); + anon->d_flags &= ~DCACHE_DISCONNECTED; +} + +/** * d_path - return the path of a dentry * @dentry: dentry to report * @vfsmnt: vfsmnt to which the dentry belongs @@ -1755,6 +1772,7 @@ EXPORT_SYMBOL(d_instantiate); EXPORT_SYMBOL(d_invalidate); EXPORT_SYMBOL(d_lookup); EXPORT_SYMBOL(d_move); +EXPORT_SYMBOL_GPL(d_materialise_dentry); EXPORT_SYMBOL(d_path); EXPORT_SYMBOL(d_prune_aliases); EXPORT_SYMBOL(d_rehash);