]> www.infradead.org Git - mtd-utils.git/commitdiff
MTD-Utils: fix handling of ioctl return value in nand-utils
authorFrank Haverkamp <haver@vnet.ibm.com>
Wed, 14 Mar 2007 13:17:07 +0000 (14:17 +0100)
committerJosh Boyer <jwboyer@gmail.com>
Thu, 15 Mar 2007 13:07:47 +0000 (08:07 -0500)
Older kernel do not implement the MTDFILEMODE ioctl. In this case
nandwrite and nanddump should have used MEMGETOOBSEL in combination
with MEMSETOOBSEL. Unfortunately the return value of the unsucessfull
ioctl is not -ENOTTY, but -1 and errno contains ENOTTY. This change
fixes this issue. I have not tested all cornercases. Would be
good if someone could do more careful testing than I did, or maybe
reviewing is sufficient in this case.

Signed-off-by: Frank Haverkamp <haver@vnet.ibm.com>
Signed-off-by: Josh Boyer <jwboyer@gmail.com>
nanddump.c
nandwrite.c

index 463ddcc1750f6a75c5e24d4c9a9c438f1356cc43..f1b58a924482a63af78cf84c84b1868faac3df8b 100644 (file)
@@ -171,7 +171,7 @@ int main(int argc, char **argv)
 {
        unsigned long ofs, end_addr = 0;
        unsigned long long blockstart = 1;
-       int i, fd, ofd, bs, badblock = 0;
+       int ret, i, fd, ofd, bs, badblock = 0;
        struct mtd_oob_buf oob = {0, 16, oobbuf};
        mtd_info_t meminfo;
        char pretty_buf[80];
@@ -208,9 +208,12 @@ int main(int argc, char **argv)
        oob.length = meminfo.oobsize;
 
        if (noecc)  {
-               switch (ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW)) {
-
-                       case -ENOTTY:
+               ret = ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW);
+               if (ret == 0) {
+                       oobinfochanged = 2;
+               } else {
+                       switch (errno) {
+                       case ENOTTY:
                                if (ioctl (fd, MEMGETOOBSEL, &old_oobinfo) != 0) {
                                        perror ("MEMGETOOBSEL");
                                        close (fd);
@@ -223,14 +226,11 @@ int main(int argc, char **argv)
                                }
                                oobinfochanged = 1;
                                break;
-
-                       case 0:
-                               oobinfochanged = 2;
-                               break;
                        default:
                                perror ("MTDFILEMODE");
                                close (fd);
                                exit (1);
+                       }
                }
        } else {
 
index f4c399d5396ddc99c071ca993a6b7099d94d3d66..f74581d0eee260e56ee581c2b985a60be47b25d0 100644 (file)
@@ -271,9 +271,12 @@ int main(int argc, char **argv)
        }
 
        if (noecc)  {
-               switch (ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW)) {
-
-                       case -ENOTTY:
+               ret = ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW);
+               if (ret == 0) {
+                       oobinfochanged = 2;
+               } else {
+                       switch (errno) {
+                       case ENOTTY:
                                if (ioctl (fd, MEMGETOOBSEL, &old_oobinfo) != 0) {
                                        perror ("MEMGETOOBSEL");
                                        close (fd);
@@ -286,14 +289,11 @@ int main(int argc, char **argv)
                                }
                                oobinfochanged = 1;
                                break;
-
-                       case 0:
-                               oobinfochanged = 2;
-                               break;
                        default:
                                perror ("MTDFILEMODE");
                                close (fd);
                                exit (1);
+                       }
                }
        }