diff mbox series

[mtd-utils,1/2] ubiattach: introduce disable_fm in UBI_IOCATT

Message ID 20231113094812.853529-2-chengzhihao1@huawei.com
State Not Applicable
Delegated to: David Oberhollenzer
Headers show
Series Add two new fields in ubiattach ioctl | expand

Commit Message

Zhihao Cheng Nov. 13, 2023, 9:48 a.m. UTC
The ioctl UBI_IOCATT has been extended with disable_fm parameter after
[1].

This parameter is used for disabling fastmap for target ubi device.
If 'disable_fm' is set, ubi doesn't create new fastmap even the module
param 'fm_autoconvert' is set, and existed old fastmap will be destroyed
after attaching process.

A simple test case in [2].

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=669d204469c46e91d99da24914130f78277a71d3
[2] https://bugzilla.kernel.org/show_bug.cgi?id=216278

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
---
 include/libubi.h       |  3 +++
 include/mtd/ubi-user.h |  8 +++++++-
 lib/libubi.c           |  1 +
 ubi-utils/ubiattach.c  | 14 ++++++++++++--
 4 files changed, 23 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/include/libubi.h b/include/libubi.h
index 46c732a..8ea11e0 100644
--- a/include/libubi.h
+++ b/include/libubi.h
@@ -25,6 +25,7 @@ 
 
 #include <ctype.h>
 #include <stdint.h>
+#include <stdbool.h>
 #include <mtd/ubi-user.h>
 
 #ifdef __cplusplus
@@ -53,6 +54,7 @@  typedef void * libubi_t;
  * @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
+ * @disable_fm: whether disable fastmap
  */
 struct ubi_attach_request
 {
@@ -61,6 +63,7 @@  struct ubi_attach_request
 	const char *mtd_dev_node;
 	int vid_hdr_offset;
 	int max_beb_per1024;
+	bool disable_fm;
 };
 
 /**
diff --git a/include/mtd/ubi-user.h b/include/mtd/ubi-user.h
index 707c4f2..a389693 100644
--- a/include/mtd/ubi-user.h
+++ b/include/mtd/ubi-user.h
@@ -235,6 +235,7 @@  enum {
  * @mtd_num: MTD device number to attach
  * @vid_hdr_offset: VID header offset (use defaults if %0)
  * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
+ * @disable_fm: whether disable fastmap
  * @padding: reserved for future, not used, has to be zeroed
  *
  * This data structure is used to specify MTD device UBI has to attach and the
@@ -270,13 +271,18 @@  enum {
  * eraseblocks for new bad eraseblocks, but attempts to use available
  * eraseblocks (if any). The accepted range is 0-768. If 0 is given, the
  * default kernel value of %CONFIG_MTD_UBI_BEB_LIMIT will be used.
+ *
+ * If @disable_fm is not zero, ubi doesn't create new fastmap even the module
+ * param 'fm_autoconvert' is set, and existed old fastmap will be destroyed
+ * after doing full scanning.
  */
 struct ubi_attach_req {
 	int32_t ubi_num;
 	int32_t mtd_num;
 	int32_t vid_hdr_offset;
 	int16_t max_beb_per1024;
-	int8_t  padding[10];
+	int8_t	disable_fm;
+	int8_t  padding[9];
 };
 
 /*
diff --git a/lib/libubi.c b/lib/libubi.c
index baaca2f..410d104 100644
--- a/lib/libubi.c
+++ b/lib/libubi.c
@@ -767,6 +767,7 @@  int ubi_attach(libubi_t desc, const char *node, struct ubi_attach_request *req)
 	r.ubi_num = req->dev_num;
 	r.mtd_num = req->mtd_num;
 	r.vid_hdr_offset = req->vid_hdr_offset;
+	r.disable_fm = req->disable_fm ? 1 : 0;
 
 	if (req->max_beb_per1024) {
 		/*
diff --git a/ubi-utils/ubiattach.c b/ubi-utils/ubiattach.c
index 09f85af..527a735 100644
--- a/ubi-utils/ubiattach.c
+++ b/ubi-utils/ubiattach.c
@@ -42,6 +42,7 @@  struct args {
 	const char *node;
 	const char *dev;
 	int max_beb_per1024;
+	bool disable_fm;
 };
 
 static struct args args = {
@@ -51,6 +52,7 @@  static struct args args = {
 	.node = NULL,
 	.dev = NULL,
 	.max_beb_per1024 = 0,
+	.disable_fm = false,
 };
 
 static const char doc[] = PROGRAM_NAME " version " VERSION
@@ -67,6 +69,8 @@  static const char optionsstr[] =
 "-b, --max-beb-per1024 maximum expected bad block number per 1024 eraseblock.\n"
 "                      The default value is correct for most NAND devices.\n"
 "                      Allowed range is 0-768, 0 means the default kernel value.\n"
+"-f, --disable-fastmap don't create new fastmap and do full scanning (existed\n"
+"                      fastmap will be destroyed) for the given ubi device.\n"
 "-h, --help            print help message\n"
 "-V, --version         print program version";
 
@@ -74,7 +78,7 @@  static const char usage[] =
 "Usage: " PROGRAM_NAME " [<UBI control device node file name>]\n"
 "\t[-m <MTD device number>] [-d <UBI device number>] [-p <path to device>]\n"
 "\t[--mtdn=<MTD device number>] [--devn=<UBI device number>]\n"
-"\t[--dev-path=<path to device>]\n"
+"\t[--dev-path=<path to device>] [-f] [--disable-fastmap]\n"
 "\t[--max-beb-per1024=<maximum bad block number per 1024 blocks>]\n"
 "UBI control device defaults to " DEFAULT_CTRL_DEV " if not supplied.\n"
 "Example 1: " PROGRAM_NAME " -p /dev/mtd0 - attach /dev/mtd0 to UBI\n"
@@ -93,6 +97,7 @@  static const struct option long_options[] = {
 	{ .name = "mtdn",            .has_arg = 1, .flag = NULL, .val = 'm' },
 	{ .name = "vid-hdr-offset",  .has_arg = 1, .flag = NULL, .val = 'O' },
 	{ .name = "max-beb-per1024", .has_arg = 1, .flag = NULL, .val = 'b' },
+	{ .name = "disable-fastmap", .has_arg = 0, .flag = NULL, .val = 'f' },
 	{ .name = "help",            .has_arg = 0, .flag = NULL, .val = 'h' },
 	{ .name = "version",         .has_arg = 0, .flag = NULL, .val = 'V' },
 	{ NULL, 0, NULL, 0},
@@ -103,7 +108,7 @@  static int parse_opt(int argc, char * const argv[])
 	while (1) {
 		int key, error = 0;
 
-		key = getopt_long(argc, argv, "p:m:d:O:b:hV", long_options, NULL);
+		key = getopt_long(argc, argv, "p:m:d:O:b:fhV", long_options, NULL);
 		if (key == -1)
 			break;
 
@@ -143,6 +148,10 @@  static int parse_opt(int argc, char * const argv[])
 
 			break;
 
+		case 'f':
+			args.disable_fm = true;
+			break;
+
 		case 'h':
 			printf("%s\n\n", doc);
 			printf("%s\n\n", usage);
@@ -213,6 +222,7 @@  int main(int argc, char * const argv[])
 	req.vid_hdr_offset = args.vidoffs;
 	req.mtd_dev_node = args.dev;
 	req.max_beb_per1024 = args.max_beb_per1024;
+	req.disable_fm = args.disable_fm;
 
 	err = ubi_attach(libubi, args.node, &req);
 	if (err < 0) {