[Concept,17/26] fs: ext4l: Allocate ext4_fs_context

Message ID 20251222115639.700578-18-sjg@u-boot.org
State New
Headers
Series fs: ext4l: Add support for mounting ext4 filesystems (part G) |

Commit Message

Simon Glass Dec. 22, 2025, 11:56 a.m. UTC
  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(-)
  

Patch

diff --git a/fs/ext4l/ext4.h b/fs/ext4l/ext4.h
index 8fed7194d84..5c37fcd76f9 100644
--- a/fs/ext4l/ext4.h
+++ b/fs/ext4l/ext4.h
@@ -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);
diff --git a/fs/ext4l/interface.c b/fs/ext4l/interface.c
index b653b7ef981..20fdf3c908c 100644
--- a/fs/ext4l/interface.c
+++ b/fs/ext4l/interface.c
@@ -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:
diff --git a/fs/ext4l/super.c b/fs/ext4l/super.c
index 2a67c6d8156..af5b9b1986d 100644
--- a/fs/ext4l/super.c
+++ b/fs/ext4l/super.c
@@ -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)
 {