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: Track metadata bhs in fs-private inode part

Track metadata bhs for an inode in fs-private part of the inode. We need
the tracking only for nojournal mode so this is somewhat wasteful. We
can relatively easily make the mapping_metadata_bhs struct dynamically
allocated similarly to how we treat jbd2_inode but let's leave that for
ext4 specific series once the dust settles a bit.

Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20260326095354.16340-82-jack@suse.cz
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Jan Kara and committed by
Christian Brauner
41189b49 caaa184b

+10 -6
+1
fs/ext4/ext4.h
··· 1121 1121 struct rw_semaphore i_data_sem; 1122 1122 struct inode vfs_inode; 1123 1123 struct jbd2_inode *jinode; 1124 + struct mapping_metadata_bhs i_metadata_bhs; 1124 1125 1125 1126 /* 1126 1127 * File creation time. Its function is same as that of
+2 -1
fs/ext4/ext4_jbd2.c
··· 390 390 } 391 391 } else { 392 392 if (inode) 393 - mark_buffer_dirty_inode(bh, inode); 393 + mmb_mark_buffer_dirty(bh, 394 + &EXT4_I(inode)->i_metadata_bhs); 394 395 else 395 396 mark_buffer_dirty(bh); 396 397 if (inode && inode_needs_sync(inode)) {
+3 -2
fs/ext4/fsync.c
··· 68 68 * through ext4_evict_inode()) and so we are safe to flush 69 69 * metadata blocks and the inode. 70 70 */ 71 - ret = sync_mapping_buffers(inode->i_mapping); 71 + ret = mmb_sync(&EXT4_I(inode)->i_metadata_bhs); 72 72 if (ret) 73 73 break; 74 74 ret = sync_inode_metadata(inode, 1); ··· 85 85 struct inode *inode = file->f_inode; 86 86 int ret; 87 87 88 - ret = generic_buffers_fsync_noflush(file, start, end, datasync); 88 + ret = mmb_fsync_noflush(file, &EXT4_I(inode)->i_metadata_bhs, 89 + start, end, datasync); 89 90 if (!ret) 90 91 ret = ext4_sync_parent(inode); 91 92 if (test_opt(inode->i_sb, BARRIER))
+2 -2
fs/ext4/inode.c
··· 187 187 truncate_inode_pages_final(&inode->i_data); 188 188 /* Avoid mballoc special inode which has no proper iops */ 189 189 if (!EXT4_SB(inode->i_sb)->s_journal) 190 - sync_mapping_buffers(&inode->i_data); 190 + mmb_sync(&EXT4_I(inode)->i_metadata_bhs); 191 191 goto no_delete; 192 192 } 193 193 ··· 3436 3436 } 3437 3437 3438 3438 /* Any metadata buffers to write? */ 3439 - if (mmb_has_buffers(&inode->i_mapping->i_metadata_bhs)) 3439 + if (mmb_has_buffers(&EXT4_I(inode)->i_metadata_bhs)) 3440 3440 return true; 3441 3441 return inode_state_read_once(inode) & I_DIRTY_DATASYNC; 3442 3442 }
+2 -1
fs/ext4/super.c
··· 1428 1428 INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work); 1429 1429 ext4_fc_init_inode(&ei->vfs_inode); 1430 1430 spin_lock_init(&ei->i_fc_lock); 1431 + mmb_init(&ei->i_metadata_bhs, &ei->vfs_inode.i_data); 1431 1432 return &ei->vfs_inode; 1432 1433 } 1433 1434 ··· 1526 1525 { 1527 1526 ext4_fc_del(inode); 1528 1527 if (!EXT4_SB(inode->i_sb)->s_journal) 1529 - invalidate_inode_buffers(inode); 1528 + mmb_invalidate(&EXT4_I(inode)->i_metadata_bhs); 1530 1529 clear_inode(inode); 1531 1530 ext4_discard_preallocations(inode); 1532 1531 ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS);