diff --git a/patches/0071-ipq807x-add-ubi-force-detach-patch.patch b/patches/0071-ipq807x-add-ubi-force-detach-patch.patch new file mode 100644 index 000000000..ed9453453 --- /dev/null +++ b/patches/0071-ipq807x-add-ubi-force-detach-patch.patch @@ -0,0 +1,205 @@ +From 3dd22aa711f2f8c8e968d21cbac85beb713760af Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Sun, 16 Jul 2023 17:21:04 +0200 +Subject: [PATCH 41/43] ipq807x: add ubi force detach patch + +Signed-off-by: John Crispin +--- + .../patches/131-add_ubi_force_detach.patch | 185 ++++++++++++++++++ + 1 file changed, 185 insertions(+) + create mode 100644 package/utils/mtd-utils/patches/131-add_ubi_force_detach.patch + +diff --git a/package/utils/mtd-utils/patches/131-add_ubi_force_detach.patch b/package/utils/mtd-utils/patches/131-add_ubi_force_detach.patch +new file mode 100644 +index 0000000000..f3cd6a6b28 +--- /dev/null ++++ b/package/utils/mtd-utils/patches/131-add_ubi_force_detach.patch +@@ -0,0 +1,185 @@ ++--- a/include/mtd/ubi-user.h +++++ b/include/mtd/ubi-user.h ++@@ -176,6 +176,7 @@ ++ #define UBI_IOCATT _IOW(UBI_CTRL_IOC_MAGIC, 64, struct ubi_attach_req) ++ /* Detach an MTD device */ ++ #define UBI_IOCDET _IOW(UBI_CTRL_IOC_MAGIC, 65, int32_t) +++#define UBI_IOCFDET _IOW(UBI_CTRL_IOC_MAGIC, 99, int32_t) ++ ++ /* ioctl commands of UBI volume character devices */ ++ ++--- a/include/libubi.h +++++ b/include/libubi.h ++@@ -48,6 +48,7 @@ typedef void * libubi_t; ++ * number) ++ * @mtd_num: MTD device number to attach (used if @mtd_dev_node is %NULL) ++ * @mtd_dev_node: path to MTD device node to attach +++ * @force: set if the device should be removed even if it's busy ++ * @vid_hdr_offset: VID header offset (%0 means default offset and this is what ++ * most of the users want) ++ * @max_beb_per1024: Maximum expected bad eraseblocks per 1024 eraseblocks ++@@ -240,29 +241,33 @@ int ubi_attach(libubi_t desc, const char ++ * corresponding UBI device is removed. Returns zero in case of success and %-1 ++ * in case of failure. ++ */ ++-int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num); +++int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num, int force); ++ ++ /** ++ * ubi_detach - detach an MTD device by its node path. ++ * @desc: UBI library descriptor ++ * @node: name of the UBI control character device node ++ * @mtd_dev_node: path to an MTD device node +++ * @force: set if the device should be removed even if it's busy ++ * ++ * This function detaches an MTD device @mtd_dev_node from UBI. Returns zero in ++ * case of success and %-1 in case of failure. ++ */ ++-int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node); +++int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node, +++ int force); ++ ++ /** ++ * ubi_remove_dev - remove an UBI device. ++ * @desc: UBI library descriptor ++ * @node: name of the UBI control character device node ++ * @ubi_dev: UBI device number to remove +++ * @force: set if the device should be removed even if it's busy ++ * ++ * This function removes UBI device number @ubi_dev and returns zero in case of ++ * success and %-1 in case of failure. ++ */ ++-int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev); +++int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev, +++ int force); ++ ++ /** ++ * ubi_mkvol - create an UBI volume. ++--- a/lib/libubi.c +++++ b/lib/libubi.c ++@@ -808,7 +808,7 @@ int ubi_attach(libubi_t desc, const char ++ return ret; ++ } ++ ++-int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num) +++int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num, int force) ++ { ++ int ret, ubi_dev; ++ ++@@ -818,10 +818,11 @@ int ubi_detach_mtd(libubi_t desc, const ++ return ret; ++ } ++ ++- return ubi_remove_dev(desc, node, ubi_dev); +++ return ubi_remove_dev(desc, node, ubi_dev, force); ++ } ++ ++-int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node) +++int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node, +++ int force) ++ { ++ int mtd_num; ++ ++@@ -834,10 +835,10 @@ int ubi_detach(libubi_t desc, const char ++ if (mtd_num == -1) ++ return -1; ++ ++- return ubi_detach_mtd(desc, node, mtd_num); +++ return ubi_detach_mtd(desc, node, mtd_num, force); ++ } ++ ++-int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev) +++int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev, int force) ++ { ++ int fd, ret; ++ ++@@ -847,6 +848,10 @@ int ubi_remove_dev(libubi_t desc, const ++ if (fd == -1) ++ return sys_errmsg("cannot open \"%s\"", node); ++ ret = ioctl(fd, UBI_IOCDET, &ubi_dev); +++ if (force) +++ ret = ioctl(fd, UBI_IOCFDET, &ubi_dev); +++ else +++ ret = ioctl(fd, UBI_IOCDET, &ubi_dev); ++ if (ret == -1) ++ goto out_close; ++ ++--- a/ubi-utils/ubidetach.c +++++ b/ubi-utils/ubidetach.c ++@@ -40,6 +40,7 @@ struct args { ++ int mtdn; ++ const char *node; ++ const char *dev; +++ int force; ++ }; ++ ++ static struct args args = { ++@@ -47,6 +48,7 @@ static struct args args = { ++ .mtdn = -1, ++ .node = NULL, ++ .dev = NULL, +++ .force = 0, ++ }; ++ ++ static const char doc[] = PROGRAM_NAME " version " VERSION ++@@ -56,13 +58,14 @@ static const char optionsstr[] = ++ "-d, --devn= UBI device number to delete\n" ++ "-p, --dev-path= or alternatively, MTD device node path to detach\n" ++ "-m, --mtdn= or alternatively, MTD device number to detach\n" +++"-f, --force Force UBI detach even if it is still busy\n" ++ "-h, --help print help message\n" ++ "-V, --version print program version"; ++ ++ static const char usage[] = ++ "Usage: " PROGRAM_NAME " []\n" ++ "\t[-d ] [-m ] [-p ]\n" ++-"\t[--devn=] [--mtdn=]\n" +++"\t[--devn=] [--mtdn=] [-f]\n" ++ "\t[--dev-path=]\n" ++ "UBI control device defaults to " DEFAULT_CTRL_DEV " if not supplied.\n" ++ "Example 1: " PROGRAM_NAME " -p /dev/mtd0 - detach MTD device /dev/mtd0\n" ++@@ -83,7 +86,7 @@ static int parse_opt(int argc, char * co ++ while (1) { ++ int key, error = 0; ++ ++- key = getopt_long(argc, argv, "p:m:d:hV", long_options, NULL); +++ key = getopt_long(argc, argv, "p:m:d:fhV", long_options, NULL); ++ if (key == -1) ++ break; ++ ++@@ -104,6 +107,9 @@ static int parse_opt(int argc, char * co ++ return errmsg("bad MTD device number: \"%s\"", optarg); ++ ++ break; +++ case 'f': +++ args.force = 1; +++ break; ++ ++ case 'h': ++ printf("%s\n\n", doc); ++@@ -176,20 +182,22 @@ int main(int argc, char * const argv[]) ++ } ++ ++ if (args.devn != -1) { ++- err = ubi_remove_dev(libubi, args.node, args.devn); +++ err = ubi_remove_dev(libubi, args.node, args.devn, args.force); ++ if (err) { ++ sys_errmsg("cannot remove ubi%d", args.devn); ++ goto out_libubi; ++ } ++ } else { ++ if (args.dev != NULL) { ++- err = ubi_detach(libubi, args.node, args.dev); +++ err = ubi_detach(libubi, args.node, args.dev, +++ args.force); ++ if (err) { ++ sys_errmsg("cannot detach \"%s\"", args.dev); ++ goto out_libubi; ++ } ++ } else { ++- err = ubi_detach_mtd(libubi, args.node, args.mtdn); +++ err = ubi_detach_mtd(libubi, args.node, args.mtdn, +++ args.force); ++ if (err) { ++ sys_errmsg("cannot detach mtd%d", args.mtdn); ++ goto out_libubi; +-- +2.34.1 +