[PATCH 1/1] ext4: detect directories in ext4fs_exists()
Caleb Connolly
caleb.connolly at linaro.org
Tue Feb 20 15:45:55 CET 2024
On 20/02/2024 11:54, Heinrich Schuchardt wrote:
> While fat_exists() reports directories and files as existing
> ext4fs_exists() only recognizes files. This lead to errors
> when using systemd-boot with an ext4 file-system.
>
> Change ext4fs_exists() to find any type of inode:
> files, directories, symbolic links.
>
> Fixes: a1596438a689 ("ext4fs ls load support")
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
This doesn't entirely fix systemd-boot, the fs_get_size() call still
winds up in ext4fs_open() which fails because it's a directory...
I poked around to see if I could get this working but it seems like it
won't be simple :/
This is still a valid bugfix though, even if it doesn't totally fix the
issue.
Reviwed-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
> I still need to figure out a good test. Currently 'xxd' is the only command
> invoking fs_exists().
> ---
> fs/ext4/ext4_common.c | 5 ++---
> fs/ext4/ext4_common.h | 2 ++
> fs/ext4/ext4fs.c | 11 +++++++----
> 3 files changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> index ea9b92298ba..365c5147c4b 100644
> --- a/fs/ext4/ext4_common.c
> +++ b/fs/ext4/ext4_common.c
> @@ -2214,9 +2214,8 @@ static char *ext4fs_read_symlink(struct ext2fs_node *node)
> return symlink;
> }
>
> -static int ext4fs_find_file1(const char *currpath,
> - struct ext2fs_node *currroot,
> - struct ext2fs_node **currfound, int *foundtype)
> +int ext4fs_find_file1(const char *currpath, struct ext2fs_node *currroot,
> + struct ext2fs_node **currfound, int *foundtype)
> {
> char fpath[strlen(currpath) + 1];
> char *name = fpath;
> diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h
> index 504c708b064..84500e990aa 100644
> --- a/fs/ext4/ext4_common.h
> +++ b/fs/ext4/ext4_common.h
> @@ -54,6 +54,8 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos, loff_t len,
> char *buf, loff_t *actread);
> int ext4fs_find_file(const char *path, struct ext2fs_node *rootnode,
> struct ext2fs_node **foundnode, int expecttype);
> +int ext4fs_find_file1(const char *currpath, struct ext2fs_node *currroot,
> + struct ext2fs_node **currfound, int *foundtype);
> int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
> struct ext2fs_node **fnode, int *ftype);
>
> diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> index 3b12ec54fa2..b1359d14909 100644
> --- a/fs/ext4/ext4fs.c
> +++ b/fs/ext4/ext4fs.c
> @@ -208,11 +208,14 @@ int ext4fs_ls(const char *dirname)
>
> int ext4fs_exists(const char *filename)
> {
> - loff_t file_len;
> - int ret;
> + struct ext2fs_node *dirnode = NULL;
> + int filetype;
>
> - ret = ext4fs_open(filename, &file_len);
> - return ret == 0;
> + if (!filename)
> + return 0;
> +
> + return ext4fs_find_file1(filename, &ext4fs_root->diropen, &dirnode,
> + &filetype);
> }
>
> int ext4fs_size(const char *filename, loff_t *size)
--
// Caleb (they/them)
More information about the U-Boot
mailing list