diff options
| author | Simon Glass <sjg@chromium.org> | 2012-12-26 09:53:30 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-03-04 14:19:56 -0500 | 
| commit | c6f548d232c47a1691124d05c90fe9fb652e6874 (patch) | |
| tree | 3e84bee29b963c6b158a20d6a7fc438fc079a2ef /fs/fs.c | |
| parent | 436e2b731979afc904b2a39f1b2fbb2370f08cb4 (diff) | |
| download | olio-uboot-2014.01-c6f548d232c47a1691124d05c90fe9fb652e6874.tar.xz olio-uboot-2014.01-c6f548d232c47a1691124d05c90fe9fb652e6874.zip | |
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>
Diffstat (limited to 'fs/fs.c')
| -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; |