Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: use jbd2_inode dirty range scoping

Use the newly introduced jbd2_inode dirty range scoping to prevent us
from waiting forever when trying to complete a journal transaction.

Signed-off-by: Ross Zwisler <zwisler@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: stable@vger.kernel.org

authored by

Ross Zwisler and committed by
Theodore Ts'o
73131fbb 6ba0e7dc

+18 -10
+6 -6
fs/ext4/ext4_jbd2.h
··· 361 361 } 362 362 363 363 static inline int ext4_jbd2_inode_add_write(handle_t *handle, 364 - struct inode *inode) 364 + struct inode *inode, loff_t start_byte, loff_t length) 365 365 { 366 366 if (ext4_handle_valid(handle)) 367 - return jbd2_journal_inode_add_write(handle, 368 - EXT4_I(inode)->jinode); 367 + return jbd2_journal_inode_ranged_write(handle, 368 + EXT4_I(inode)->jinode, start_byte, length); 369 369 return 0; 370 370 } 371 371 372 372 static inline int ext4_jbd2_inode_add_wait(handle_t *handle, 373 - struct inode *inode) 373 + struct inode *inode, loff_t start_byte, loff_t length) 374 374 { 375 375 if (ext4_handle_valid(handle)) 376 - return jbd2_journal_inode_add_wait(handle, 377 - EXT4_I(inode)->jinode); 376 + return jbd2_journal_inode_ranged_wait(handle, 377 + EXT4_I(inode)->jinode, start_byte, length); 378 378 return 0; 379 379 } 380 380
+10 -3
fs/ext4/inode.c
··· 731 731 !(flags & EXT4_GET_BLOCKS_ZERO) && 732 732 !ext4_is_quota_file(inode) && 733 733 ext4_should_order_data(inode)) { 734 + loff_t start_byte = 735 + (loff_t)map->m_lblk << inode->i_blkbits; 736 + loff_t length = (loff_t)map->m_len << inode->i_blkbits; 737 + 734 738 if (flags & EXT4_GET_BLOCKS_IO_SUBMIT) 735 - ret = ext4_jbd2_inode_add_wait(handle, inode); 739 + ret = ext4_jbd2_inode_add_wait(handle, inode, 740 + start_byte, length); 736 741 else 737 - ret = ext4_jbd2_inode_add_write(handle, inode); 742 + ret = ext4_jbd2_inode_add_write(handle, inode, 743 + start_byte, length); 738 744 if (ret) 739 745 return ret; 740 746 } ··· 4091 4085 err = 0; 4092 4086 mark_buffer_dirty(bh); 4093 4087 if (ext4_should_order_data(inode)) 4094 - err = ext4_jbd2_inode_add_write(handle, inode); 4088 + err = ext4_jbd2_inode_add_write(handle, inode, from, 4089 + length); 4095 4090 } 4096 4091 4097 4092 unlock:
+2 -1
fs/ext4/move_extent.c
··· 390 390 391 391 /* Even in case of data=writeback it is reasonable to pin 392 392 * inode to transaction, to prevent unexpected data loss */ 393 - *err = ext4_jbd2_inode_add_write(handle, orig_inode); 393 + *err = ext4_jbd2_inode_add_write(handle, orig_inode, 394 + (loff_t)orig_page_offset << PAGE_SHIFT, replaced_size); 394 395 395 396 unlock_pages: 396 397 unlock_page(pagep[0]);