diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 82298c63ea6d..9bcb7f2b86dd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -5630,20 +5630,17 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
5630 | goto err_out; | 5630 | goto err_out; |
5631 | } | 5631 | } |
5632 | } | 5632 | } |
5633 | if (!shrink) | 5633 | if (!shrink) { |
5634 | pagecache_isize_extended(inode, oldsize, inode->i_size); | 5634 | pagecache_isize_extended(inode, oldsize, inode->i_size); |
5635 | 5635 | } else { | |
5636 | /* | 5636 | /* |
5637 | * Blocks are going to be removed from the inode. Wait | 5637 | * Blocks are going to be removed from the inode. Wait |
5638 | * for dio in flight. Temporarily disable | 5638 | * for dio in flight. |
5639 | * dioread_nolock to prevent livelock. | 5639 | */ |
5640 | */ | 5640 | inode_dio_wait(inode); |
5641 | if (orphan) { | ||
5642 | if (!ext4_should_journal_data(inode)) { | ||
5643 | inode_dio_wait(inode); | ||
5644 | } else | ||
5645 | ext4_wait_for_tail_page_commit(inode); | ||
5646 | } | 5641 | } |
5642 | if (orphan && ext4_should_journal_data(inode)) | ||
5643 | ext4_wait_for_tail_page_commit(inode); | ||
5647 | down_write(&EXT4_I(inode)->i_mmap_sem); | 5644 | down_write(&EXT4_I(inode)->i_mmap_sem); |
5648 | 5645 | ||
5649 | rc = ext4_break_layouts(inode); | 5646 | rc = ext4_break_layouts(inode); |