libfstools/mtd: attempt to read from OOB data if empty space is found
[project/fstools.git] / libfstools / mtd.c
index 2603a15303ed589233b106bcb3a3c6bdd85f8b82..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;
-       __u16 jffs2;
        size_t sz;
 
        if (mtd_volume_load(p)) {
@@ -198,10 +197,20 @@ static int mtd_volume_identify(struct volume *v)
        sz = read(p->fd, &deadc0de, sizeof(deadc0de));
 
        if (sz != sizeof(deadc0de)) {
-               ULOG_ERR("reading %s failed: %s\n", v->name, strerror(errno));
+               ULOG_ERR("reading %s failed: %m\n", v->name);
                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;
@@ -275,7 +283,7 @@ static int mtd_volume_init(struct volume *v)
 
        ret = ioctl(p->fd, MEMGETINFO, &mtdinfo);
        if (ret) {
-               ULOG_ERR("ioctl(%d, MEMGETINFO) failed: %s\n", p->fd, strerror(errno));
+               ULOG_ERR("ioctl(%d, MEMGETINFO) failed: %m\n", p->fd);
        } else {
                struct erase_info_user mtdlock;