diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2012-09-29 00:56:15 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-09-29 00:56:15 -0400 |
commit | 1b65007e9870e0021397b548e8cd6bbc584f9152 (patch) | |
tree | 17cd144e9215ac7db9084f385c9c0d50e82b0bf6 /fs | |
parent | 1c9114f9c0f10f58dd7e568a7152025af47b27e5 (diff) |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/inode.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 0bfc6333146..05ab70dd5c6 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -4333,9 +4333,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
4333 | if (attr->ia_valid & ATTR_SIZE) { | 4333 | if (attr->ia_valid & ATTR_SIZE) { |
4334 | if (attr->ia_size != i_size_read(inode)) { | 4334 | if (attr->ia_size != i_size_read(inode)) { |
4335 | truncate_setsize(inode, attr->ia_size); | 4335 | truncate_setsize(inode, attr->ia_size); |
4336 | /* Inode size will be reduced, wait for dio in flight */ | 4336 | /* Inode size will be reduced, wait for dio in flight. |
4337 | if (orphan) | 4337 | * Temporarily disable dioread_nolock to prevent |
4338 | * livelock. */ | ||
4339 | if (orphan) { | ||
4340 | ext4_inode_block_unlocked_dio(inode); | ||
4338 | inode_dio_wait(inode); | 4341 | inode_dio_wait(inode); |
4342 | ext4_inode_resume_unlocked_dio(inode); | ||
4343 | } | ||
4339 | } | 4344 | } |
4340 | ext4_truncate(inode); | 4345 | ext4_truncate(inode); |
4341 | } | 4346 | } |