42 lines
1.4 KiB
Diff
42 lines
1.4 KiB
Diff
From ab7b8a329e12369d58e5fa59ba2e2c90370f12ef Mon Sep 17 00:00:00 2001
|
|
From: Dmitry Monakhov <dmonakhov@openvz.org>
|
|
Date: Sat, 29 Sep 2012 00:56:15 -0400
|
|
Subject: [PATCH 07/13] ext4: endless truncate due to nonlocked dio readers
|
|
|
|
If we have enough aggressive DIO readers, truncate and other dio
|
|
waiters will wait forever inside inode_dio_wait(). It is reasonable
|
|
to disable nonlock DIO read optimization during truncate.
|
|
|
|
Reviewed-by: Jan Kara <jack@suse.cz>
|
|
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
|
|
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
|
(cherry picked from commit 1b65007e9870e0021397b548e8cd6bbc584f9152)
|
|
---
|
|
fs/ext4/inode.c | 9 +++++++--
|
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
|
|
index b84322d..3b03dd6 100644
|
|
--- a/fs/ext4/inode.c
|
|
+++ b/fs/ext4/inode.c
|
|
@@ -4327,9 +4327,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
|
if (attr->ia_valid & ATTR_SIZE) {
|
|
if (attr->ia_size != i_size_read(inode)) {
|
|
truncate_setsize(inode, attr->ia_size);
|
|
- /* Inode size will be reduced, wait for dio in flight */
|
|
- if (orphan)
|
|
+ /* Inode size will be reduced, wait for dio in flight.
|
|
+ * Temporarily disable dioread_nolock to prevent
|
|
+ * livelock. */
|
|
+ if (orphan) {
|
|
+ ext4_inode_block_unlocked_dio(inode);
|
|
inode_dio_wait(inode);
|
|
+ ext4_inode_resume_unlocked_dio(inode);
|
|
+ }
|
|
}
|
|
ext4_truncate(inode);
|
|
}
|
|
--
|
|
1.7.12.rc0.22.gcdd159b
|
|
|