file-posix: Fix EINTR handling
EINTR should be checked against errno, not ret. While fixing the bug, collect the branches with a switch block. Also, change the return value from -ENOSTUP to -ENOSPC when the actual issue is request range passes EOF, which should be distinguishable from the case of error == ENOSYS by the caller, so that it could still retry with other byte ranges, whereas it shouldn't retry anymore upon ENOSYS. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
1439b9c110
commit
c436e3d014
|
@ -1488,20 +1488,21 @@ static ssize_t handle_aiocb_copy_range(RawPosixAIOData *aiocb)
|
||||||
ssize_t ret = copy_file_range(aiocb->aio_fildes, &in_off,
|
ssize_t ret = copy_file_range(aiocb->aio_fildes, &in_off,
|
||||||
aiocb->aio_fd2, &out_off,
|
aiocb->aio_fd2, &out_off,
|
||||||
bytes, 0);
|
bytes, 0);
|
||||||
if (ret == -EINTR) {
|
if (ret == 0) {
|
||||||
continue;
|
/* No progress (e.g. when beyond EOF), let the caller fall back to
|
||||||
|
* buffer I/O. */
|
||||||
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (errno == ENOSYS) {
|
switch (errno) {
|
||||||
|
case ENOSYS:
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
} else {
|
case EINTR:
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ret) {
|
|
||||||
/* No progress (e.g. when beyond EOF), fall back to buffer I/O. */
|
|
||||||
return -ENOTSUP;
|
|
||||||
}
|
|
||||||
bytes -= ret;
|
bytes -= ret;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue