From: Felix Fietkau Date: Thu, 9 Apr 2020 11:19:08 +0000 (+0200) Subject: libfstools/mtd: attempt to read from OOB data if empty space is found X-Git-Url: http://git.openwrt.org/?p=project%2Ffstools.git;a=commitdiff_plain;h=c80f7002114f65dc40895c9064c077d9631b8f6e;ds=sidebyside libfstools/mtd: attempt to read from OOB data if empty space is found When using jffs2 on NAND flash, it stores its magic in the OOB data on newly erased blocks. This change fixes identifying the filesystem type. Signed-off-by: Felix Fietkau --- diff --git a/libfstools/mtd.c b/libfstools/mtd.c index 77c71ee..c5dce50 100644 --- a/libfstools/mtd.c +++ b/libfstools/mtd.c @@ -187,7 +187,6 @@ static int mtd_volume_identify(struct volume *v) { struct mtd_volume *p = container_of(v, struct mtd_volume, v);; __u32 deadc0de; - __u16 jffs2; size_t sz; if (mtd_volume_load(p)) { @@ -202,6 +201,16 @@ static int mtd_volume_identify(struct volume *v) return -1; } + if (deadc0de == ~0) { + struct mtd_oob_buf oob = { + .start = 0, + .length = sizeof(deadc0de), + .ptr = (void *)&deadc0de, + }; + + ioctl(p->fd, MEMREADOOB, &oob); + } + if (deadc0de == __be32_to_cpu(0x4f575254)) return FS_SNAPSHOT; @@ -210,10 +219,9 @@ static int mtd_volume_identify(struct volume *v) return FS_DEADCODE; } - jffs2 = __be16_to_cpu(deadc0de >> 16); - if (jffs2 == 0x1985) { + if (__be16_to_cpu(deadc0de) == 0x1985 || + __be16_to_cpu(deadc0de >> 16) == 0x1985) return FS_JFFS2; - } if (v->type == UBIVOLUME && deadc0de == 0xffffffff) { return FS_JFFS2;