fs: Add command to retrieve the filesystem type

New command to determine the filesystem type of a given partition.
Optionally stores the filesystem type in a environment variable.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
Sjoerd Simons 2015-01-05 18:13:36 +01:00 committed by Tom Rini
parent 2af13d6b62
commit 1a1ad8e090
3 changed files with 48 additions and 0 deletions

View File

@ -81,3 +81,18 @@ U_BOOT_CMD(
" - List files in directory 'directory' of partition 'part' on\n"
" device type 'interface' instance 'dev'."
)
static int do_fstype_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[])
{
return do_fs_type(cmdtp, flag, argc, argv);
}
U_BOOT_CMD(
fstype, 4, 1, do_fstype_wrapper,
"Look up a filesystem type",
"<interface> <dev>:<part>\n"
"- print filesystem type\n"
"fstype <interface> <dev>:<part> <varname>\n"
"- set environment variable to filesystem type\n"
);

27
fs/fs.c
View File

@ -79,6 +79,7 @@ static inline int fs_uuid_unsupported(char *uuid_str)
struct fstype_info {
int fstype;
char *name;
/*
* Is it legal to pass NULL as .probe()'s fs_dev_desc parameter? This
* should be false in most cases. For "virtual" filesystems which
@ -105,6 +106,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_FS_FAT
{
.fstype = FS_TYPE_FAT,
.name = "fat",
.null_dev_desc_ok = false,
.probe = fat_set_blk_dev,
.close = fat_close,
@ -123,6 +125,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_FS_EXT4
{
.fstype = FS_TYPE_EXT,
.name = "ext4",
.null_dev_desc_ok = false,
.probe = ext4fs_probe,
.close = ext4fs_close,
@ -141,6 +144,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_SANDBOX
{
.fstype = FS_TYPE_SANDBOX,
.name = "sandbox",
.null_dev_desc_ok = true,
.probe = sandbox_fs_set_blk_dev,
.close = sandbox_fs_close,
@ -154,6 +158,7 @@ static struct fstype_info fstypes[] = {
#endif
{
.fstype = FS_TYPE_ANY,
.name = "unsupported",
.null_dev_desc_ok = true,
.probe = fs_probe_unsupported,
.close = fs_close_unsupported,
@ -190,6 +195,7 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
if (!relocated) {
for (i = 0, info = fstypes; i < ARRAY_SIZE(fstypes);
i++, info++) {
info->name += gd->reloc_off;
info->probe += gd->reloc_off;
info->close += gd->reloc_off;
info->ls += gd->reloc_off;
@ -503,3 +509,24 @@ int do_fs_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
return CMD_RET_SUCCESS;
}
int do_fs_type(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct fstype_info *info;
if (argc < 3 || argc > 4)
return CMD_RET_USAGE;
if (fs_set_blk_dev(argv[1], argv[2], FS_TYPE_ANY))
return 1;
info = fs_get_info(fs_type);
if (argc == 4)
setenv(argv[3], info->name);
else
printf("%s\n", info->name);
return CMD_RET_SUCCESS;
}

View File

@ -109,4 +109,10 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int do_fs_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype);
/*
* Determine the type of the specified filesystem and print it. Optionally it is
* possible to store the type directly in env.
*/
int do_fs_type(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
#endif /* _FS_H */