From 899b5338fa695e4bb399b01861624f658e09174f Mon Sep 17 00:00:00 2001 From: Alex Kiernan Date: Fri, 9 Mar 2018 12:13:01 +0000 Subject: [PATCH] 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 Reviewed-by: Stefano Babic --- tools/env/fw_env.c | 92 +++++++++++++++++++++++++--------------------- 1 file 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", -- 2.39.5