mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
kern/file: Implement filesystem reference counting
The grub_file_open() and grub_file_close() should be the only places that allow a reference to a filesystem to stay open. So, add grub_dl_t to grub_fs_t and set this in the GRUB_MOD_INIT() for each filesystem to avoid issues when filesystems forget to do it themselves or do not track their own references, e.g. squash4. The fs_label(), fs_uuid(), fs_mtime() and fs_read() should all ref and unref in the same function but it is essentially redundant in GRUB single threaded model. Signed-off-by: B Horn <b@horn.uk> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
a791068729
commit
16f196874f
31 files changed
+40
No files matched your search
@@ -703,6 +703,7 @@ static struct grub_fs grub_affs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(affs)
|
GRUB_MOD_INIT(affs)
|
||||||
{
|
{
|
||||||
|
grub_affs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_affs_fs);
|
grub_fs_register (&grub_affs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1106,6 +1106,7 @@ GRUB_MOD_INIT (bfs)
|
|||||||
{
|
{
|
||||||
COMPILE_TIME_ASSERT (1 << LOG_EXTENT_SIZE ==
|
COMPILE_TIME_ASSERT (1 << LOG_EXTENT_SIZE ==
|
||||||
sizeof (struct grub_bfs_extent));
|
sizeof (struct grub_bfs_extent));
|
||||||
|
grub_bfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_bfs_fs);
|
grub_fs_register (&grub_bfs_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2413,6 +2413,7 @@ static struct grub_fs grub_btrfs_fs = {
|
|||||||
|
|
||||||
GRUB_MOD_INIT (btrfs)
|
GRUB_MOD_INIT (btrfs)
|
||||||
{
|
{
|
||||||
|
grub_btrfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_btrfs_fs);
|
grub_fs_register (&grub_btrfs_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -390,6 +390,7 @@ GRUB_MOD_INIT (cbfs)
|
|||||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||||
init_cbfsdisk ();
|
init_cbfsdisk ();
|
||||||
#endif
|
#endif
|
||||||
|
grub_cbfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cbfs_fs);
|
grub_fs_register (&grub_cbfs_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ read_number (const grub_uint16_t *arr, grub_size_t size)
|
|||||||
|
|
||||||
GRUB_MOD_INIT (cpio)
|
GRUB_MOD_INIT (cpio)
|
||||||
{
|
{
|
||||||
|
grub_cpio_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cpio_fs);
|
grub_fs_register (&grub_cpio_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ read_number (const grub_uint16_t *arr, grub_size_t size)
|
|||||||
|
|
||||||
GRUB_MOD_INIT (cpio_be)
|
GRUB_MOD_INIT (cpio_be)
|
||||||
{
|
{
|
||||||
|
grub_cpio_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cpio_fs);
|
grub_fs_register (&grub_cpio_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -991,6 +991,7 @@ static struct grub_fs grub_erofs_fs = {
|
|||||||
|
|
||||||
GRUB_MOD_INIT (erofs)
|
GRUB_MOD_INIT (erofs)
|
||||||
{
|
{
|
||||||
|
grub_erofs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_erofs_fs);
|
grub_fs_register (&grub_erofs_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1131,6 +1131,7 @@ static struct grub_fs grub_ext2_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(ext2)
|
GRUB_MOD_INIT(ext2)
|
||||||
{
|
{
|
||||||
|
grub_ext2_fs.mod = mod;
|
||||||
grub_fs_register (&grub_ext2_fs);
|
grub_fs_register (&grub_ext2_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1353,6 +1353,7 @@ static struct grub_fs grub_f2fs_fs = {
|
|||||||
|
|
||||||
GRUB_MOD_INIT (f2fs)
|
GRUB_MOD_INIT (f2fs)
|
||||||
{
|
{
|
||||||
|
grub_f2fs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_f2fs_fs);
|
grub_fs_register (&grub_f2fs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1312,6 +1312,7 @@ GRUB_MOD_INIT(fat)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
COMPILE_TIME_ASSERT (sizeof (struct grub_fat_dir_entry) == 32);
|
COMPILE_TIME_ASSERT (sizeof (struct grub_fat_dir_entry) == 32);
|
||||||
|
grub_fat_fs.mod = mod;
|
||||||
grub_fs_register (&grub_fat_fs);
|
grub_fs_register (&grub_fat_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1434,6 +1434,7 @@ static struct grub_fs grub_hfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(hfs)
|
GRUB_MOD_INIT(hfs)
|
||||||
{
|
{
|
||||||
|
grub_hfs_fs.mod = mod;
|
||||||
if (!grub_is_lockdown ())
|
if (!grub_is_lockdown ())
|
||||||
grub_fs_register (&grub_hfs_fs);
|
grub_fs_register (&grub_hfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
|
|||||||
@@ -1176,6 +1176,7 @@ static struct grub_fs grub_hfsplus_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(hfsplus)
|
GRUB_MOD_INIT(hfsplus)
|
||||||
{
|
{
|
||||||
|
grub_hfsplus_fs.mod = mod;
|
||||||
grub_fs_register (&grub_hfsplus_fs);
|
grub_fs_register (&grub_hfsplus_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1260,6 +1260,7 @@ static struct grub_fs grub_iso9660_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(iso9660)
|
GRUB_MOD_INIT(iso9660)
|
||||||
{
|
{
|
||||||
|
grub_iso9660_fs.mod = mod;
|
||||||
grub_fs_register (&grub_iso9660_fs);
|
grub_fs_register (&grub_iso9660_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1004,6 +1004,7 @@ static struct grub_fs grub_jfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(jfs)
|
GRUB_MOD_INIT(jfs)
|
||||||
{
|
{
|
||||||
|
grub_jfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_jfs_fs);
|
grub_fs_register (&grub_jfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -734,6 +734,7 @@ GRUB_MOD_INIT(minix)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
grub_minix_fs.mod = mod;
|
||||||
grub_fs_register (&grub_minix_fs);
|
grub_fs_register (&grub_minix_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ read_number (const char *str, grub_size_t size)
|
|||||||
|
|
||||||
GRUB_MOD_INIT (newc)
|
GRUB_MOD_INIT (newc)
|
||||||
{
|
{
|
||||||
|
grub_cpio_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cpio_fs);
|
grub_fs_register (&grub_cpio_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1231,6 +1231,7 @@ GRUB_MOD_INIT (nilfs2)
|
|||||||
grub_nilfs2_dat_entry));
|
grub_nilfs2_dat_entry));
|
||||||
COMPILE_TIME_ASSERT (1 << LOG_INODE_SIZE
|
COMPILE_TIME_ASSERT (1 << LOG_INODE_SIZE
|
||||||
== sizeof (struct grub_nilfs2_inode));
|
== sizeof (struct grub_nilfs2_inode));
|
||||||
|
grub_nilfs2_fs.mod = mod;
|
||||||
grub_fs_register (&grub_nilfs2_fs);
|
grub_fs_register (&grub_nilfs2_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1541,6 +1541,7 @@ static struct grub_fs grub_ntfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT (ntfs)
|
GRUB_MOD_INIT (ntfs)
|
||||||
{
|
{
|
||||||
|
grub_ntfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_ntfs_fs);
|
grub_fs_register (&grub_ntfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ read_number (const char *str, grub_size_t size)
|
|||||||
|
|
||||||
GRUB_MOD_INIT (odc)
|
GRUB_MOD_INIT (odc)
|
||||||
{
|
{
|
||||||
|
grub_cpio_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cpio_fs);
|
grub_fs_register (&grub_cpio_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ static struct grub_fs grub_procfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT (procfs)
|
GRUB_MOD_INIT (procfs)
|
||||||
{
|
{
|
||||||
|
grub_procfs_fs.mod = mod;
|
||||||
grub_disk_dev_register (&grub_procfs_dev);
|
grub_disk_dev_register (&grub_procfs_dev);
|
||||||
grub_fs_register (&grub_procfs_fs);
|
grub_fs_register (&grub_procfs_fs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1417,6 +1417,7 @@ static struct grub_fs grub_reiserfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(reiserfs)
|
GRUB_MOD_INIT(reiserfs)
|
||||||
{
|
{
|
||||||
|
grub_reiserfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_reiserfs_fs);
|
grub_fs_register (&grub_reiserfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -475,6 +475,7 @@ static struct grub_fs grub_romfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(romfs)
|
GRUB_MOD_INIT(romfs)
|
||||||
{
|
{
|
||||||
|
grub_romfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_romfs_fs);
|
grub_fs_register (&grub_romfs_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -779,6 +779,7 @@ static struct grub_fs grub_sfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(sfs)
|
GRUB_MOD_INIT(sfs)
|
||||||
{
|
{
|
||||||
|
grub_sfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_sfs_fs);
|
grub_fs_register (&grub_sfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1044,6 +1044,7 @@ static struct grub_fs grub_squash_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(squash4)
|
GRUB_MOD_INIT(squash4)
|
||||||
{
|
{
|
||||||
|
grub_squash_fs.mod = mod;
|
||||||
grub_fs_register (&grub_squash_fs);
|
grub_fs_register (&grub_squash_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -354,6 +354,7 @@ static struct grub_fs grub_cpio_fs = {
|
|||||||
|
|
||||||
GRUB_MOD_INIT (tar)
|
GRUB_MOD_INIT (tar)
|
||||||
{
|
{
|
||||||
|
grub_cpio_fs.mod = mod;
|
||||||
grub_fs_register (&grub_cpio_fs);
|
grub_fs_register (&grub_cpio_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1455,6 +1455,7 @@ static struct grub_fs grub_udf_fs = {
|
|||||||
|
|
||||||
GRUB_MOD_INIT (udf)
|
GRUB_MOD_INIT (udf)
|
||||||
{
|
{
|
||||||
|
grub_udf_fs.mod = mod;
|
||||||
grub_fs_register (&grub_udf_fs);
|
grub_fs_register (&grub_udf_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -899,6 +899,7 @@ GRUB_MOD_INIT(ufs1)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
grub_ufs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_ufs_fs);
|
grub_fs_register (&grub_ufs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1304,6 +1304,7 @@ static struct grub_fs grub_xfs_fs =
|
|||||||
|
|
||||||
GRUB_MOD_INIT(xfs)
|
GRUB_MOD_INIT(xfs)
|
||||||
{
|
{
|
||||||
|
grub_xfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_xfs_fs);
|
grub_fs_register (&grub_xfs_fs);
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4464,6 +4464,7 @@ static struct grub_fs grub_zfs_fs = {
|
|||||||
GRUB_MOD_INIT (zfs)
|
GRUB_MOD_INIT (zfs)
|
||||||
{
|
{
|
||||||
COMPILE_TIME_ASSERT (sizeof (zap_leaf_chunk_t) == ZAP_LEAF_CHUNKSIZE);
|
COMPILE_TIME_ASSERT (sizeof (zap_leaf_chunk_t) == ZAP_LEAF_CHUNKSIZE);
|
||||||
|
grub_zfs_fs.mod = mod;
|
||||||
grub_fs_register (&grub_zfs_fs);
|
grub_fs_register (&grub_zfs_fs);
|
||||||
#ifndef GRUB_UTIL
|
#ifndef GRUB_UTIL
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <grub/fs.h>
|
#include <grub/fs.h>
|
||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
|
||||||
void (*EXPORT_VAR (grub_grubnet_fini)) (void);
|
void (*EXPORT_VAR (grub_grubnet_fini)) (void);
|
||||||
|
|
||||||
@@ -117,6 +118,9 @@ grub_file_open (const char *name, enum grub_file_type type)
|
|||||||
if (file->data == NULL)
|
if (file->data == NULL)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (file->fs->mod)
|
||||||
|
grub_dl_ref (file->fs->mod);
|
||||||
|
|
||||||
file->name = grub_strdup (name);
|
file->name = grub_strdup (name);
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
||||||
@@ -197,6 +201,9 @@ grub_file_read (grub_file_t file, void *buf, grub_size_t len)
|
|||||||
grub_err_t
|
grub_err_t
|
||||||
grub_file_close (grub_file_t file)
|
grub_file_close (grub_file_t file)
|
||||||
{
|
{
|
||||||
|
if (file->fs->mod)
|
||||||
|
grub_dl_unref (file->fs->mod);
|
||||||
|
|
||||||
if (file->fs->fs_close)
|
if (file->fs->fs_close)
|
||||||
(file->fs->fs_close) (file);
|
(file->fs->fs_close) (file);
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/symbol.h>
|
#include <grub/symbol.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
|
||||||
#include <grub/list.h>
|
#include <grub/list.h>
|
||||||
/* For embedding types. */
|
/* For embedding types. */
|
||||||
@@ -57,6 +58,9 @@ struct grub_fs
|
|||||||
/* My name. */
|
/* My name. */
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
|
/* My module */
|
||||||
|
grub_dl_t mod;
|
||||||
|
|
||||||
/* Call HOOK with each file under DIR. */
|
/* Call HOOK with each file under DIR. */
|
||||||
grub_err_t (*fs_dir) (grub_device_t device, const char *path,
|
grub_err_t (*fs_dir) (grub_device_t device, const char *path,
|
||||||
grub_fs_dir_hook_t hook, void *hook_data);
|
grub_fs_dir_hook_t hook, void *hook_data);
|
||||||
|
|||||||
Reference in new issue
Block a user