Commit 11e111ae authored by Zhihao Cheng's avatar Zhihao Cheng
Browse files

ubi: fastmap: Add module parameter to control reserving filling pool PEBs

mainline inclusion
from mainline-v6.7-rc1
commit d4c48e5b58f12835de779f5425ef741c4d0fb53e
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9195H
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d4c48e5b58f12835de779f5425ef741c4d0fb53e



-------------------------------------------------

Adding 6th module parameter in 'mtd=xxx' to control whether or not
reserving PEBs for filling pool/wl_pool.

Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 60133598
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@
#define MTD_PARAM_LEN_MAX 64

/* Maximum number of comma-separated items in the 'mtd=' parameter */
#define MTD_PARAM_MAX_COUNT 5
#define MTD_PARAM_MAX_COUNT 6

/* Maximum value for the number of bad PEBs per 1024 PEBs */
#define MAX_MTD_UBI_BEB_LIMIT 768
@@ -53,6 +53,7 @@
 * @vid_hdr_offs: VID header offset
 * @max_beb_per1024: maximum expected number of bad PEBs per 1024 PEBs
 * @enable_fm: enable fastmap when value is non-zero
 * @need_resv_pool: reserve pool->max_size pebs when value is none-zero
 */
struct mtd_dev_param {
	char name[MTD_PARAM_LEN_MAX];
@@ -60,6 +61,7 @@ struct mtd_dev_param {
	int vid_hdr_offs;
	int max_beb_per1024;
	int enable_fm;
	int need_resv_pool;
};

/* Numbers of elements set in the @mtd_dev_param array */
@@ -827,6 +829,7 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
 * @vid_hdr_offset: VID header offset
 * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
 * @disable_fm: whether disable fastmap
 * @need_resv_pool: whether reserve pebs to fill fm_pool
 *
 * This function attaches MTD device @mtd_dev to UBI and assign @ubi_num number
 * to the newly created UBI device, unless @ubi_num is %UBI_DEV_NUM_AUTO, in
@@ -842,7 +845,8 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
 * @ubi_devices_mutex.
 */
int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
		       int vid_hdr_offset, int max_beb_per1024, bool disable_fm)
		       int vid_hdr_offset, int max_beb_per1024, bool disable_fm,
		       bool need_resv_pool)
{
	struct ubi_device *ubi;
	int i, err;
@@ -952,7 +956,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
		UBI_FM_MIN_POOL_SIZE);

	ubi->fm_wl_pool.max_size = ubi->fm_pool.max_size / 2;
	ubi->fm_pool_rsv_cnt = ubi->fm_pool.max_size;
	ubi->fm_pool_rsv_cnt = need_resv_pool ? ubi->fm_pool.max_size : 0;
	ubi->fm_disabled = (!fm_autoconvert || disable_fm) ? 1 : 0;
	if (fm_debug)
		ubi_enable_dbg_chk_fastmap(ubi);
@@ -1275,7 +1279,8 @@ static int __init ubi_init(void)
		mutex_lock(&ubi_devices_mutex);
		err = ubi_attach_mtd_dev(mtd, p->ubi_num,
					 p->vid_hdr_offs, p->max_beb_per1024,
					 p->enable_fm == 0);
					 p->enable_fm == 0,
					 p->need_resv_pool != 0);
		mutex_unlock(&ubi_devices_mutex);
		if (err < 0) {
			pr_err("UBI error: cannot attach mtd%d\n",
@@ -1485,6 +1490,18 @@ static int ubi_mtd_param_parse(const char *val, const struct kernel_param *kp)
	} else
		p->enable_fm = 0;

	token = tokens[5];
	if (token) {
		int err = kstrtoint(token, 10, &p->need_resv_pool);

		if (err) {
			pr_err("UBI error: bad value for need_resv_pool parameter: %s\n",
				token);
			return -EINVAL;
		}
	} else
		p->need_resv_pool = 0;

	mtd_devs += 1;
	return 0;
}
@@ -1498,6 +1515,7 @@ MODULE_PARM_DESC(mtd, "MTD devices to attach. Parameter format: mtd=<name|num|pa
		      __stringify(CONFIG_MTD_UBI_BEB_LIMIT) ") if 0)\n"
		      "Optional \"ubi_num\" parameter specifies UBI device number which have to be assigned to the newly created UBI device (assigned automatically by default)\n"
		      "Optional \"enable_fm\" parameter determines whether to enable fastmap during attach. If the value is non-zero, fastmap is enabled. Default value is 0.\n"
		      "Optional \"need_resv_pool\" parameter determines whether to reserve pool->max_size pebs during attach. If the value is non-zero, peb reservation is enabled. Default value is 0.\n"
		      "\n"
		      "Example 1: mtd=/dev/mtd0 - attach MTD device /dev/mtd0.\n"
		      "Example 2: mtd=content,1984 mtd=4 - attach MTD device with name \"content\" using VID header offset 1984, and MTD device number 4 with default VID header offset.\n"
+2 −1
Original line number Diff line number Diff line
@@ -1041,7 +1041,8 @@ static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
		 */
		mutex_lock(&ubi_devices_mutex);
		err = ubi_attach_mtd_dev(mtd, req.ubi_num, req.vid_hdr_offset,
					 req.max_beb_per1024, !!req.disable_fm);
					 req.max_beb_per1024, !!req.disable_fm,
					 false);
		mutex_unlock(&ubi_devices_mutex);
		if (err < 0)
			put_mtd_device(mtd);
+1 −1
Original line number Diff line number Diff line
@@ -917,7 +917,7 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
/* build.c */
int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
		       int vid_hdr_offset, int max_beb_per1024,
		       bool disable_fm);
		       bool disable_fm, bool need_resv_pool);
int ubi_detach_mtd_dev(int ubi_num, int anyway);
struct ubi_device *ubi_get_device(int ubi_num);
void ubi_put_device(struct ubi_device *ubi);