[U-Boot] [PATCH v2 7/8] fat/fs: move ls to generic implementation
Łukasz Majewski
lukma at denx.de
Sun Sep 3 15:19:52 UTC 2017
On 09/02/2017 06:38 PM, Rob Clark wrote:
> Add a generic implementation of 'ls' using opendir/readdir/closedir, and
> replace fat's custom implementation. Other filesystems should move to
> the generic implementation after they add opendir/readdir/closedir
> support.
>
Reviewed-by: Łukasz Majewski <lukma at denx.de>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
> fs/fat/fat.c | 32 --------------------------------
> fs/fs.c | 35 +++++++++++++++++++++++++++++++++--
> include/fat.h | 5 ++++-
> 3 files changed, 37 insertions(+), 35 deletions(-)
>
> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
> index d30ef3903b..fc3106aacb 100644
> --- a/fs/fat/fat.c
> +++ b/fs/fat/fat.c
> @@ -1002,38 +1002,6 @@ int file_fat_detectfs(void)
> return 0;
> }
>
> -int file_fat_ls(const char *dir)
> -{
> - fsdata fsdata;
> - fat_itr itrblock, *itr = &itrblock;
> - int files = 0, dirs = 0;
> - int ret;
> -
> - ret = fat_itr_root(itr, &fsdata);
> - if (ret)
> - return ret;
> -
> - ret = fat_itr_resolve(itr, dir, TYPE_DIR);
> - if (ret)
> - return ret;
> -
> - while (fat_itr_next(itr)) {
> - if (fat_itr_isdir(itr)) {
> - printf(" %s/\n", itr->name);
> - dirs++;
> - } else {
> - printf(" %8u %s\n",
> - FAT2CPU32(itr->dent->size),
> - itr->name);
> - files++;
> - }
> - }
> -
> - printf("\n%d file(s), %d dir(s)\n\n", files, dirs);
> -
> - return 0;
> -}
> -
> int fat_exists(const char *filename)
> {
> fsdata fsdata;
> diff --git a/fs/fs.c b/fs/fs.c
> index 441c880654..716c223ec6 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -37,6 +37,35 @@ static inline int fs_ls_unsupported(const char *dirname)
> return -1;
> }
>
> +/* generic implementation of ls in terms of opendir/readdir/closedir */
> +__maybe_unused
> +static int fs_ls_generic(const char *dirname)
> +{
> + FS_DIR *dirp;
> + struct fs_dirent *dent;
> + int files = 0, dirs = 0;
> +
> + dirp = fs_opendir(dirname);
> + if (!dirp)
> + return -errno;
> +
> + while ((dent = fs_readdir(dirp))) {
> + if (dent->type == FS_DT_DIR) {
> + printf(" %s/\n", dent->name);
> + dirs++;
> + } else {
> + printf(" %8lld %s\n", dent->size, dent->name);
> + files++;
> + }
> + }
> +
> + fs_closedir(dirp);
> +
> + printf("\n%d file(s), %d dir(s)\n\n", files, dirs);
> +
> + return 0;
> +}
> +
> static inline int fs_exists_unsupported(const char *filename)
> {
> return 0;
> @@ -111,7 +140,7 @@ static struct fstype_info fstypes[] = {
> .null_dev_desc_ok = false,
> .probe = fat_set_blk_dev,
> .close = fat_close,
> - .ls = file_fat_ls,
> + .ls = fs_ls_generic,
> .exists = fat_exists,
> .size = fat_size,
> .read = fat_read_file,
> @@ -121,7 +150,9 @@ static struct fstype_info fstypes[] = {
> .write = fs_write_unsupported,
> #endif
> .uuid = fs_uuid_unsupported,
> - .opendir = fs_opendir_unsupported,
> + .opendir = fat_opendir,
> + .readdir = fat_readdir,
> + .closedir = fat_closedir,
> },
> #endif
> #ifdef CONFIG_FS_EXT4
> diff --git a/include/fat.h b/include/fat.h
> index 1e8bc44e9a..b2d4b952fd 100644
> --- a/include/fat.h
> +++ b/include/fat.h
> @@ -11,6 +11,7 @@
> #define _FAT_H_
>
> #include <asm/byteorder.h>
> +#include <fs.h>
>
> #define CONFIG_SUPPORT_VFAT
> /* Maximum Long File Name length supported here is 128 UTF-16 code units */
> @@ -172,7 +173,6 @@ typedef struct {
> } fsdata;
>
> int file_fat_detectfs(void);
> -int file_fat_ls(const char *dir);
> int fat_exists(const char *filename);
> int fat_size(const char *filename, loff_t *size);
> int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
> @@ -185,5 +185,8 @@ int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
> loff_t *actwrite);
> int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
> loff_t *actread);
> +int fat_opendir(const char *filename, FS_DIR **dirp);
> +int fat_readdir(FS_DIR *dirp);
> +void fat_closedir(FS_DIR *dirp);
> void fat_close(void);
> #endif /* _FAT_H_ */
>
--
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
More information about the U-Boot
mailing list