mirror of https://gitee.com/openkylin/qemu.git
block: change discard to co_discard
Since coroutine operation is now mandatory, convert both bdrv_discard implementations to coroutines. For qcow2, this means taking the lock around the operation. raw-posix remains synchronous. The bdrv_discard callback is then unused and can be eliminated. Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
8b94ff8573
commit
6db39ae2e2
2
block.c
2
block.c
|
@ -2962,8 +2962,6 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
|
|||
qemu_coroutine_yield();
|
||||
return co.ret;
|
||||
}
|
||||
} else if (bs->drv->bdrv_discard) {
|
||||
return bs->drv->bdrv_discard(bs, sector_num, nb_sectors);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -978,11 +978,17 @@ static int qcow2_make_empty(BlockDriverState *bs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int qcow2_discard(BlockDriverState *bs, int64_t sector_num,
|
||||
int nb_sectors)
|
||||
static coroutine_fn int qcow2_co_discard(BlockDriverState *bs,
|
||||
int64_t sector_num, int nb_sectors)
|
||||
{
|
||||
return qcow2_discard_clusters(bs, sector_num << BDRV_SECTOR_BITS,
|
||||
int ret;
|
||||
BDRVQcowState *s = bs->opaque;
|
||||
|
||||
qemu_co_mutex_lock(&s->lock);
|
||||
ret = qcow2_discard_clusters(bs, sector_num << BDRV_SECTOR_BITS,
|
||||
nb_sectors);
|
||||
qemu_co_mutex_unlock(&s->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qcow2_truncate(BlockDriverState *bs, int64_t offset)
|
||||
|
@ -1239,7 +1245,7 @@ static BlockDriver bdrv_qcow2 = {
|
|||
.bdrv_co_writev = qcow2_co_writev,
|
||||
.bdrv_co_flush = qcow2_co_flush,
|
||||
|
||||
.bdrv_discard = qcow2_discard,
|
||||
.bdrv_co_discard = qcow2_co_discard,
|
||||
.bdrv_truncate = qcow2_truncate,
|
||||
.bdrv_write_compressed = qcow2_write_compressed,
|
||||
|
||||
|
|
|
@ -602,7 +602,8 @@ static int xfs_discard(BDRVRawState *s, int64_t sector_num, int nb_sectors)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
|
||||
static coroutine_fn int raw_co_discard(BlockDriverState *bs,
|
||||
int64_t sector_num, int nb_sectors)
|
||||
{
|
||||
#ifdef CONFIG_XFS
|
||||
BDRVRawState *s = bs->opaque;
|
||||
|
@ -632,7 +633,7 @@ static BlockDriver bdrv_file = {
|
|||
.bdrv_file_open = raw_open,
|
||||
.bdrv_close = raw_close,
|
||||
.bdrv_create = raw_create,
|
||||
.bdrv_discard = raw_discard,
|
||||
.bdrv_co_discard = raw_co_discard,
|
||||
|
||||
.bdrv_aio_readv = raw_aio_readv,
|
||||
.bdrv_aio_writev = raw_aio_writev,
|
||||
|
|
|
@ -62,8 +62,6 @@ struct BlockDriver {
|
|||
const uint8_t *buf, int nb_sectors);
|
||||
void (*bdrv_close)(BlockDriverState *bs);
|
||||
int (*bdrv_create)(const char *filename, QEMUOptionParameter *options);
|
||||
int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num,
|
||||
int nb_sectors);
|
||||
int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
|
||||
int nb_sectors, int *pnum);
|
||||
int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
|
||||
|
|
Loading…
Reference in New Issue