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,
|
||||
aiocb->aio_fd2, &out_off,
|
||||
bytes, 0);
|
||||
if (ret == -EINTR) {
|
||||
continue;
|
||||
if (ret == 0) {
|
||||
/* No progress (e.g. when beyond EOF), let the caller fall back to
|
||||
* buffer I/O. */
|
||||
return -ENOSPC;
|
||||
}
|
||||
if (ret < 0) {
|
||||
if (errno == ENOSYS) {
|
||||
switch (errno) {
|
||||
case ENOSYS:
|
||||
return -ENOTSUP;
|
||||
} else {
|
||||
case EINTR:
|
||||
continue;
|
||||
default:
|
||||
return -errno;
|
||||
}
|
||||
}
|
||||
if (!ret) {
|
||||
/* No progress (e.g. when beyond EOF), fall back to buffer I/O. */
|
||||
return -ENOTSUP;
|
||||
}
|
||||
bytes -= ret;
|
||||
}
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user