libfstools/mtd: attempt to read from OOB data if empty space is found
authorFelix Fietkau <nbd@nbd.name>
Thu, 9 Apr 2020 11:19:08 +0000 (13:19 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 9 Apr 2020 12:17:00 +0000 (14:17 +0200)
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 <nbd@nbd.name>
libfstools/mtd.c

index 77c71eeb29a3ba7a67c42514b5e17e324baf53d4..c5dce500c20283f5610b198d2b63a90e1a641893 100644 (file)
@@ -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;
 {
        struct mtd_volume *p = container_of(v, struct mtd_volume, v);;
        __u32 deadc0de;
-       __u16 jffs2;
        size_t sz;
 
        if (mtd_volume_load(p)) {
        size_t sz;
 
        if (mtd_volume_load(p)) {
@@ -202,6 +201,16 @@ static int mtd_volume_identify(struct volume *v)
                return -1;
        }
 
                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;
 
        if (deadc0de == __be32_to_cpu(0x4f575254))
                return FS_SNAPSHOT;
 
@@ -210,10 +219,9 @@ static int mtd_volume_identify(struct volume *v)
                return FS_DEADCODE;
        }
 
                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;
                return FS_JFFS2;
-       }
 
        if (v->type == UBIVOLUME && deadc0de == 0xffffffff) {
                return FS_JFFS2;
 
        if (v->type == UBIVOLUME && deadc0de == 0xffffffff) {
                return FS_JFFS2;