Commit 353fb07e authored by Zach Brown's avatar Zach Brown Committed by Linus Torvalds

[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: default avatarZach Brown <zach.brown@oracle.com>
Signed-off-by: default avatarBenjamin LaHaise <bcrl@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 897f15fb
...@@ -1347,7 +1347,7 @@ static ssize_t aio_pread(struct kiocb *iocb) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment