diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 82298c63ea6d..c7f77c643008 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -5625,25 +5625,22 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
5625 | up_write(&EXT4_I(inode)->i_data_sem); | 5625 | up_write(&EXT4_I(inode)->i_data_sem); |
5626 | ext4_journal_stop(handle); | 5626 | ext4_journal_stop(handle); |
5627 | if (error) { | 5627 | if (error) { |
5628 | if (orphan) | 5628 | if (orphan && inode->i_nlink) |
5629 | ext4_orphan_del(NULL, inode); | 5629 | ext4_orphan_del(NULL, inode); |
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); |