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-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html