kernel: mtdsplit: rework and make use of -ENOENT error
authorChristian Marangi <[email protected]>
Tue, 18 Nov 2025 12:07:59 +0000 (13:07 +0100)
committerChristian Marangi <[email protected]>
Tue, 18 Nov 2025 12:07:59 +0000 (13:07 +0100)
Rework each affected mtdsplit driver to make use of -ENOENT error
instead of -ENODEV to handle new kernel that checks error from parser on
subpartitions.

The only acceptable error is -ENOENT that skip the parser. This follow
pattern used upstream and also by an mtdsplit parser, mtdsplit_bcm_wfi,
and also by a workaround currently implemented for mtdsplit_mstc_boot.

Signed-off-by: Christian Marangi <[email protected]>
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c

index b2e51dcfc66b6c2caffdf3fb613fa9659a210d0b..42edb97c3a30ffb7bce09b6c4a735f44b0b6be3a 100644 (file)
@@ -53,7 +53,7 @@ int mtd_get_squashfs_len(struct mtd_info *master,
        retlen = le64_to_cpu(sb.bytes_used);
        if (retlen <= 0) {
                pr_alert("squashfs is empty in \"%s\"\n", master->name);
-               return -ENODEV;
+               return -ENOENT;
        }
 
        if (offset + retlen > master->size) {
@@ -124,7 +124,7 @@ int mtd_find_rootfs_from(struct mtd_info *mtd,
                return 0;
        }
 
-       return -ENODEV;
+       return -ENOENT;
 }
 EXPORT_SYMBOL_GPL(mtd_find_rootfs_from);
 
index 71d62a8956b28290c54489d067585bd024fb59ba..1d3f031733e8f090e8cdcdc2273ba12e405710aa 100644 (file)
@@ -45,7 +45,7 @@ static inline int mtd_get_squashfs_len(struct mtd_info *master,
                                       size_t offset,
                                       size_t *squashfs_len)
 {
-       return -ENODEV;
+       return -ENOENT;
 }
 
 static inline int mtd_check_rootfs_magic(struct mtd_info *mtd, size_t offset,
@@ -60,7 +60,7 @@ static inline int mtd_find_rootfs_from(struct mtd_info *mtd,
                                       size_t *ret_offset,
                                       enum mtdsplit_part_type *type)
 {
-       return -ENODEV;
+       return -ENOENT;
 }
 #endif /* CONFIG_MTD_SPLIT */
 
index 47818416f61c1ad03cfa17b68178aab78230016e..db29054357d6d91dc72844b88672337d38306212 100644 (file)
@@ -241,7 +241,7 @@ static int mtdsplit_parse_elf(struct mtd_info *mtd,
 
        if (rootfs_offset == mtd->size) {
                pr_debug("no rootfs found in \"%s\"\n", mtd->name);
-               return -ENODEV;
+               return -ENOENT;
        }
 
        parts = kzalloc(ELF_NR_PARTS * sizeof(*parts), GFP_KERNEL);
index 29d26f4057179d4dc3187491a56bf34883588099..b2042808e6ccf83f3b6502f26b1dee11808e7f51 100644 (file)
@@ -210,7 +210,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd,
 
        of_property_read_string(np, "openwrt,cmdline-match", &cmdline_match);
        if (cmdline_match && !strstr(saved_command_line, cmdline_match))
-               return -ENODEV;
+               return -ENOENT;
 
        of_property_read_u32(np, "openwrt,fit-offset", &offset_start);
 
@@ -247,7 +247,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd,
        if (fit_size == 0) {
                pr_err("FIT image in \"%s\" at offset %llx has null size\n",
                       mtd->name, (unsigned long long) fit_offset);
-               return -ENODEV;
+               return -ENOENT;
        }
 
        /*
@@ -304,7 +304,7 @@ mtdsplit_fit_parse(struct mtd_info *mtd,
                if (images_noffset < 0) {
                        pr_err("Can't find images parent node '%s' (%s)\n",
                        FIT_IMAGES_PATH, fdt_strerror(images_noffset));
-                       return -ENODEV;
+                       return -ENOENT;
                }
 
                for (ndepth = 0,
index 1244bbdb06e580f47e2fbc1e69179ffa484c5b96..a0ea81cfd6dea86043ffe1c3d10168cca66cd03f 100644 (file)
@@ -147,7 +147,7 @@ static int __mtdsplit_parse_jimage(struct mtd_info *master,
 
        if (jimage_size == 0) {
                pr_debug("no jImage found in \"%s\"\n", master->name);
-               ret = -ENODEV;
+               ret = -ENOENT;
                goto err_free_buf;
        }
 
@@ -186,7 +186,7 @@ static int __mtdsplit_parse_jimage(struct mtd_info *master,
 
        if (rootfs_size == 0) {
                pr_debug("no rootfs found in \"%s\"\n", master->name);
-               ret = -ENODEV;
+               ret = -ENOENT;
                goto err_free_buf;
        }
 
index 6d7980792aedc730d64afeaf090d9b08a546e703..7b7b6708da47dceff89d5acb16a9bde9cf6f4683 100644 (file)
@@ -247,11 +247,7 @@ mtdsplit_mstcboot_parse(struct mtd_info *mtd,
                ret = mstcboot_parse_image_parts(mtd, pparts);
 
 exit:
-       /*
-        * return 0 when ret=-ENODEV, to prevent deletion of
-        * parent mtd partitions on Linux 6.7 and later
-        */
-       return ret == -ENODEV ? 0 : ret;
+       return ret;
 }
 
 static const struct of_device_id mtdsplit_mstcboot_of_match_table[] = {
index b853ec9e5283836af9981e90dbfbbdb17de869d7..46a93ba38e0debed0f8a67f7211f6a990a877a6b 100644 (file)
@@ -100,7 +100,7 @@ mtdsplit_parse_trx(struct mtd_info *master,
 
        if (trx_size == 0) {
                pr_debug("no trx header found in \"%s\"\n", master->name);
-               ret = -ENODEV;
+               ret = -ENOENT;
                goto err;
        }
 
@@ -111,7 +111,7 @@ mtdsplit_parse_trx(struct mtd_info *master,
 
        if (rootfs_size == 0) {
                pr_debug("no rootfs found in \"%s\"\n", master->name);
-               ret = -ENODEV;
+               ret = -ENOENT;
                goto err;
        }
 
index 0d96854900309f792e02e5ec902c464192ae493b..9bb55fc6b1f02e3ca15d66aa78e09fc1ac7dbb58 100644 (file)
@@ -226,7 +226,7 @@ static int __mtdsplit_parse_uimage(struct mtd_info *master,
 
        if (rootfs_size == 0) {
                pr_debug("no rootfs found in \"%s\"\n", master->name);
-               ret = -ENODEV;
+               ret = -ENOENT;
                goto err_free_buf;
        }