diff options
author | Alex Kiernan <alex.kiernan@gmail.com> | 2018-03-09 12:13:01 +0000 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2018-03-19 16:14:19 -0400 |
commit | 899b5338fa695e4bb399b01861624f658e09174f (patch) | |
tree | 1939b11d105a00b8d10fe91f8ae71eefb0da7d2d /tools/env/fw_env.c | |
parent | 2deb3cac086ed1d7b62a02a41fe6645e9d07bb2b (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.c | 92 |
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", |