Skip to content

Commit 43c1c9c

Browse files
dhowellsAl Viro
authored and
Al Viro
committed
VFS: Reorganise shrink_dcache_for_umount_subtree() after demise of dcache_lock
Reorganise shrink_dcache_for_umount_subtree() in light of the demise of dcache_lock. Without that dcache_lock, there is no need for the batching of removal of dentries from the system under it (we wanted to make intensive use of the locked data whilst we held it, but didn't want to hold it for long at a time). This works, provided the preceding patch is correct in its removal of locking on dentry->d_lock on the basis that no one should be locking these dentries any more as the whole superblock is defunct. With this patch, the calls to dentry_lru_del() and __d_shrink() are placed at the point where each dentry is detached handled. It is possible that, as an alternative, the batching should still be done - but only for dentry_lru_del() of all a dentry's children in one go. In such a case, the batching would be done under dcache_lru_lock. Signed-off-by: David Howells <[email protected]> Signed-off-by: Al Viro <[email protected]>
1 parent c6627c6 commit 43c1c9c

File tree

1 file changed

+5
-17
lines changed

1 file changed

+5
-17
lines changed

fs/dcache.c

+5-17
Original file line numberDiff line numberDiff line change
@@ -842,33 +842,21 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
842842

843843
BUG_ON(!IS_ROOT(dentry));
844844

845-
/* detach this root from the system */
846-
dentry_lru_del(dentry);
847-
__d_shrink(dentry);
848-
849845
for (;;) {
850846
/* descend to the first leaf in the current subtree */
851-
while (!list_empty(&dentry->d_subdirs)) {
852-
struct dentry *loop;
853-
854-
/* this is a branch with children - detach all of them
855-
* from the system in one go */
856-
list_for_each_entry(loop, &dentry->d_subdirs,
857-
d_u.d_child) {
858-
dentry_lru_del(loop);
859-
__d_shrink(loop);
860-
}
861-
862-
/* move to the first child */
847+
while (!list_empty(&dentry->d_subdirs))
863848
dentry = list_entry(dentry->d_subdirs.next,
864849
struct dentry, d_u.d_child);
865-
}
866850

867851
/* consume the dentries from this leaf up through its parents
868852
* until we find one with children or run out altogether */
869853
do {
870854
struct inode *inode;
871855

856+
/* detach from the system */
857+
dentry_lru_del(dentry);
858+
__d_shrink(dentry);
859+
872860
if (dentry->d_count != 0) {
873861
printk(KERN_ERR
874862
"BUG: Dentry %p{i=%lx,n=%s}"

0 commit comments

Comments
 (0)