[PATCH] fs/fat/fat.c: Do not perform zero block reads if there are no blocks left
Tom Rini
trini at konsulko.com
Fri Jun 19 20:15:30 CEST 2020
On Fri, Jun 19, 2020 at 10:12:20AM -0700, Jason Wessel wrote:
> v2: Fix indentation and remove unneeded braces.
Series notes go below the '--- '
>
> While using u-boot with qemu's virtio driver I stumbled across a
> problem reading files less than sector size. On the real hardware the
> block reader seems ok with reading zero blocks, and while we could fix
> the virtio host side of qemu to deal with a zero block read instead of
> crashing, the u-boot fat driver should not be doing zero block reads
> in the first place. If you ask hardware to read zero blocks you are
> just going to get zero data. There may also be other hardware that
> responds similarly to the virtio interface so this is worth fixing.
>
> Without the patch I get the following and have to restart qemu because
> it dies.
> ---------------------------------
> => fatls virtio 0:1
> 30 cmdline.txt
> => fatload virtio 0:1 ${loadaddr} cmdline.txt
> qemu-system-aarch64: virtio: zero sized buffers are not allowed
> ---------------------------------
>
> With the patch I get the expected results.
> ---------------------------------
> => fatls virtio 0:1
> 30 cmdline.txt
> => fatload virtio 0:1 ${loadaddr} cmdline.txt
> 30 bytes read in 11 ms (2 KiB/s)
> => md.b ${loadaddr} 0x1E
> 40080000: 64 77 63 5f 6f 74 67 2e 6c 70 6d 5f 65 6e 61 62 dwc_otg.lpm_enab
> 40080010: 6c 65 3d 30 20 72 6f 6f 74 77 61 69 74 0a le=0 rootwait.
>
> ---------------------------------
>
> Signed-off-by: Jason Wessel <jason.wessel at windriver.com>
> ---
> fs/fat/fat.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
> index 7fd29470c1..8233a74620 100644
> --- a/fs/fat/fat.c
> +++ b/fs/fat/fat.c
> @@ -278,7 +278,11 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
> }
> } else {
> idx = size / mydata->sect_size;
> - ret = disk_read(startsect, idx, buffer);
> + if (idx == 0) {
> + ret = 0;
> + } else {
> + ret = disk_read(startsect, idx, buffer);
> + }
> if (ret != idx) {
> debug("Error reading data (got %d)\n", ret);
> return -1;
Spacing is still off and still extra braces. Code looks fine tho,
thanks!
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200619/78604ff6/attachment.sig>
More information about the U-Boot
mailing list