From: Heinrich Schuchardt Date: Tue, 20 Feb 2024 11:54:23 +0000 (+0100) Subject: ext4: detect directories in ext4fs_exists() X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=e70f04fb8d69b9e02af608ec4b292bdf2f37c915;p=u-boot.git ext4: detect directories in ext4fs_exists() 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 --- diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index ea9b92298b..365c5147c4 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 504c708b06..84500e990a 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 3b12ec54fa..33e200ffa3 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)