]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: mtdsplit_h3c_vfs: return 0 for non-fatal errors 19475/head
authorJan Hoffmann <jan@3e8.eu>
Sun, 20 Jul 2025 17:07:29 +0000 (19:07 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 27 Jul 2025 16:24:50 +0000 (18:24 +0200)
Since Linux 6.7, introduced with commit 5c2f7727d437 ("mtd: mtdpart:
check for subpartitions parsing result"), errors during subpartition
parsing cause all MTD partitions to be torn down.

Since the current mtdsplit driver for devices using H3C VFS returns
-EINVAL if it does not find a file system containing an OpenWrt image,
this makes initial installation of OpenWrt impossible.

Work around this by returning 0 when the file system contains unexpected
data. Also print a message in this case to show what is going on.

Signed-off-by: Jan Hoffmann <jan@3e8.eu>
Link: https://github.com/openwrt/openwrt/pull/19475
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_h3c_vfs.c

index f264233dbd9de32a2f32ed82519619b2c330a1e7..25993e762bf9c5d60410f53cd3408dc8e34e20b2 100644 (file)
@@ -98,8 +98,11 @@ static int mtdsplit_h3c_vfs_parse(struct mtd_info *mtd,
        if (retlen != sizeof(format_flag))
                return -EIO;
 
-       if (format_flag != FORMAT_FLAG)
-               return -EINVAL;
+       if (format_flag != FORMAT_FLAG) {
+               pr_info("mtdsplit_h3c_vfs: unexpected format flag %08x\n",
+                       format_flag);
+               return 0;
+       }
 
        /* Check file entry */
        err = mtd_read(mtd, FILE_ENTRY_OFFSET, sizeof(file_entry), &retlen,
@@ -110,20 +113,14 @@ static int mtdsplit_h3c_vfs_parse(struct mtd_info *mtd,
        if (retlen != sizeof(file_entry))
                return -EIO;
 
-       if (file_entry.flags != FILE_ENTRY_FLAGS)
-               return -EINVAL;
-
-       if (file_entry.parent_block != FILE_ENTRY_PARENT_BLOCK)
-               return -EINVAL;
-
-       if (file_entry.parent_index != FILE_ENTRY_PARENT_INDEX)
-               return -EINVAL;
-
-       if (file_entry.data_block != FILE_ENTRY_DATA_BLOCK)
-               return -EINVAL;
-
-       if (strncmp(file_entry.name, FILE_ENTRY_NAME, sizeof(file_entry.name)) != 0)
-               return -EINVAL;
+       if (file_entry.flags != FILE_ENTRY_FLAGS ||
+           file_entry.parent_block != FILE_ENTRY_PARENT_BLOCK ||
+           file_entry.parent_index != FILE_ENTRY_PARENT_INDEX ||
+           file_entry.data_block != FILE_ENTRY_DATA_BLOCK ||
+           strncmp(file_entry.name, FILE_ENTRY_NAME, sizeof(file_entry.name)) != 0) {
+               pr_info("mtdsplit_h3c_vfs: unexpected file entry - OpenWrt probably not installed\n");
+               return 0;
+       }
 
        /* Find rootfs offset */
        kernel_size = block_offset(file_entry.data_block +