fs: don't pass NULL dev_desc to most filesystems

FAT and ext4 expect that the passed in block device descriptor not be
NULL. This causes problems on sandbox, where get_device_and_partition()
succeeds for the "host" device, yet passes back a NULL device descriptor.
Add special handling for this situation, so that the generic filesystem
commands operate as expected on sandbox.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
master
Stephen Warren 10 years ago committed by Tom Rini
parent 6152916a95
commit 377202b560
  1. 16
      fs/fs.c

@ -64,6 +64,15 @@ static inline void fs_close_unsupported(void)
struct fstype_info {
int fstype;
/*
* Is it legal to pass NULL as .probe()'s fs_dev_desc parameter? This
* should be false in most cases. For "virtual" filesystems which
* aren't based on a U-Boot block device (e.g. sandbox), this can be
* set to true. This should also be true for the dumm entry at the end
* of fstypes[], since that is essentially a "virtual" (non-existent)
* filesystem.
*/
bool null_dev_desc_ok;
int (*probe)(block_dev_desc_t *fs_dev_desc,
disk_partition_t *fs_partition);
int (*ls)(const char *dirname);
@ -77,6 +86,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_FS_FAT
{
.fstype = FS_TYPE_FAT,
.null_dev_desc_ok = false,
.probe = fat_set_blk_dev,
.close = fat_close,
.ls = file_fat_ls,
@ -88,6 +98,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_FS_EXT4
{
.fstype = FS_TYPE_EXT,
.null_dev_desc_ok = false,
.probe = ext4fs_probe,
.close = ext4fs_close,
.ls = ext4fs_ls,
@ -99,6 +110,7 @@ static struct fstype_info fstypes[] = {
#ifdef CONFIG_SANDBOX
{
.fstype = FS_TYPE_SANDBOX,
.null_dev_desc_ok = true,
.probe = sandbox_fs_set_blk_dev,
.close = sandbox_fs_close,
.ls = sandbox_fs_ls,
@ -109,6 +121,7 @@ static struct fstype_info fstypes[] = {
#endif
{
.fstype = FS_TYPE_ANY,
.null_dev_desc_ok = true,
.probe = fs_probe_unsupported,
.close = fs_close_unsupported,
.ls = fs_ls_unsupported,
@ -162,6 +175,9 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
fstype != info->fstype)
continue;
if (!fs_dev_desc && !info->null_dev_desc_ok)
continue;
if (!info->probe(fs_dev_desc, &fs_partition)) {
fs_type = info->fstype;
return 0;

Loading…
Cancel
Save