block: Add opaque value to the amend CB

Add an opaque value which is to be passed to the bdrv_amend_options()
status callback.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Max Reitz 2015-07-27 17:51:32 +02:00 committed by Kevin Wolf
parent bd5072d756
commit 8b13976d3f
7 changed files with 24 additions and 18 deletions

View File

@ -4068,12 +4068,12 @@ void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
} }
int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts, int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
BlockDriverAmendStatusCB *status_cb) BlockDriverAmendStatusCB *status_cb, void *cb_opaque)
{ {
if (!bs->drv->bdrv_amend_options) { if (!bs->drv->bdrv_amend_options) {
return -ENOTSUP; return -ENOTSUP;
} }
return bs->drv->bdrv_amend_options(bs, opts, status_cb); return bs->drv->bdrv_amend_options(bs, opts, status_cb, cb_opaque);
} }
/* This function will be called by the bdrv_recurse_is_first_non_filter method /* This function will be called by the bdrv_recurse_is_first_non_filter method

View File

@ -1641,7 +1641,8 @@ fail:
static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table, static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
int l1_size, int64_t *visited_l1_entries, int l1_size, int64_t *visited_l1_entries,
int64_t l1_entries, int64_t l1_entries,
BlockDriverAmendStatusCB *status_cb) BlockDriverAmendStatusCB *status_cb,
void *cb_opaque)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
bool is_active_l1 = (l1_table == s->l1_table); bool is_active_l1 = (l1_table == s->l1_table);
@ -1667,7 +1668,7 @@ static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
/* unallocated */ /* unallocated */
(*visited_l1_entries)++; (*visited_l1_entries)++;
if (status_cb) { if (status_cb) {
status_cb(bs, *visited_l1_entries, l1_entries); status_cb(bs, *visited_l1_entries, l1_entries, cb_opaque);
} }
continue; continue;
} }
@ -1804,7 +1805,7 @@ static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
(*visited_l1_entries)++; (*visited_l1_entries)++;
if (status_cb) { if (status_cb) {
status_cb(bs, *visited_l1_entries, l1_entries); status_cb(bs, *visited_l1_entries, l1_entries, cb_opaque);
} }
} }
@ -1828,7 +1829,8 @@ fail:
* qcow2 version which doesn't yet support metadata zero clusters. * qcow2 version which doesn't yet support metadata zero clusters.
*/ */
int qcow2_expand_zero_clusters(BlockDriverState *bs, int qcow2_expand_zero_clusters(BlockDriverState *bs,
BlockDriverAmendStatusCB *status_cb) BlockDriverAmendStatusCB *status_cb,
void *cb_opaque)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
uint64_t *l1_table = NULL; uint64_t *l1_table = NULL;
@ -1845,7 +1847,7 @@ int qcow2_expand_zero_clusters(BlockDriverState *bs,
ret = expand_zero_clusters_in_l1(bs, s->l1_table, s->l1_size, ret = expand_zero_clusters_in_l1(bs, s->l1_table, s->l1_size,
&visited_l1_entries, l1_entries, &visited_l1_entries, l1_entries,
status_cb); status_cb, cb_opaque);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }
@ -1881,7 +1883,7 @@ int qcow2_expand_zero_clusters(BlockDriverState *bs,
ret = expand_zero_clusters_in_l1(bs, l1_table, s->snapshots[i].l1_size, ret = expand_zero_clusters_in_l1(bs, l1_table, s->snapshots[i].l1_size,
&visited_l1_entries, l1_entries, &visited_l1_entries, l1_entries,
status_cb); status_cb, cb_opaque);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }

View File

@ -2870,7 +2870,7 @@ static int qcow2_load_vmstate(BlockDriverState *bs, uint8_t *buf,
* have to be removed. * have to be removed.
*/ */
static int qcow2_downgrade(BlockDriverState *bs, int target_version, static int qcow2_downgrade(BlockDriverState *bs, int target_version,
BlockDriverAmendStatusCB *status_cb) BlockDriverAmendStatusCB *status_cb, void *cb_opaque)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
int current_version = s->qcow_version; int current_version = s->qcow_version;
@ -2919,7 +2919,7 @@ static int qcow2_downgrade(BlockDriverState *bs, int target_version,
/* clearing autoclear features is trivial */ /* clearing autoclear features is trivial */
s->autoclear_features = 0; s->autoclear_features = 0;
ret = qcow2_expand_zero_clusters(bs, status_cb); ret = qcow2_expand_zero_clusters(bs, status_cb, cb_opaque);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
@ -2934,7 +2934,8 @@ static int qcow2_downgrade(BlockDriverState *bs, int target_version,
} }
static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts, static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
BlockDriverAmendStatusCB *status_cb) BlockDriverAmendStatusCB *status_cb,
void *cb_opaque)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
int old_version = s->qcow_version, new_version = old_version; int old_version = s->qcow_version, new_version = old_version;
@ -3017,7 +3018,7 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
return ret; return ret;
} }
} else { } else {
ret = qcow2_downgrade(bs, new_version, status_cb); ret = qcow2_downgrade(bs, new_version, status_cb, cb_opaque);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }

View File

@ -553,7 +553,8 @@ int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors); int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors);
int qcow2_expand_zero_clusters(BlockDriverState *bs, int qcow2_expand_zero_clusters(BlockDriverState *bs,
BlockDriverAmendStatusCB *status_cb); BlockDriverAmendStatusCB *status_cb,
void *cb_opaque);
/* qcow2-snapshot.c functions */ /* qcow2-snapshot.c functions */
int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info); int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);

View File

@ -306,9 +306,9 @@ int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
* block driver; total_work_size may change during the course of the amendment * block driver; total_work_size may change during the course of the amendment
* operation */ * operation */
typedef void BlockDriverAmendStatusCB(BlockDriverState *bs, int64_t offset, typedef void BlockDriverAmendStatusCB(BlockDriverState *bs, int64_t offset,
int64_t total_work_size); int64_t total_work_size, void *opaque);
int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts *opts, int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts *opts,
BlockDriverAmendStatusCB *status_cb); BlockDriverAmendStatusCB *status_cb, void *cb_opaque);
/* external snapshots */ /* external snapshots */
bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs, bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,

View File

@ -243,7 +243,8 @@ struct BlockDriver {
BdrvCheckMode fix); BdrvCheckMode fix);
int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts, int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts,
BlockDriverAmendStatusCB *status_cb); BlockDriverAmendStatusCB *status_cb,
void *cb_opaque);
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event); void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);

View File

@ -2896,7 +2896,8 @@ out:
} }
static void amend_status_cb(BlockDriverState *bs, static void amend_status_cb(BlockDriverState *bs,
int64_t offset, int64_t total_work_size) int64_t offset, int64_t total_work_size,
void *opaque)
{ {
qemu_progress_print(100.f * offset / total_work_size, 0); qemu_progress_print(100.f * offset / total_work_size, 0);
} }
@ -3020,7 +3021,7 @@ static int img_amend(int argc, char **argv)
/* In case the driver does not call amend_status_cb() */ /* In case the driver does not call amend_status_cb() */
qemu_progress_print(0.f, 0); qemu_progress_print(0.f, 0);
ret = bdrv_amend_options(bs, opts, &amend_status_cb); ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL);
qemu_progress_print(100.f, 0); qemu_progress_print(100.f, 0);
if (ret < 0) { if (ret < 0) {
error_report("Error while amending options: %s", strerror(-ret)); error_report("Error while amending options: %s", strerror(-ret));