Track metadata bhs for an inode in fs-private part of the inode. Signed-off-by: Jan Kara --- fs/fat/fat.h | 2 ++ fs/fat/file.c | 1 + fs/fat/inode.c | 12 ++++++++++++ fs/fat/namei_msdos.c | 1 + fs/fat/namei_vfat.c | 1 + 5 files changed, 17 insertions(+) diff --git a/fs/fat/fat.h b/fs/fat/fat.h index 0d269dba897b..2b2f6ad32f24 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h @@ -130,6 +130,7 @@ struct msdos_inode_info { struct hlist_node i_dir_hash; /* hash by i_logstart */ struct rw_semaphore truncate_lock; /* protect bmap against truncate */ struct timespec64 i_crtime; /* File creation (birth) time */ + struct mapping_metadata_bhs i_metadata_bhs; struct inode vfs_inode; }; @@ -424,6 +425,7 @@ extern int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de); extern int fat_flush_inodes(struct super_block *sb, struct inode *i1, struct inode *i2); +struct mapping_metadata_bhs *fat_get_metadata_bhs(struct inode *inode); extern const struct fs_parameter_spec fat_param_spec[]; int fat_init_fs_context(struct fs_context *fc, bool is_vfat); diff --git a/fs/fat/file.c b/fs/fat/file.c index 124d9c5431c8..da21636d3874 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -574,4 +574,5 @@ const struct inode_operations fat_file_inode_operations = { .setattr = fat_setattr, .getattr = fat_getattr, .update_time = fat_update_time, + .get_metadata_bhs = fat_get_metadata_bhs, }; diff --git a/fs/fat/inode.c b/fs/fat/inode.c index ce88602b0d57..8561b8be5ca2 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -763,6 +763,7 @@ static struct inode *fat_alloc_inode(struct super_block *sb) ei->i_pos = 0; ei->i_crtime.tv_sec = 0; ei->i_crtime.tv_nsec = 0; + mmb_init(&ei->i_metadata_bhs); return &ei->vfs_inode; } @@ -807,6 +808,12 @@ static void __exit fat_destroy_inodecache(void) kmem_cache_destroy(fat_inode_cachep); } +struct mapping_metadata_bhs *fat_get_metadata_bhs(struct inode *inode) +{ + return &MSDOS_I(inode)->i_metadata_bhs; +} +EXPORT_SYMBOL_GPL(fat_get_metadata_bhs); + int fat_reconfigure(struct fs_context *fc) { bool new_rdonly; @@ -1531,6 +1538,10 @@ static int fat_read_static_bpb(struct super_block *sb, return error; } +static const struct inode_operations fat_table_inode_operations = { + .get_metadata_bhs = fat_get_metadata_bhs, +}; + /* * Read the super block of an MS-DOS FS. */ @@ -1806,6 +1817,7 @@ int fat_fill_super(struct super_block *sb, struct fs_context *fc, fat_inode = new_inode(sb); if (!fat_inode) goto out_fail; + fat_inode->i_op = &fat_table_inode_operations; sbi->fat_inode = fat_inode; fsinfo_inode = new_inode(sb); diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 048c103b506a..1526b8910d51 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c @@ -643,6 +643,7 @@ static const struct inode_operations msdos_dir_inode_operations = { .setattr = fat_setattr, .getattr = fat_getattr, .update_time = fat_update_time, + .get_metadata_bhs = fat_get_metadata_bhs, }; static void setup(struct super_block *sb) diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 87dcdd86272b..ca5e0e9822a6 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -1186,6 +1186,7 @@ static const struct inode_operations vfat_dir_inode_operations = { .setattr = fat_setattr, .getattr = fat_getattr, .update_time = fat_update_time, + .get_metadata_bhs = fat_get_metadata_bhs, }; static void setup(struct super_block *sb) -- 2.51.0