[Concept,7/9] fs: ext4l: Align ialloc.c, inode.c et al with Linux

Message ID 20260107234426.3508161-8-sjg@u-boot.org
State New
Headers
Series Align ext4l with Linux kernel v6.19 implementation |

Commit Message

Simon Glass Jan. 7, 2026, 11:44 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Apply several small fixes to align with the Linux kernel ext4 code:

- readpage.c: Use EXT4_PG_TO_LBLK macro instead of inline shifts for
  block calculations, matching the macro added in an earlier commit
- xattr.c: Add error handling for ext4_get_inode_loc() call in
  ext4_xattr_inode_dec_ref_all()
- ioctl.c: Add strnlen check for mount_opts to prevent reading past
  the buffer end
- ialloc.c, inode.c: Remove ext4_clear_state_flags() calls which were
  removed in upstream Linux (the subsequent ext4_set_inode_state()
  handles the initialization)

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 fs/ext4l/ialloc.c   | 1 -
 fs/ext4l/inode.c    | 1 -
 fs/ext4l/ioctl.c    | 4 ++++
 fs/ext4l/readpage.c | 7 ++-----
 fs/ext4l/xattr.c    | 6 +++++-
 5 files changed, 11 insertions(+), 8 deletions(-)
  

Patch

diff --git a/fs/ext4l/ialloc.c b/fs/ext4l/ialloc.c
index 5bbe8d6d359..baef744892b 100644
--- a/fs/ext4l/ialloc.c
+++ b/fs/ext4l/ialloc.c
@@ -1279,7 +1279,6 @@  got:
 		ei->i_csum_seed = ext4_chksum(csum, (__u8 *)&gen, sizeof(gen));
 	}
 
-	ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */
 	ext4_set_inode_state(inode, EXT4_STATE_NEW);
 
 	ei->i_extra_isize = sbi->s_want_extra_isize;
diff --git a/fs/ext4l/inode.c b/fs/ext4l/inode.c
index 04b7c734f7f..d0262fa53f2 100644
--- a/fs/ext4l/inode.c
+++ b/fs/ext4l/inode.c
@@ -5265,7 +5265,6 @@  struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
 	ei->i_projid = make_kprojid(&init_user_ns, i_projid);
 	set_nlink(inode, le16_to_cpu(raw_inode->i_links_count));
 
-	ext4_clear_state_flags(ei);	/* Only relevant on 32-bit archs */
 	ei->i_inline_off = 0;
 	ei->i_dir_start_lookup = 0;
 	ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
diff --git a/fs/ext4l/ioctl.c b/fs/ext4l/ioctl.c
index a93a7baae99..3dec26c939f 100644
--- a/fs/ext4l/ioctl.c
+++ b/fs/ext4l/ioctl.c
@@ -1394,6 +1394,10 @@  static int ext4_ioctl_set_tune_sb(struct file *filp,
 	if (copy_from_user(&params, in, sizeof(params)))
 		return -EFAULT;
 
+	if (strnlen(params.mount_opts, sizeof(params.mount_opts)) ==
+	    sizeof(params.mount_opts))
+		return -E2BIG;
+
 	if ((params.set_flags & ~TUNE_OPS_SUPPORTED) != 0)
 		return -EOPNOTSUPP;
 
diff --git a/fs/ext4l/readpage.c b/fs/ext4l/readpage.c
index 94361c01f08..7f1cb419339 100644
--- a/fs/ext4l/readpage.c
+++ b/fs/ext4l/readpage.c
@@ -199,9 +199,7 @@  int ext4_mpage_readpages(struct inode *inode,
 {
 	struct bio *bio = NULL;
 	sector_t last_block_in_bio = 0;
-
 	const unsigned blkbits = inode->i_blkbits;
-	const unsigned blocks_per_page = PAGE_SIZE >> blkbits;
 	const unsigned blocksize = 1 << blkbits;
 	sector_t next_block;
 	sector_t block_in_file;
@@ -237,9 +235,8 @@  int ext4_mpage_readpages(struct inode *inode,
 
 		blocks_per_folio = folio_size(folio) >> blkbits;
 		first_hole = blocks_per_folio;
-		block_in_file = next_block =
-			(sector_t)folio->index << (PAGE_SHIFT - blkbits);
-		last_block = block_in_file + nr_pages * blocks_per_page;
+		block_in_file = next_block = EXT4_PG_TO_LBLK(inode, folio->index);
+		last_block = EXT4_PG_TO_LBLK(inode, folio->index + nr_pages);
 		last_block_in_file = (ext4_readpage_limit(inode) +
 				      blocksize - 1) >> blkbits;
 		if (last_block > last_block_in_file)
diff --git a/fs/ext4l/xattr.c b/fs/ext4l/xattr.c
index bd89822a682..a17ce41eba3 100644
--- a/fs/ext4l/xattr.c
+++ b/fs/ext4l/xattr.c
@@ -1170,7 +1170,11 @@  ext4_xattr_inode_dec_ref_all(handle_t *handle, struct inode *parent,
 	if (block_csum)
 		end = (void *)bh->b_data + bh->b_size;
 	else {
-		ext4_get_inode_loc(parent, &iloc);
+		err = ext4_get_inode_loc(parent, &iloc);
+		if (err) {
+			EXT4_ERROR_INODE(parent, "parent inode loc (error %d)", err);
+			return;
+		}
 		end = (void *)ext4_raw_inode(&iloc) + EXT4_SB(parent->i_sb)->s_inode_size;
 	}