ext4l: Add safeguard to close previous mount in probe

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>
This commit is contained in:
Simon Glass
2025-12-30 15:13:04 -07:00
parent b6980e8fca
commit 7b1fd66e98

View File

@@ -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);
}
/**