return 0;
}
+static int flash_io_write(int fd_current)
+{
+ int fd_target, rc, dev_target;
+
+ if (have_redund_env) {
+ /* switch to next partition for writing */
+ dev_target = !dev_current;
+ /* dev_target: fd_target, erase_target */
+ fd_target = open(DEVNAME(dev_target), O_RDWR);
+ if (fd_target < 0) {
+ fprintf(stderr,
+ "Can't open %s: %s\n",
+ DEVNAME(dev_target), strerror(errno));
+ rc = -1;
+ goto exit;
+ }
+ } else {
+ dev_target = dev_current;
+ fd_target = fd_current;
+ }
+
+ rc = flash_write(fd_current, fd_target, dev_target);
+
+ if (fsync(fd_current) && !(errno == EINVAL || errno == EROFS)) {
+ fprintf(stderr,
+ "fsync failed on %s: %s\n",
+ DEVNAME(dev_current), strerror(errno));
+ }
+
+ if (have_redund_env) {
+ if (fsync(fd_target) &&
+ !(errno == EINVAL || errno == EROFS)) {
+ fprintf(stderr,
+ "fsync failed on %s: %s\n",
+ DEVNAME(dev_current), strerror(errno));
+ }
+
+ if (close(fd_target)) {
+ fprintf(stderr,
+ "I/O error on %s: %s\n",
+ DEVNAME(dev_target), strerror(errno));
+ rc = -1;
+ }
+ }
+ exit:
+ return rc;
+}
+
static int flash_io(int mode)
{
- int fd_current, fd_target, rc, dev_target;
+ int fd_current, rc;
/* dev_current: fd_current, erase_current */
fd_current = open(DEVNAME(dev_current), mode);
}
if (mode == O_RDWR) {
- if (have_redund_env) {
- /* switch to next partition for writing */
- dev_target = !dev_current;
- /* dev_target: fd_target, erase_target */
- fd_target = open(DEVNAME(dev_target), mode);
- if (fd_target < 0) {
- fprintf(stderr,
- "Can't open %s: %s\n",
- DEVNAME(dev_target), strerror(errno));
- rc = -1;
- goto exit;
- }
- } else {
- dev_target = dev_current;
- fd_target = fd_current;
- }
-
- rc = flash_write(fd_current, fd_target, dev_target);
-
- if (fsync(fd_current) && !(errno == EINVAL || errno == EROFS)) {
- fprintf(stderr,
- "fsync failed on %s: %s\n",
- DEVNAME(dev_current), strerror(errno));
- }
-
- if (have_redund_env) {
- if (fsync(fd_target) &&
- !(errno == EINVAL || errno == EROFS)) {
- fprintf(stderr,
- "fsync failed on %s: %s\n",
- DEVNAME(dev_current), strerror(errno));
- }
-
- if (close(fd_target)) {
- fprintf(stderr,
- "I/O error on %s: %s\n",
- DEVNAME(dev_target), strerror(errno));
- rc = -1;
- }
- }
+ rc = flash_io_write(fd_current);
} else {
rc = flash_read(fd_current);
}
- exit:
if (close(fd_current)) {
fprintf(stderr,
"I/O error on %s: %s\n",