From e5ad92c588ce0d4ce9238a9dc920b345313417a8 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Tue, 18 Nov 2025 13:07:59 +0100 Subject: [PATCH] kernel: mtdsplit: rework and make use of -ENOENT error 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 --- target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c | 4 ++-- target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h | 4 ++-- .../linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c | 2 +- .../linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c | 6 +++--- .../generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c | 4 ++-- .../generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c | 6 +----- .../linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c | 4 ++-- .../generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c | 2 +- 8 files changed, 14 insertions(+), 18 deletions(-) diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c index b2e51dcfc6..42edb97c3a 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.c @@ -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); diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h index 71d62a8956..1d3f031733 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit.h @@ -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 */ diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c index 47818416f6..db29054357 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_elf.c @@ -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); diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c index 29d26f4057..b2042808e6 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_fit.c @@ -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, diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c index 1244bbdb06..a0ea81cfd6 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_jimage.c @@ -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; } diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c index 6d7980792a..7b7b6708da 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_mstc_boot.c @@ -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[] = { diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c index b853ec9e52..46a93ba38e 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_trx.c @@ -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; } diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c index 0d96854900..9bb55fc6b1 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c @@ -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; } -- 2.30.2