Re: [PATCH] vfs: add d_prune dentry operation

From: Sage Weil
Date: Tue Jul 26 2011 - 19:20:25 EST


Hi Al,

Any chance we can get this in 3.1-rc1? Not being able to use the dcache
fully isn't doing good things to our metadata performance.

sage



On Fri, 8 Jul 2011, Sage Weil wrote:

> This adds a d_prune dentry operation that is called by the VFS prior to
> pruning (i.e. unhashing and killing) a hashed dentry from the dcache. This
> allows the file system to maintain visibility into the contents and
> consistency of the dcache:
>
> - dentry eviction/pruning now calls into the fs
> - any modifications (unlink, rename, create, etc.) are protected by
> i_mutex and call into the fs
>
> This will be used by Ceph to maintain a flag indicating whether the
> complete contents of a directory are contained in the dcache, allowing it
> to satisfy lookups and readdir with cached results without additional
> server communication.
>
> Signed-off-by: Sage Weil <sage@xxxxxxxxxxxx>
> ---
> Documentation/filesystems/Locking | 1 +
> fs/dcache.c | 8 ++++++++
> include/linux/dcache.h | 3 +++
> 3 files changed, 12 insertions(+), 0 deletions(-)
>
> diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
> index 57d827d..b3fa7c8 100644
> --- a/Documentation/filesystems/Locking
> +++ b/Documentation/filesystems/Locking
> @@ -29,6 +29,7 @@ d_hash no no no maybe
> d_compare: yes no no maybe
> d_delete: no yes no no
> d_release: no no yes no
> +d_prune: no yes no no
> d_iput: no no yes no
> d_dname: no no no no
> d_automount: no no yes no
> diff --git a/fs/dcache.c b/fs/dcache.c
> index 37f72ee..74d1a30 100644
> --- a/fs/dcache.c
> +++ b/fs/dcache.c
> @@ -673,6 +673,8 @@ static void try_prune_one_dentry(struct dentry *dentry)
> spin_unlock(&dentry->d_lock);
> return;
> }
> + if (dentry->d_flags & DCACHE_OP_PRUNE)
> + dentry->d_op->d_prune(dentry);
> dentry = dentry_kill(dentry, 1);
> }
> }
> @@ -879,6 +881,8 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
>
> /* detach this root from the system */
> spin_lock(&dentry->d_lock);
> + if (dentry->d_flags & DCACHE_OP_PRUNE)
> + dentry->d_op->d_prune(dentry);
> dentry_lru_del(dentry);
> __d_drop(dentry);
> spin_unlock(&dentry->d_lock);
> @@ -895,6 +899,8 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
> d_u.d_child) {
> spin_lock_nested(&loop->d_lock,
> DENTRY_D_LOCK_NESTED);
> + if (dentry->d_flags & DCACHE_OP_PRUNE)
> + dentry->d_op->d_prune(dentry);
> dentry_lru_del(loop);
> __d_drop(loop);
> spin_unlock(&loop->d_lock);
> @@ -1363,6 +1369,8 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
> dentry->d_flags |= DCACHE_OP_REVALIDATE;
> if (op->d_delete)
> dentry->d_flags |= DCACHE_OP_DELETE;
> + if (op->d_prune)
> + dentry->d_flags |= DCACHE_OP_PRUNE;
>
> }
> EXPORT_SYMBOL(d_set_d_op);
> diff --git a/include/linux/dcache.h b/include/linux/dcache.h
> index 19d90a5..681f46f 100644
> --- a/include/linux/dcache.h
> +++ b/include/linux/dcache.h
> @@ -165,6 +165,7 @@ struct dentry_operations {
> unsigned int, const char *, const struct qstr *);
> int (*d_delete)(const struct dentry *);
> void (*d_release)(struct dentry *);
> + void (*d_prune)(struct dentry *);
> void (*d_iput)(struct dentry *, struct inode *);
> char *(*d_dname)(struct dentry *, char *, int);
> struct vfsmount *(*d_automount)(struct path *);
> @@ -219,6 +220,8 @@ struct dentry_operations {
> #define DCACHE_MANAGED_DENTRY \
> (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
>
> +#define DCACHE_OP_PRUNE 0x80000
> +
> extern seqlock_t rename_lock;
>
> static inline int dname_external(struct dentry *dentry)
> --
> 1.7.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/