[Concept,16/26] ext4l: Add safeguard to close previous mount in probe

Message ID 20251231223008.3251711-17-sjg@u-boot.org
State New
Headers
Series ext4l: Add write support (part L) |

Commit Message

Simon Glass Dec. 31, 2025, 10:29 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

When running multiple filesystem tests in sequence, probe may be called
without an explicit close of the previous mount. The old device may have
been rebound to a different file, making I/O to it invalid.

Add a new ext4l_close_internal() function with a skip_io parameter to
handle this case. When skip_io is true, it skips journal-destroy
entirely since the device may be invalid. It will be recovered on next
mount.

Also call the ext4- and JBD2- cleanup functions to properly reset the
global state for subsequent mounts: ext4_exit_system_zone(),
ext4_exit_es(), ext4_exit_mballoc(), and jbd2_journal_exit_global()

This ensures the caches are destroyed, thus freeing all orphaned
journal_heads, even when skip_io is true.

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

 fs/ext4l/interface.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
  

Patch

diff --git a/fs/ext4l/interface.c b/fs/ext4l/interface.c
index ceedabdb727..301e28af3b8 100644
--- a/fs/ext4l/interface.c
+++ b/fs/ext4l/interface.c
@@ -286,6 +286,17 @@  int ext4l_probe(struct blk_desc *fs_dev_desc,
 	if (!fs_dev_desc)
 		return -EINVAL;
 
+	/*
+	 * Ensure any previous mount is properly closed before mounting again.
+	 * This prevents resource leaks if probe is called without close.
+	 *
+	 * Since we're being called while a previous mount exists, we can't
+	 * trust the old device state (it may have been rebound to a different
+	 * file). Use skip_io=true to skip all I/O during close.
+	 */
+	if (ext4l_sb)
+		ext4l_close_internal(true);
+
 	/* Initialise message buffer for recording ext4 messages */
 	ext4l_msg_init();
 
@@ -855,12 +866,7 @@  int ext4l_read(const char *filename, void *buf, loff_t offset, loff_t len,
 
 void ext4l_close(void)
 {
-	if (ext4l_open_dirs > 0)
-		return;
-
-	ext4l_dev_desc = NULL;
-	ext4l_sb = NULL;
-	ext4l_clear_blk_dev();
+	ext4l_close_internal(false);
 }
 
 /**