Recently aio_p{read,write} changed to perform retries internally rather than returning -EIOCBRETRY. This inadvertantly resulted in always calling aio_{read,write} with ki_left at 0 which would in turn immediately return 0. Harmless, but we can avoid this call by checking in the caller.
Unified · Split
| @@ -1347,7 +1347,7 @@ static ssize_t aio_pread(struct kiocb *iocb) · 1346 unmodified lines | ||
| 1347 | 1347 | * regular files we retry till we complete the entire read or |
| 1348 | 1348 | * find that we can't read any more data (e.g short reads). |
| 1349 | 1349 | */ |
| 1350 | − } while (ret > 0 && | |
| 1350 | + } while (ret > 0 && iocb->ki_left > 0 && | |
| 1351 | 1351 | !S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode)); |
| 1352 | 1352 | |
| 1353 | 1353 | /* This means we must have transferred all that we could */ |
| @@ -1371,7 +1371,7 @@ static ssize_t aio_pwrite(struct kiocb *iocb) · 17 unmodified lines | ||
| 1371 | 1371 | iocb->ki_buf += ret; |
| 1372 | 1372 | iocb->ki_left -= ret; |
| 1373 | 1373 | } |
| 1374 | − } while (ret > 0); | |
| 1374 | + } while (ret > 0 && iocb->ki_left > 0); | |
| 1375 | 1375 | |
| 1376 | 1376 | if ((ret == 0) || (iocb->ki_left == 0)) |
| 1377 | 1377 | ret = iocb->ki_nbytes - iocb->ki_left; |