diff options
Diffstat (limited to 'fs/ext4/move_extent.c')
-rw-r--r-- | fs/ext4/move_extent.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 9f2311bc9c4f..503ea15dc5db 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
@@ -273,6 +273,7 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, | |||
273 | int replaced_count = 0; | 273 | int replaced_count = 0; |
274 | int from = data_offset_in_page << orig_inode->i_blkbits; | 274 | int from = data_offset_in_page << orig_inode->i_blkbits; |
275 | int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; | 275 | int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; |
276 | struct super_block *sb = orig_inode->i_sb; | ||
276 | 277 | ||
277 | /* | 278 | /* |
278 | * It needs twice the amount of ordinary journal buffers because | 279 | * It needs twice the amount of ordinary journal buffers because |
@@ -405,10 +406,13 @@ unlock_pages: | |||
405 | page_cache_release(pagep[1]); | 406 | page_cache_release(pagep[1]); |
406 | stop_journal: | 407 | stop_journal: |
407 | ext4_journal_stop(handle); | 408 | ext4_journal_stop(handle); |
409 | if (*err == -ENOSPC && | ||
410 | ext4_should_retry_alloc(sb, &retries)) | ||
411 | goto again; | ||
408 | /* Buffer was busy because probably is pinned to journal transaction, | 412 | /* Buffer was busy because probably is pinned to journal transaction, |
409 | * force transaction commit may help to free it. */ | 413 | * force transaction commit may help to free it. */ |
410 | if (*err == -EBUSY && ext4_should_retry_alloc(orig_inode->i_sb, | 414 | if (*err == -EBUSY && retries++ < 4 && EXT4_SB(sb)->s_journal && |
411 | &retries)) | 415 | jbd2_journal_force_commit_nested(EXT4_SB(sb)->s_journal)) |
412 | goto again; | 416 | goto again; |
413 | return replaced_count; | 417 | return replaced_count; |
414 | 418 | ||