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

Configure Feed

Select the types of activity you want to include in your feed.

ext4: use jbd2 jinode dirty range accessor

ext4 journal commit callbacks access jbd2_inode dirty range fields without
holding journal->j_list_lock.
Use jbd2_jinode_get_dirty_range() to get the range in bytes, and read
i_transaction with READ_ONCE() in the redirty check.

Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Li Chen <me@linux.beauty>
Link: https://patch.msgid.link/20260306085643.465275-3-me@linux.beauty
Signed-off-by: Theodore Ts'o <tytso@mit.edu>

authored by

Li Chen and committed by
Theodore Ts'o
660d2366 5267f6ef

+19 -7
+8 -2
fs/ext4/inode.c
··· 3055 3055 3056 3056 int ext4_normal_submit_inode_data_buffers(struct jbd2_inode *jinode) 3057 3057 { 3058 + loff_t range_start, range_end; 3058 3059 struct writeback_control wbc = { 3059 3060 .sync_mode = WB_SYNC_ALL, 3060 3061 .nr_to_write = LONG_MAX, 3061 - .range_start = jinode->i_dirty_start, 3062 - .range_end = jinode->i_dirty_end, 3063 3062 }; 3064 3063 struct mpage_da_data mpd = { 3065 3064 .inode = jinode->i_vfs_inode, 3066 3065 .wbc = &wbc, 3067 3066 .can_map = 0, 3068 3067 }; 3068 + 3069 + if (!jbd2_jinode_get_dirty_range(jinode, &range_start, &range_end)) 3070 + return 0; 3071 + 3072 + wbc.range_start = range_start; 3073 + wbc.range_end = range_end; 3074 + 3069 3075 return ext4_do_writepages(&mpd); 3070 3076 } 3071 3077
+11 -5
fs/ext4/super.c
··· 521 521 { 522 522 struct buffer_head *bh, *head; 523 523 struct journal_head *jh; 524 + transaction_t *trans = READ_ONCE(jinode->i_transaction); 524 525 525 526 bh = head = folio_buffers(folio); 526 527 do { ··· 540 539 */ 541 540 jh = bh2jh(bh); 542 541 if (buffer_dirty(bh) || 543 - (jh && (jh->b_transaction != jinode->i_transaction || 542 + (jh && (jh->b_transaction != trans || 544 543 jh->b_next_transaction))) 545 544 return true; 546 545 } while ((bh = bh->b_this_page) != head); ··· 551 550 static int ext4_journalled_submit_inode_data_buffers(struct jbd2_inode *jinode) 552 551 { 553 552 struct address_space *mapping = jinode->i_vfs_inode->i_mapping; 553 + loff_t range_start, range_end; 554 554 struct writeback_control wbc = { 555 - .sync_mode = WB_SYNC_ALL, 555 + .sync_mode = WB_SYNC_ALL, 556 556 .nr_to_write = LONG_MAX, 557 - .range_start = jinode->i_dirty_start, 558 - .range_end = jinode->i_dirty_end, 559 - }; 557 + }; 560 558 struct folio *folio = NULL; 561 559 int error; 560 + 561 + if (!jbd2_jinode_get_dirty_range(jinode, &range_start, &range_end)) 562 + return 0; 563 + 564 + wbc.range_start = range_start; 565 + wbc.range_end = range_end; 562 566 563 567 /* 564 568 * writeback_iter() already checks for dirty pages and calls