tools: env: Refactor write path of flash_io()

Extract write path of flash_io() into a separate function. This patch
should be a functional no-op.

Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
Reviewed-by: Stefano Babic <sbabic@denx.de>
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index f3bfee4..600fe5d 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -1225,9 +1225,57 @@
 	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);
@@ -1239,51 +1287,11 @@
 	}
 
 	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",