Re: [PATCH] Destroy the dentries contributed by a superblock onunmounting

From: Andrew Morton
Date: Tue Jun 27 2006 - 18:51:19 EST


David Howells <dhowells@xxxxxxxxxx> wrote:
>
>
> The attached patch destroys all the dentries attached to a superblock in one go
> /*
> + * destroy a single subtree of dentries for unmount
> + * - see the comments on shrink_dcache_for_umount() for a description of the
> + * locking
> + */
> +static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
> +{
> + struct dentry *parent;
> +
> + BUG_ON(!IS_ROOT(dentry));
> +
> + /* detach this root from the system */
> + spin_lock(&dcache_lock);
> + if (!list_empty(&dentry->d_lru)) {
> + dentry_stat.nr_unused--;
> + list_del_init(&dentry->d_lru);
> + }
> + __d_drop(dentry);
> + spin_unlock(&dcache_lock);
> +
> + for (;;) {
> + /* descend to the first leaf in the current subtree */
> + while (!list_empty(&dentry->d_subdirs)) {
> + struct dentry *loop;
> +
> + /* this is a branch with children - detach all of them
> + * from the system in one go */
> + spin_lock(&dcache_lock);
> + list_for_each_entry(loop, &dentry->d_subdirs,
> + d_u.d_child) {
> + if (!list_empty(&loop->d_lru)) {
> + dentry_stat.nr_unused--;
> + list_del_init(&loop->d_lru);
> + }
> +
> + __d_drop(loop);
> + cond_resched_lock(&dcache_lock);
> + }
> + spin_unlock(&dcache_lock);

Is the cond_resched_lock() here safe? Once we've dropped that lock, the
list cursor `loop' is invalidated?

If all lookup paths to all entries on this list are removed at this time
then OK - but these dentries are still on the LRU..

(An answer-via-comment-patch would suit ;))

-
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/