block/io: introduce bdrv_co_p{read, write}v_part
Introduce extended variants of bdrv_co_preadv and bdrv_co_pwritev with qiov_offset parameter. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 20190604161514.262241-10-vsementsov@virtuozzo.com Message-Id: <20190604161514.262241-10-vsementsov@virtuozzo.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
committed by
Stefan Hajnoczi
parent
28c4da2869
commit
1acc3466a2
29
block/io.c
29
block/io.c
@@ -1614,7 +1614,8 @@ static void bdrv_padding_destroy(BdrvRequestPadding *pad)
|
|||||||
*
|
*
|
||||||
* Function always succeeds.
|
* Function always succeeds.
|
||||||
*/
|
*/
|
||||||
static bool bdrv_pad_request(BlockDriverState *bs, QEMUIOVector **qiov,
|
static bool bdrv_pad_request(BlockDriverState *bs,
|
||||||
|
QEMUIOVector **qiov, size_t *qiov_offset,
|
||||||
int64_t *offset, unsigned int *bytes,
|
int64_t *offset, unsigned int *bytes,
|
||||||
BdrvRequestPadding *pad)
|
BdrvRequestPadding *pad)
|
||||||
{
|
{
|
||||||
@@ -1623,11 +1624,12 @@ static bool bdrv_pad_request(BlockDriverState *bs, QEMUIOVector **qiov,
|
|||||||
}
|
}
|
||||||
|
|
||||||
qemu_iovec_init_extended(&pad->local_qiov, pad->buf, pad->head,
|
qemu_iovec_init_extended(&pad->local_qiov, pad->buf, pad->head,
|
||||||
*qiov, 0, *bytes,
|
*qiov, *qiov_offset, *bytes,
|
||||||
pad->buf + pad->buf_len - pad->tail, pad->tail);
|
pad->buf + pad->buf_len - pad->tail, pad->tail);
|
||||||
*bytes += pad->head + pad->tail;
|
*bytes += pad->head + pad->tail;
|
||||||
*offset -= pad->head;
|
*offset -= pad->head;
|
||||||
*qiov = &pad->local_qiov;
|
*qiov = &pad->local_qiov;
|
||||||
|
*qiov_offset = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1635,6 +1637,14 @@ static bool bdrv_pad_request(BlockDriverState *bs, QEMUIOVector **qiov,
|
|||||||
int coroutine_fn bdrv_co_preadv(BdrvChild *child,
|
int coroutine_fn bdrv_co_preadv(BdrvChild *child,
|
||||||
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
||||||
BdrvRequestFlags flags)
|
BdrvRequestFlags flags)
|
||||||
|
{
|
||||||
|
return bdrv_co_preadv_part(child, offset, bytes, qiov, 0, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
int coroutine_fn bdrv_co_preadv_part(BdrvChild *child,
|
||||||
|
int64_t offset, unsigned int bytes,
|
||||||
|
QEMUIOVector *qiov, size_t qiov_offset,
|
||||||
|
BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = child->bs;
|
BlockDriverState *bs = child->bs;
|
||||||
BdrvTrackedRequest req;
|
BdrvTrackedRequest req;
|
||||||
@@ -1655,12 +1665,12 @@ int coroutine_fn bdrv_co_preadv(BdrvChild *child,
|
|||||||
flags |= BDRV_REQ_COPY_ON_READ;
|
flags |= BDRV_REQ_COPY_ON_READ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_pad_request(bs, &qiov, &offset, &bytes, &pad);
|
bdrv_pad_request(bs, &qiov, &qiov_offset, &offset, &bytes, &pad);
|
||||||
|
|
||||||
tracked_request_begin(&req, bs, offset, bytes, BDRV_TRACKED_READ);
|
tracked_request_begin(&req, bs, offset, bytes, BDRV_TRACKED_READ);
|
||||||
ret = bdrv_aligned_preadv(child, &req, offset, bytes,
|
ret = bdrv_aligned_preadv(child, &req, offset, bytes,
|
||||||
bs->bl.request_alignment,
|
bs->bl.request_alignment,
|
||||||
qiov, 0, flags);
|
qiov, qiov_offset, flags);
|
||||||
tracked_request_end(&req);
|
tracked_request_end(&req);
|
||||||
bdrv_dec_in_flight(bs);
|
bdrv_dec_in_flight(bs);
|
||||||
|
|
||||||
@@ -2023,6 +2033,13 @@ out:
|
|||||||
int coroutine_fn bdrv_co_pwritev(BdrvChild *child,
|
int coroutine_fn bdrv_co_pwritev(BdrvChild *child,
|
||||||
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
||||||
BdrvRequestFlags flags)
|
BdrvRequestFlags flags)
|
||||||
|
{
|
||||||
|
return bdrv_co_pwritev_part(child, offset, bytes, qiov, 0, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child,
|
||||||
|
int64_t offset, unsigned int bytes, QEMUIOVector *qiov, size_t qiov_offset,
|
||||||
|
BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = child->bs;
|
BlockDriverState *bs = child->bs;
|
||||||
BdrvTrackedRequest req;
|
BdrvTrackedRequest req;
|
||||||
@@ -2054,14 +2071,14 @@ int coroutine_fn bdrv_co_pwritev(BdrvChild *child,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_pad_request(bs, &qiov, &offset, &bytes, &pad)) {
|
if (bdrv_pad_request(bs, &qiov, &qiov_offset, &offset, &bytes, &pad)) {
|
||||||
mark_request_serialising(&req, align);
|
mark_request_serialising(&req, align);
|
||||||
wait_serialising_requests(&req);
|
wait_serialising_requests(&req);
|
||||||
bdrv_padding_rmw_read(child, &req, &pad, false);
|
bdrv_padding_rmw_read(child, &req, &pad, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = bdrv_aligned_pwritev(child, &req, offset, bytes, align,
|
ret = bdrv_aligned_pwritev(child, &req, offset, bytes, align,
|
||||||
qiov, 0, flags);
|
qiov, qiov_offset, flags);
|
||||||
|
|
||||||
bdrv_padding_destroy(&pad);
|
bdrv_padding_destroy(&pad);
|
||||||
|
|
||||||
|
@@ -959,9 +959,15 @@ extern BlockDriver bdrv_qcow2;
|
|||||||
int coroutine_fn bdrv_co_preadv(BdrvChild *child,
|
int coroutine_fn bdrv_co_preadv(BdrvChild *child,
|
||||||
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
||||||
BdrvRequestFlags flags);
|
BdrvRequestFlags flags);
|
||||||
|
int coroutine_fn bdrv_co_preadv_part(BdrvChild *child,
|
||||||
|
int64_t offset, unsigned int bytes,
|
||||||
|
QEMUIOVector *qiov, size_t qiov_offset, BdrvRequestFlags flags);
|
||||||
int coroutine_fn bdrv_co_pwritev(BdrvChild *child,
|
int coroutine_fn bdrv_co_pwritev(BdrvChild *child,
|
||||||
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
int64_t offset, unsigned int bytes, QEMUIOVector *qiov,
|
||||||
BdrvRequestFlags flags);
|
BdrvRequestFlags flags);
|
||||||
|
int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child,
|
||||||
|
int64_t offset, unsigned int bytes,
|
||||||
|
QEMUIOVector *qiov, size_t qiov_offset, BdrvRequestFlags flags);
|
||||||
|
|
||||||
static inline int coroutine_fn bdrv_co_pread(BdrvChild *child,
|
static inline int coroutine_fn bdrv_co_pread(BdrvChild *child,
|
||||||
int64_t offset, unsigned int bytes, void *buf, BdrvRequestFlags flags)
|
int64_t offset, unsigned int bytes, void *buf, BdrvRequestFlags flags)
|
||||||
|
Reference in New Issue
Block a user