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>
This commit is contained in:
Родитель
1c9114f9c0
Коммит
1b65007e98
|
@ -4333,9 +4333,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
||||||
if (attr->ia_valid & ATTR_SIZE) {
|
if (attr->ia_valid & ATTR_SIZE) {
|
||||||
if (attr->ia_size != i_size_read(inode)) {
|
if (attr->ia_size != i_size_read(inode)) {
|
||||||
truncate_setsize(inode, attr->ia_size);
|
truncate_setsize(inode, attr->ia_size);
|
||||||
/* Inode size will be reduced, wait for dio in flight */
|
/* Inode size will be reduced, wait for dio in flight.
|
||||||
if (orphan)
|
* Temporarily disable dioread_nolock to prevent
|
||||||
|
* livelock. */
|
||||||
|
if (orphan) {
|
||||||
|
ext4_inode_block_unlocked_dio(inode);
|
||||||
inode_dio_wait(inode);
|
inode_dio_wait(inode);
|
||||||
|
ext4_inode_resume_unlocked_dio(inode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ext4_truncate(inode);
|
ext4_truncate(inode);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче