Reboot and retry on I/O errors
When I/O error happens, reboot and retry installation two times
before we abort this OTA update.
Bug: 25633753
Change-Id: Iba6d4203a343a725aa625a41d237606980d62f69
(cherry picked from commit 3c62b67faf8a25f1dd1c44dc19759c3997fdfd36)
diff --git a/otafault/ota_io.cpp b/otafault/ota_io.cpp
index 02e80f9..a378040 100644
--- a/otafault/ota_io.cpp
+++ b/otafault/ota_io.cpp
@@ -38,6 +38,8 @@
#endif // defined (TARGET_READ_FAULT)
#endif // defined (TARGET_INJECT_FAULTS)
+bool have_eio_error = false;
+
int ota_open(const char* path, int oflags) {
#if defined (TARGET_INJECT_FAULTS)
// Let the caller handle errors; we do not care if open succeeds or fails
@@ -90,12 +92,22 @@
&& FilenameCache[(intptr_t)stream] == FaultFileName) {
FaultFileName = "";
errno = EIO;
+ have_eio_error = true;
return 0;
} else {
- return fread(ptr, size, nitems, stream);
+ size_t status = fread(ptr, size, nitems, stream);
+ // If I/O error occurs, set the retry-update flag.
+ if (status != nitems && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
}
#else
- return fread(ptr, size, nitems, stream);
+ size_t status = fread(ptr, size, nitems, stream);
+ if (status != nitems && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
#endif
}
@@ -105,12 +117,21 @@
&& FilenameCache[fd] == FaultFileName) {
FaultFileName = "";
errno = EIO;
+ have_eio_error = true;
return -1;
} else {
- return read(fd, buf, nbyte);
+ ssize_t status = read(fd, buf, nbyte);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
}
#else
- return read(fd, buf, nbyte);
+ ssize_t status = read(fd, buf, nbyte);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
#endif
}
@@ -120,12 +141,21 @@
&& FilenameCache[(intptr_t)stream] == FaultFileName) {
FaultFileName = "";
errno = EIO;
+ have_eio_error = true;
return 0;
} else {
- return fwrite(ptr, size, count, stream);
+ size_t status = fwrite(ptr, size, count, stream);
+ if (status != count && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
}
#else
- return fwrite(ptr, size, count, stream);
+ size_t status = fwrite(ptr, size, count, stream);
+ if (status != count && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
#endif
}
@@ -135,12 +165,21 @@
&& FilenameCache[fd] == FaultFileName) {
FaultFileName = "";
errno = EIO;
+ have_eio_error = true;
return -1;
} else {
- return write(fd, buf, nbyte);
+ ssize_t status = write(fd, buf, nbyte);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
}
#else
- return write(fd, buf, nbyte);
+ ssize_t status = write(fd, buf, nbyte);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
#endif
}
@@ -151,10 +190,19 @@
FaultFileName = "";
errno = EIO;
return -1;
+ have_eio_error = true;
} else {
- return fsync(fd);
+ int status = fsync(fd);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
}
#else
- return fsync(fd);
+ int status = fsync(fd);
+ if (status == -1 && errno == EIO) {
+ have_eio_error = true;
+ }
+ return status;
#endif
}