Message ID | 20231213121354.13303-1-zajec5@gmail.com |
---|---|
State | Accepted |
Commit | 9e3003f79d168eac7ee65cd457e3904e2fb4eea8 |
Delegated to: | Tom Rini |
Headers | show |
Series | fw_env: keep calling read() until whole flash block is read | expand |
On Wed, Dec 13, 2023 at 01:13:54PM +0100, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > It's totally valid for read() to provide less bytes than requested > maximum. It may happen if there is no more data available yet or source > pushes data in small chunks. > > This actually happens when trying to read env data from NVMEM device. > Kernel may provide NVMEM content in page size parts (like 4096 B). > > This fixes warnings like: > Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 16384 bytes but got 4096 > Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 12288 bytes but got 4096 > Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 8192 bytes but got 4096 > > Since the main loop in flash_read_buf() is used to read blocks this > patch adds a new nested one. > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Applied to u-boot/next, thanks!
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 0347e9d15a..90010dabd8 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -948,29 +948,25 @@ static int flash_read_buf(int dev, int fd, void *buf, size_t count, */ lseek(fd, blockstart + block_seek, SEEK_SET); - rc = read(fd, buf + processed, readlen); - if (rc == -1) { - fprintf(stderr, "Read error on %s: %s\n", - DEVNAME(dev), strerror(errno)); - return -1; - } + while (readlen) { + rc = read(fd, buf + processed, readlen); + if (rc == -1) { + fprintf(stderr, "Read error on %s: %s\n", + DEVNAME(dev), strerror(errno)); + return -1; + } #ifdef DEBUG - fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n", - rc, (unsigned long long)blockstart + block_seek, - DEVNAME(dev)); + fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n", + rc, (unsigned long long)blockstart + block_seek, + DEVNAME(dev)); #endif - processed += rc; - if (rc != readlen) { - fprintf(stderr, - "Warning on %s: Attempted to read %zd bytes but got %d\n", - DEVNAME(dev), readlen, rc); + processed += rc; readlen -= rc; - block_seek += rc; - } else { - blockstart += blocklen; - readlen = min(blocklen, count - processed); - block_seek = 0; } + + blockstart += blocklen; + readlen = min(blocklen, count - processed); + block_seek = 0; } return processed;