summaryrefslogtreecommitdiff
path: root/tools/env/fw_env.c
diff options
context:
space:
mode:
authorAlex Kiernan <alex.kiernan@gmail.com>2018-03-09 12:13:01 +0000
committerTom Rini <trini@konsulko.com>2018-03-19 16:14:19 -0400
commit899b5338fa695e4bb399b01861624f658e09174f (patch)
tree1939b11d105a00b8d10fe91f8ae71eefb0da7d2d /tools/env/fw_env.c
parent2deb3cac086ed1d7b62a02a41fe6645e9d07bb2b (diff)
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>
Diffstat (limited to 'tools/env/fw_env.c')
-rw-r--r--tools/env/fw_env.c92
1 files changed, 50 insertions, 42 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index f3bfee407d..600fe5dce0 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -1225,9 +1225,57 @@ static int flash_read(int fd)
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 @@ static int flash_io(int 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",