summaryrefslogtreecommitdiff
path: root/fs/fat
diff options
context:
space:
mode:
authorRicardo Salveti <ricardo@foundries.io>2021-09-26 21:36:04 +0300
committerTom Rini <trini@konsulko.com>2021-10-12 16:49:21 -0400
commit41130eb8937e43b2307fb67ebb60f0190fc01438 (patch)
treeb5e6473d4c10c563ef3659b55968311a8737723c /fs/fat
parent0892a7e5fa5ce38f58e0e6636ae56c6f60c080e0 (diff)
downloadu-boot-41130eb8937e43b2307fb67ebb60f0190fc01438.tar.gz
u-boot-41130eb8937e43b2307fb67ebb60f0190fc01438.tar.bz2
u-boot-41130eb8937e43b2307fb67ebb60f0190fc01438.zip
fs: fat: check for buffer size before reading blocks
This patch optimizes the commit mentioned below by avoiding running a set of commands which are useless in the case when size < mydata->sect_size and sect_count would be 0. Fixes: 5b3ddb17ba ("fs/fat/fat.c: Do not perform zero block reads if there are no blocks left") Signed-off-by: Ricardo Salveti <ricardo@foundries.io> Co-developed-by: Oleksandr Suvorov <oleksandr.suvorov@foundries.io> Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@foundries.io>
Diffstat (limited to 'fs/fat')
-rw-r--r--fs/fat/fat.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 7021138b98..65f77c4f75 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -275,22 +275,19 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
buffer += mydata->sect_size;
size -= mydata->sect_size;
}
- } else {
- __u32 idx;
-
- idx = size / mydata->sect_size;
- if (idx == 0)
- ret = 0;
- else
- ret = disk_read(startsect, idx, buffer);
- if (ret != idx) {
+ } else if (size >= mydata->sect_size) {
+ __u32 bytes_read;
+ __u32 sect_count = size / mydata->sect_size;
+
+ ret = disk_read(startsect, sect_count, buffer);
+ if (ret != sect_count) {
debug("Error reading data (got %d)\n", ret);
return -1;
}
- startsect += idx;
- idx *= mydata->sect_size;
- buffer += idx;
- size -= idx;
+ bytes_read = sect_count * mydata->sect_size;
+ startsect += sect_count;
+ buffer += bytes_read;
+ size -= bytes_read;
}
if (size) {
ALLOC_CACHE_ALIGN_BUFFER(__u8, tmpbuf, mydata->sect_size);