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>
This commit is contained in:
parent
6152916a95
commit
377202b560
16
fs/fs.c
16
fs/fs.c
|
@ -64,6 +64,15 @@ static inline void fs_close_unsupported(void)
|
||||||
|
|
||||||
struct fstype_info {
|
struct fstype_info {
|
||||||
int fstype;
|
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,
|
int (*probe)(block_dev_desc_t *fs_dev_desc,
|
||||||
disk_partition_t *fs_partition);
|
disk_partition_t *fs_partition);
|
||||||
int (*ls)(const char *dirname);
|
int (*ls)(const char *dirname);
|
||||||
|
@ -77,6 +86,7 @@ static struct fstype_info fstypes[] = {
|
||||||
#ifdef CONFIG_FS_FAT
|
#ifdef CONFIG_FS_FAT
|
||||||
{
|
{
|
||||||
.fstype = FS_TYPE_FAT,
|
.fstype = FS_TYPE_FAT,
|
||||||
|
.null_dev_desc_ok = false,
|
||||||
.probe = fat_set_blk_dev,
|
.probe = fat_set_blk_dev,
|
||||||
.close = fat_close,
|
.close = fat_close,
|
||||||
.ls = file_fat_ls,
|
.ls = file_fat_ls,
|
||||||
|
@ -88,6 +98,7 @@ static struct fstype_info fstypes[] = {
|
||||||
#ifdef CONFIG_FS_EXT4
|
#ifdef CONFIG_FS_EXT4
|
||||||
{
|
{
|
||||||
.fstype = FS_TYPE_EXT,
|
.fstype = FS_TYPE_EXT,
|
||||||
|
.null_dev_desc_ok = false,
|
||||||
.probe = ext4fs_probe,
|
.probe = ext4fs_probe,
|
||||||
.close = ext4fs_close,
|
.close = ext4fs_close,
|
||||||
.ls = ext4fs_ls,
|
.ls = ext4fs_ls,
|
||||||
|
@ -99,6 +110,7 @@ static struct fstype_info fstypes[] = {
|
||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
{
|
{
|
||||||
.fstype = FS_TYPE_SANDBOX,
|
.fstype = FS_TYPE_SANDBOX,
|
||||||
|
.null_dev_desc_ok = true,
|
||||||
.probe = sandbox_fs_set_blk_dev,
|
.probe = sandbox_fs_set_blk_dev,
|
||||||
.close = sandbox_fs_close,
|
.close = sandbox_fs_close,
|
||||||
.ls = sandbox_fs_ls,
|
.ls = sandbox_fs_ls,
|
||||||
|
@ -109,6 +121,7 @@ static struct fstype_info fstypes[] = {
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
.fstype = FS_TYPE_ANY,
|
.fstype = FS_TYPE_ANY,
|
||||||
|
.null_dev_desc_ok = true,
|
||||||
.probe = fs_probe_unsupported,
|
.probe = fs_probe_unsupported,
|
||||||
.close = fs_close_unsupported,
|
.close = fs_close_unsupported,
|
||||||
.ls = fs_ls_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)
|
fstype != info->fstype)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!fs_dev_desc && !info->null_dev_desc_ok)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!info->probe(fs_dev_desc, &fs_partition)) {
|
if (!info->probe(fs_dev_desc, &fs_partition)) {
|
||||||
fs_type = info->fstype;
|
fs_type = info->fstype;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue