raw: Support BDRV_REQ_FUA
Pass through the FUA flag to the lower layer so that the separate flush can be saved in practically relevant cases where a (raw) format driver sits on top of the protocol driver. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
2b556518c3
commit
5481531154
@ -57,8 +57,9 @@ static int coroutine_fn raw_co_readv(BlockDriverState *bs, int64_t sector_num,
|
|||||||
return bdrv_co_readv(bs->file->bs, sector_num, nb_sectors, qiov);
|
return bdrv_co_readv(bs->file->bs, sector_num, nb_sectors, qiov);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int coroutine_fn raw_co_writev(BlockDriverState *bs, int64_t sector_num,
|
static int coroutine_fn
|
||||||
int nb_sectors, QEMUIOVector *qiov)
|
raw_co_writev_flags(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
|
||||||
|
QEMUIOVector *qiov, int flags)
|
||||||
{
|
{
|
||||||
void *buf = NULL;
|
void *buf = NULL;
|
||||||
BlockDriver *drv;
|
BlockDriver *drv;
|
||||||
@ -104,7 +105,8 @@ static int coroutine_fn raw_co_writev(BlockDriverState *bs, int64_t sector_num,
|
|||||||
}
|
}
|
||||||
|
|
||||||
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
|
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
|
||||||
ret = bdrv_co_writev(bs->file->bs, sector_num, nb_sectors, qiov);
|
ret = bdrv_co_do_pwritev(bs->file->bs, sector_num * BDRV_SECTOR_SIZE,
|
||||||
|
nb_sectors * BDRV_SECTOR_SIZE, qiov, flags);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (qiov == &local_qiov) {
|
if (qiov == &local_qiov) {
|
||||||
@ -114,6 +116,13 @@ fail:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int coroutine_fn
|
||||||
|
raw_co_writev(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
|
||||||
|
QEMUIOVector *qiov)
|
||||||
|
{
|
||||||
|
return raw_co_writev_flags(bs, sector_num, nb_sectors, qiov, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs,
|
static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs,
|
||||||
int64_t sector_num,
|
int64_t sector_num,
|
||||||
int nb_sectors, int *pnum,
|
int nb_sectors, int *pnum,
|
||||||
@ -248,6 +257,8 @@ BlockDriver bdrv_raw = {
|
|||||||
.bdrv_create = &raw_create,
|
.bdrv_create = &raw_create,
|
||||||
.bdrv_co_readv = &raw_co_readv,
|
.bdrv_co_readv = &raw_co_readv,
|
||||||
.bdrv_co_writev = &raw_co_writev,
|
.bdrv_co_writev = &raw_co_writev,
|
||||||
|
.bdrv_co_writev_flags = &raw_co_writev_flags,
|
||||||
|
.supported_write_flags = BDRV_REQ_FUA,
|
||||||
.bdrv_co_write_zeroes = &raw_co_write_zeroes,
|
.bdrv_co_write_zeroes = &raw_co_write_zeroes,
|
||||||
.bdrv_co_discard = &raw_co_discard,
|
.bdrv_co_discard = &raw_co_discard,
|
||||||
.bdrv_co_get_block_status = &raw_co_get_block_status,
|
.bdrv_co_get_block_status = &raw_co_get_block_status,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user