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:
parent
bd5072d756
commit
8b13976d3f
4
block.c
4
block.c
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue