[Concept,17/26] fs: ext4l: Allocate ext4_fs_context
Commit Message
From: Simon Glass <simon.glass@canonical.com>
Add allocation of ext4_fs_context structure which holds mount options
and will be needed for mounting the filesystem.
Move struct ext4_fs_context definition from super.c to ext4.h so it
can be used by interface.c.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
fs/ext4l/ext4.h | 29 +++++++++++++++++++++++++++++
fs/ext4l/interface.c | 17 ++++++++++++++++-
fs/ext4l/super.c | 31 +------------------------------
3 files changed, 46 insertions(+), 31 deletions(-)
@@ -2962,6 +2962,35 @@ extern int __init ext4_init_mballoc(void);
extern void ext4_exit_mballoc(void);
extern int __init ext4_init_es(void);
extern void ext4_exit_es(void);
+
+struct ext4_fs_context {
+ char *s_qf_names[EXT4_MAXQUOTAS];
+ struct fscrypt_dummy_policy dummy_enc_policy;
+ int s_jquota_fmt;
+ unsigned short qname_spec;
+ unsigned long vals_s_flags;
+ unsigned long mask_s_flags;
+ unsigned long journal_devnum;
+ unsigned long s_commit_interval;
+ unsigned long s_stripe;
+ unsigned int s_inode_readahead_blks;
+ unsigned int s_want_extra_isize;
+ unsigned int s_li_wait_mult;
+ unsigned int s_max_dir_size_kb;
+ unsigned int journal_ioprio;
+ unsigned int vals_s_mount_opt;
+ unsigned int mask_s_mount_opt;
+ unsigned int vals_s_mount_opt2;
+ unsigned int mask_s_mount_opt2;
+ unsigned int opt_flags;
+ unsigned int spec;
+ u32 s_max_batch_time;
+ u32 s_min_batch_time;
+ kuid_t s_resuid;
+ kgid_t s_resgid;
+ ext4_fsblk_t s_sb_block;
+};
+
extern ext4_group_t ext4_mb_prefetch(struct super_block *sb,
ext4_group_t group,
unsigned int nr, int *cnt);
@@ -26,6 +26,7 @@ static struct disk_partition ext4l_part;
int ext4l_probe(struct blk_desc *fs_dev_desc,
struct disk_partition *fs_partition)
{
+ struct ext4_fs_context *ctx;
struct super_block *sb;
struct fs_context *fc;
loff_t part_offset;
@@ -82,10 +83,21 @@ int ext4l_probe(struct blk_desc *fs_dev_desc,
goto err_free_mapping;
}
+ /* Allocate ext4_fs_context */
+ ctx = kzalloc(sizeof(struct ext4_fs_context), GFP_KERNEL);
+ if (!ctx) {
+ ret = -ENOMEM;
+ goto err_free_fc;
+ }
+
+ /* Initialise fs_context fields */
+ fc->fs_private = ctx;
+ fc->sb_flags |= SB_I_VERSION;
+
buf = malloc(BLOCK_SIZE + 512);
if (!buf) {
ret = -ENOMEM;
- goto err_free_fc;
+ goto err_free_ctx;
}
/* Calculate partition offset in bytes */
@@ -113,6 +125,7 @@ int ext4l_probe(struct blk_desc *fs_dev_desc,
memcpy(&ext4l_part, fs_partition, sizeof(ext4l_part));
free(buf);
+ kfree(ctx);
kfree(fc);
kfree(sb->s_bdev->bd_mapping);
kfree(sb->s_bdev);
@@ -122,6 +135,8 @@ int ext4l_probe(struct blk_desc *fs_dev_desc,
err_free_buf:
free(buf);
+err_free_ctx:
+ kfree(ctx);
err_free_fc:
kfree(fc);
err_free_mapping:
@@ -1926,36 +1926,7 @@ ext4_sb_read_encoding(const struct ext4_super_block *es)
#define EXT4_SPEC_s_sb_block (1 << 18)
#define EXT4_SPEC_mb_optimize_scan (1 << 19)
-struct ext4_fs_context {
- char *s_qf_names[EXT4_MAXQUOTAS];
- struct fscrypt_dummy_policy dummy_enc_policy;
- int s_jquota_fmt; /* Format of quota to use */
-#ifdef CONFIG_EXT4_DEBUG
- int s_fc_debug_max_replay;
-#endif
- unsigned short qname_spec;
- unsigned long vals_s_flags; /* Bits to set in s_flags */
- unsigned long mask_s_flags; /* Bits changed in s_flags */
- unsigned long journal_devnum;
- unsigned long s_commit_interval;
- unsigned long s_stripe;
- unsigned int s_inode_readahead_blks;
- unsigned int s_want_extra_isize;
- unsigned int s_li_wait_mult;
- unsigned int s_max_dir_size_kb;
- unsigned int journal_ioprio;
- unsigned int vals_s_mount_opt;
- unsigned int mask_s_mount_opt;
- unsigned int vals_s_mount_opt2;
- unsigned int mask_s_mount_opt2;
- unsigned int opt_flags; /* MOPT flags */
- unsigned int spec;
- u32 s_max_batch_time;
- u32 s_min_batch_time;
- kuid_t s_resuid;
- kgid_t s_resgid;
- ext4_fsblk_t s_sb_block;
-};
+/* struct ext4_fs_context is defined in ext4.h */
static void ext4_fc_free(struct fs_context *fc)
{