diff options
author | Daniel Golle <daniel@makrotopia.org> | 2022-05-01 14:13:01 +0100 |
---|---|---|
committer | Daniel Golle <daniel@makrotopia.org> | 2022-05-01 16:56:39 +0100 |
commit | 0917d223d14bca9edd3f8c91e2828a7a960a21d1 (patch) | |
tree | 5f3a9a035782767713511ecb78abd47a5610fad6 | |
parent | 898b328d9ee4b0158df5a972d19924864ec9bfaf (diff) | |
download | fstools-0917d223d14bca9edd3f8c91e2828a7a960a21d1.tar.gz |
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 <daniel@makrotopia.org>
-rw-r--r-- | block.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -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; |