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:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user