David Howells <[email protected]> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]