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:
Vladimir Sementsov-Ogievskiy
2019-06-04 19:15:11 +03:00
committed by Stefan Hajnoczi
parent 28c4da2869
commit 1acc3466a2
2 changed files with 29 additions and 6 deletions

View File

@@ -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);

View File

@@ -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)