Commit 6db39ae2 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Kevin Wolf
Browse files

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: default avatarKevin Wolf <kwolf@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 8b94ff85
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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;
    }
+10 −4
Original line number Diff line number Diff line
@@ -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,

+3 −2
Original line number Diff line number Diff line
@@ -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,
+0 −2
Original line number Diff line number Diff line
@@ -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);