diff options
author | Simon Glass | 2012-12-26 09:53:30 +0000 |
---|---|---|
committer | Tom Rini | 2013-03-04 14:19:56 -0500 |
commit | c6f548d232c47a1691124d05c90fe9fb652e6874 (patch) | |
tree | 3e84bee29b963c6b158a20d6a7fc438fc079a2ef | |
parent | 436e2b731979afc904b2a39f1b2fbb2370f08cb4 (diff) |
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 <sjg@chromium.org>
Reviewed-by: Tom Rini <trini@ti.com>
-rw-r--r-- | fs/fs.c | 60 |
1 files changed, 26 insertions, 34 deletions
@@ -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; |