]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
minix: Track metadata bhs in fs-private inode part
authorJan Kara <jack@suse.cz>
Thu, 26 Mar 2026 09:54:33 +0000 (10:54 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 26 Mar 2026 14:03:32 +0000 (15:03 +0100)
Track metadata bhs for an inode in fs-private part of the inode.

Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20260326095354.16340-81-jack@suse.cz
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/minix/dir.c
fs/minix/file.c
fs/minix/inode.c
fs/minix/itree_common.c
fs/minix/minix.h

index a74d000327fa06b40df9d00ed04b01507d290fc4..361d26d87d2e2df980959dcb6a81847124df8a36 100644 (file)
@@ -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,
 };
 
 /*
index 282b3cd1fea32c2740313ebe0597bc300101a3ab..86e5943cd2ff74d755faaecb43aa9aef22c53329 100644 (file)
@@ -7,8 +7,16 @@
  *  minix regular file handling primitives
  */
 
+#include <linux/buffer_head.h>
 #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,
 };
 
index ab7c06efb13986d9e192ec2b362b8739f58b3fe8..63f378f38d436130db684adf651fbf18d179f44c 100644 (file)
@@ -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;
 }
 
index dad131e30c0590a4b1d7dfe338dad896a1f0b340..c3cd2c75af9ceee8f2b3efb3fdc24e73e8ddb602 100644 (file)
@@ -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--;
        }
index 7e1f652f16d311bc4b58de3dc2c76a00442c509d..f2025c9b58252f1027d78dbc42caecacece0161a 100644 (file)
@@ -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 *);