From c6f548d232c47a1691124d05c90fe9fb652e6874 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 26 Dec 2012 09:53:30 +0000 Subject: fs: Use filesystem methods instead of switch() We can use the available methods and avoid using switch(). When the filesystem is not supported, we fall through to the 'unsupported' methods: fs_probe_unsupported() prints an error, so the others do not need to. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- fs/fs.c | 60 ++++++++++++++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) (limited to 'fs/fs.c') diff --git a/fs/fs.c b/fs/fs.c index 66835e2c74..856d8baf92 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -35,14 +35,12 @@ static inline int fs_probe_unsupported(void) static inline int fs_ls_unsupported(const char *dirname) { - printf("** Unrecognized filesystem type **\n"); return -1; } static inline int fs_read_unsupported(const char *filename, ulong addr, int offset, int len) { - printf("** Unrecognized filesystem type **\n"); return -1; } @@ -189,6 +187,20 @@ static struct fstype_info fstypes[] = { }, }; +static struct fstype_info *fs_get_info(int fstype) +{ + struct fstype_info *info; + int i; + + for (i = 0, info = fstypes; i < ARRAY_SIZE(fstypes) - 1; i++, info++) { + if (fstype == info->fstype) + return info; + } + + /* Return the 'unsupported' sentinel */ + return info; +} + int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype) { struct fstype_info *info; @@ -229,17 +241,9 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype) static void fs_close(void) { - switch (fs_type) { - case FS_TYPE_FAT: - fs_close_fat(); - break; - case FS_TYPE_EXT: - fs_close_ext(); - break; - default: - break; - } + struct fstype_info *info = fs_get_info(fs_type); + info->close(); fs_type = FS_TYPE_ANY; } @@ -247,17 +251,9 @@ int fs_ls(const char *dirname) { int ret; - switch (fs_type) { - case FS_TYPE_FAT: - ret = fs_ls_fat(dirname); - break; - case FS_TYPE_EXT: - ret = fs_ls_ext(dirname); - break; - default: - ret = fs_ls_unsupported(dirname); - break; - } + struct fstype_info *info = fs_get_info(fs_type); + + ret = info->ls(dirname); fs_close(); @@ -266,20 +262,16 @@ int fs_ls(const char *dirname) int fs_read(const char *filename, ulong addr, int offset, int len) { + struct fstype_info *info = fs_get_info(fs_type); int ret; - switch (fs_type) { - case FS_TYPE_FAT: - ret = fs_read_fat(filename, addr, offset, len); - break; - case FS_TYPE_EXT: - ret = fs_read_ext(filename, addr, offset, len); - break; - default: - ret = fs_read_unsupported(filename, addr, offset, len); - break; - } + ret = info->read(filename, addr, offset, len); + /* If we requested a specific number of bytes, check we got it */ + if (ret >= 0 && len && ret != len) { + printf("** Unable to read file %s **\n", filename); + ret = -1; + } fs_close(); return ret; -- cgit v1.2.1