From 0917d223d14bca9edd3f8c91e2828a7a960a21d1 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sun, 1 May 2022 14:13:01 +0100 Subject: [PATCH] block: don't probe mtdblock on NAND (with legacy exceptions) Recent kernels started to spill warnings on the log if a userspace process open()s an mtdblock device backed by NAND flash: mtdblock: MTD device 'foo' is NAND, please consider using UBI block devices instead. The warning itself is legitimate -- one really shouldn't be using mtdblock on NAND. Hence make fstools skip probing mtdblock devices if their underlaying mtd device is of type 'nand'. As we don't want to break boards actually using JFFS2 and squashfs directly on NAND, still probe the mtdblock device in case the mtd device name is 'rootfs' or 'rootfs_data'. This will then also trigger the kernel warning as it should. Signed-off-by: Daniel Golle --- block.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/block.c b/block.c index 9f5cebf..3773a6e 100644 --- a/block.c +++ b/block.c @@ -481,11 +481,64 @@ static int config_load(char *cfg) return 0; } +static bool mtdblock_is_nand(char *mtdnum) +{ + char tmppath[64]; + char buf[16]; + FILE *fp; + + snprintf(tmppath, sizeof(tmppath) - 1, "/sys/class/mtd/mtd%s/type", mtdnum); + fp = fopen(tmppath, "r"); + if (!fp) + return false; + + if (!fgets(buf, sizeof(buf), fp)) { + fclose(fp); + return false; + } + fclose(fp); + buf[sizeof(buf) - 1] = '\0'; /* make sure buf is 0-terminated */ + buf[strlen(buf) - 1] = '\0'; /* strip final char (newline) */ + + if (strcmp(buf, "nand")) + return false; + + /* + * --- CUT HERE --- + * Keep probing rootfs and rootfs_data in the meantime to not break + * devices using JFFS2 on NAND but only trigger the kernel warnings. + * Remove this once all devices using JFFS2 and squashfs directly on + * NAND have been converted to UBI. + */ + snprintf(tmppath, sizeof(tmppath) - 1, "/sys/class/mtd/mtd%s/name", mtdnum); + fp = fopen(tmppath, "r"); + if (!fp) + return false; + + if (!fgets(buf, sizeof(buf), fp)) { + fclose(fp); + return false; + } + fclose(fp); + buf[sizeof(buf) - 1] = '\0'; /* make sure buf is 0-terminated */ + buf[strlen(buf) - 1] = '\0'; /* strip final char (newline) */ + + /* only return true if name differs from 'rootfs' and 'rootfs_data' */ + if (strcmp(buf, "rootfs") && strcmp(buf, "rootfs_data")) + return true; + + /* --- CUT HERE --- */ + return false; +} + static struct probe_info* _probe_path(char *path) { struct probe_info *pr, *epr; char tmppath[64]; + if (!strncmp(path, "/dev/mtdblock", 13) && mtdblock_is_nand(path + 13)) + return NULL; + pr = probe_path(path); if (!pr) return NULL; -- 2.30.2