From: Jan Kara Date: Thu, 26 Mar 2026 09:54:33 +0000 (+0100) Subject: minix: Track metadata bhs in fs-private inode part X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=caaa184b424322beb9dfd05ec3485de665362c94;p=thirdparty%2Fkernel%2Flinux.git minix: Track metadata bhs in fs-private inode part Track metadata bhs for an inode in fs-private part of the inode. Signed-off-by: Jan Kara Link: https://patch.msgid.link/20260326095354.16340-81-jack@suse.cz Signed-off-by: Christian Brauner --- diff --git a/fs/minix/dir.c b/fs/minix/dir.c index a74d000327fa..361d26d87d2e 100644 --- a/fs/minix/dir.c +++ b/fs/minix/dir.c @@ -23,7 +23,7 @@ const struct file_operations minix_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, .iterate_shared = minix_readdir, - .fsync = generic_buffers_fsync, + .fsync = minix_fsync, }; /* diff --git a/fs/minix/file.c b/fs/minix/file.c index 282b3cd1fea3..86e5943cd2ff 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c @@ -7,8 +7,16 @@ * minix regular file handling primitives */ +#include #include "minix.h" +int minix_fsync(struct file *file, loff_t start, loff_t end, int datasync) +{ + return mmb_fsync(file, + &minix_i(file->f_mapping->host)->i_metadata_bhs, + start, end, datasync); +} + /* * We have mostly NULLs here: the current defaults are OK for * the minix filesystem. @@ -18,7 +26,7 @@ const struct file_operations minix_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap_prepare = generic_file_mmap_prepare, - .fsync = generic_buffers_fsync, + .fsync = minix_fsync, .splice_read = filemap_splice_read, }; diff --git a/fs/minix/inode.c b/fs/minix/inode.c index ab7c06efb139..63f378f38d43 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -49,9 +49,9 @@ static void minix_evict_inode(struct inode *inode) inode->i_size = 0; minix_truncate(inode); } else { - sync_mapping_buffers(&inode->i_data); + mmb_sync(&minix_i(inode)->i_metadata_bhs); } - invalidate_inode_buffers(inode); + mmb_invalidate(&minix_i(inode)->i_metadata_bhs); clear_inode(inode); if (!inode->i_nlink) minix_free_inode(inode); @@ -85,6 +85,8 @@ static struct inode *minix_alloc_inode(struct super_block *sb) ei = alloc_inode_sb(sb, minix_inode_cachep, GFP_KERNEL); if (!ei) return NULL; + mmb_init(&ei->i_metadata_bhs, &ei->vfs_inode.i_data); + return &ei->vfs_inode; } diff --git a/fs/minix/itree_common.c b/fs/minix/itree_common.c index dad131e30c05..c3cd2c75af9c 100644 --- a/fs/minix/itree_common.c +++ b/fs/minix/itree_common.c @@ -98,7 +98,7 @@ static int alloc_branch(struct inode *inode, *branch[n].p = branch[n].key; set_buffer_uptodate(bh); unlock_buffer(bh); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &minix_i(inode)->i_metadata_bhs); parent = nr; } if (n == num) @@ -135,7 +135,8 @@ static inline int splice_branch(struct inode *inode, /* had we spliced it onto indirect block? */ if (where->bh) - mark_buffer_dirty_inode(where->bh, inode); + mmb_mark_buffer_dirty(where->bh, + &minix_i(inode)->i_metadata_bhs); mark_inode_dirty(inode); return 0; @@ -328,14 +329,16 @@ static inline void truncate (struct inode * inode) if (partial == chain) mark_inode_dirty(inode); else - mark_buffer_dirty_inode(partial->bh, inode); + mmb_mark_buffer_dirty(partial->bh, + &minix_i(inode)->i_metadata_bhs); free_branches(inode, &nr, &nr+1, (chain+n-1) - partial); } /* Clear the ends of indirect blocks on the shared branch */ while (partial > chain) { free_branches(inode, partial->p + 1, block_end(partial->bh), (chain+n-1) - partial); - mark_buffer_dirty_inode(partial->bh, inode); + mmb_mark_buffer_dirty(partial->bh, + &minix_i(inode)->i_metadata_bhs); brelse (partial->bh); partial--; } diff --git a/fs/minix/minix.h b/fs/minix/minix.h index 7e1f652f16d3..f2025c9b5825 100644 --- a/fs/minix/minix.h +++ b/fs/minix/minix.h @@ -19,6 +19,7 @@ struct minix_inode_info { __u16 i1_data[16]; __u32 i2_data[16]; } u; + struct mapping_metadata_bhs i_metadata_bhs; struct inode vfs_inode; }; @@ -57,6 +58,8 @@ unsigned long minix_count_free_blocks(struct super_block *sb); int minix_getattr(struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int); int minix_prepare_chunk(struct folio *folio, loff_t pos, unsigned len); +struct mapping_metadata_bhs *minix_get_metadata_bhs(struct inode *inode); +int minix_fsync(struct file *file, loff_t start, loff_t end, int datasync); extern void V1_minix_truncate(struct inode *); extern void V2_minix_truncate(struct inode *);