diff options
author | Josef Bacik <josef@toxicpanda.com> | 2022-08-19 11:53:39 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2022-08-22 18:08:07 +0200 |
commit | 79d3d1d12e6f22c904195f9356069859e2595f00 (patch) | |
tree | f5e765449759728e886bdb80e1203b7518365048 /net/bluetooth/mgmt_config.h | |
parent | 4a445b7b6178d88956192c0202463063f52e8667 (diff) | |
download | linux-stable-79d3d1d12e6f22c904195f9356069859e2595f00.tar.gz linux-stable-79d3d1d12e6f22c904195f9356069859e2595f00.tar.bz2 linux-stable-79d3d1d12e6f22c904195f9356069859e2595f00.zip |
btrfs: don't allow large NOWAIT direct reads
Dylan and Jens reported a problem where they had an io_uring test that
was returning short reads, and bisected it to ee5b46a353af ("btrfs:
increase direct io read size limit to 256 sectors").
The root cause is their test was doing larger reads via io_uring with
NOWAIT and async. This was triggering a page fault during the direct
read, however the first page was able to work just fine and thus we
submitted a 4k read for a larger iocb.
Btrfs allows for partial IO's in this case specifically because we don't
allow page faults, and thus we'll attempt to do any io that we can,
submit what we could, come back and fault in the rest of the range and
try to do the remaining IO.
However for !is_sync_kiocb() we'll call ->ki_complete() as soon as the
partial dio is done, which is incorrect. In the sync case we can exit
the iomap code, submit more io's, and return with the amount of IO we
were able to complete successfully.
We were always doing short reads in this case, but for NOWAIT we were
getting saved by the fact that we were limiting direct reads to
sectorsize, and if we were larger than that we would return EAGAIN.
Fix the regression by simply returning EAGAIN in the NOWAIT case with
larger reads, that way io_uring can retry and get the larger IO and have
the fault logic handle everything properly.
This still leaves the AIO short read case, but that existed before this
change. The way to properly fix this would be to handle partial iocb
completions, but that's a lot of work, for now deal with the regression
in the most straightforward way possible.
Reported-by: Dylan Yudaken <dylany@fb.com>
Fixes: ee5b46a353af ("btrfs: increase direct io read size limit to 256 sectors")
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'net/bluetooth/mgmt_config.h')
0 files changed, 0 insertions, 0 deletions