Skip to contentSkip to conversation

MTD-Utils: fix handling of ioctl return value in nand-utils

PATCH In review Frank Haverkamp 2 participants 2 messages Mar 14, 2007 – Mar 15, 2007 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 MTD-Utils: fix handling of ioctl return value in nand-utils

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.

---
 nanddump.c  |   16 ++++++++--------
 nandwrite.c |   14 +++++++-------
 2 files changed, 15 insertions(+), 15 deletions(-)
nandwrite.c +7 -7
@@ -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);
+			}
 		}
 	}
 
nanddump.c +8 -8
@@ -170,7 +170,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];
@@ -206,9 +206,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);
@@ -221,14 +224,11 @@ int main(int argc, char **argv)
 				}
 				oobinfochanged = 1;
 				break;
-
-			case 0:
-				oobinfochanged = 2;
-				break;
 			default:
 				perror ("MTDFILEMODE");
 				close (fd);
 				exit (1);
+			}
 		}
 	} else {
 
#1 lore raw
Quoted 7 lines · Frank Haverkamp

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.

This looks good. Applied. Thank you.

josh