Filesystems that are null_dev_desc_ok (semihosting, ubifs) have
no UCLASS_BLK device under their ifname, so on real hardware
fs_set_blk_dev() always fails at the partition lookup.
The workaround was to add a per-filesystem
command (example cmd/ubifs.c), which duplicates thue plumbing of
fstype_info.

Honour the opt-in directly: probe such entries with block_desc=NULL up
front, so "load semihosting <addr> <file>" works without a new
command.

Sandbox boards that exercise the existing fallback through "host
bind" stay unchanged.

Signed-off-by: Vincent Jardin <[email protected]>

---

 fs/fs.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/fs/fs.c b/fs/fs.c
index 8ea50a6c13c..09295e95892 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -464,6 +464,24 @@ int fs_set_blk_dev(const char *ifname, const char 
*dev_part_str, int fstype)
        struct fstype_info *info;
        int part, i;
 
+       for (i = 0, info = fstypes; i < ARRAY_SIZE(fstypes); i++, info++) {
+               if (fstype != FS_TYPE_ANY && info->fstype != FS_TYPE_ANY &&
+                   fstype != info->fstype)
+                       continue;
+               if (!info->null_dev_desc_ok || !info->name)
+                       continue;
+               if (strcmp(info->name, ifname) != 0)
+                       continue;
+
+               fs_dev_desc = NULL;
+               memset(&fs_partition, 0, sizeof(fs_partition));
+               if (!info->probe(NULL, &fs_partition)) {
+                       fs_type = info->fstype;
+                       fs_dev_part = 0;
+                       return 0;
+               }
+       }
+
        part = part_get_info_by_dev_and_name_or_num(ifname, dev_part_str, 
&fs_dev_desc,
                                                    &fs_partition, 1);
        if (part < 0)
-- 
2.43.0

base-commit: bfe90a308a94caa9d855440683521ff04122ae2a
branch: for-upstream/fs-null-dev-desc-dispatch

Reply via email to