aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2013-07-15 12:27:47 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-07-15 12:27:47 -0400
commit76828c882630ced08b5ddce22cc0095b05de9bc5 (patch)
tree1c053fd00116bfd578ccf6ec8b7b38e236ed14c9 /fs
parentext4: make the extent_status code more robust against ENOMEM failures (diff)
downloadlinux-dev-76828c882630ced08b5ddce22cc0095b05de9bc5.tar.xz
linux-dev-76828c882630ced08b5ddce22cc0095b05de9bc5.zip
ext4: yield during large unlinks
During large unlink operations on files with extents, we can use a lot of CPU time. This adds a cond_resched() call when starting to examine the next level of a multi-level extent tree. Multi-level extent trees are rare in the first place, and this should rarely be executed. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/extents.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 593091537e76..cfdc51e30257 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2835,6 +2835,9 @@ again:
err = -EIO;
break;
}
+ /* Yield here to deal with large extent trees.
+ * Should be a no-op if we did IO above. */
+ cond_resched();
if (WARN_ON(i + 1 > depth)) {
err = -EIO;
break;