mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[PATCH] aio: avoid extra aio_{read,write} call when ki_left == 0
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. Signed-off-by: Zach Brown <zach.brown@oracle.com> Signed-off-by: Benjamin LaHaise <bcrl@linux.intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
897f15fb58
commit
353fb07e20
4
fs/aio.c
4
fs/aio.c
@ -1347,7 +1347,7 @@ static ssize_t aio_pread(struct kiocb *iocb)
|
|||||||
* regular files we retry till we complete the entire read or
|
* regular files we retry till we complete the entire read or
|
||||||
* find that we can't read any more data (e.g short reads).
|
* find that we can't read any more data (e.g short reads).
|
||||||
*/
|
*/
|
||||||
} while (ret > 0 &&
|
} while (ret > 0 && iocb->ki_left > 0 &&
|
||||||
!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode));
|
!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode));
|
||||||
|
|
||||||
/* This means we must have transferred all that we could */
|
/* This means we must have transferred all that we could */
|
||||||
@ -1371,7 +1371,7 @@ static ssize_t aio_pwrite(struct kiocb *iocb)
|
|||||||
iocb->ki_buf += ret;
|
iocb->ki_buf += ret;
|
||||||
iocb->ki_left -= ret;
|
iocb->ki_left -= ret;
|
||||||
}
|
}
|
||||||
} while (ret > 0);
|
} while (ret > 0 && iocb->ki_left > 0);
|
||||||
|
|
||||||
if ((ret == 0) || (iocb->ki_left == 0))
|
if ((ret == 0) || (iocb->ki_left == 0))
|
||||||
ret = iocb->ki_nbytes - iocb->ki_left;
|
ret = iocb->ki_nbytes - iocb->ki_left;
|
||||||
|
Loading…
Reference in New Issue
Block a user