On 21.02.2017 15:58, Kevin Wolf wrote: > Request BLK_PERM_CONSISTENT_READ for the source of block migration, and > handle potential permission errors as good as we can in this place > (which is not very good, but it matches the other failure cases). > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > migration/block.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/migration/block.c b/migration/block.c > index d259936..958d0fc 100644 > --- a/migration/block.c > +++ b/migration/block.c > @@ -379,7 +379,7 @@ static void unset_dirty_tracking(void) > } > } > > -static void init_blk_migration(QEMUFile *f) > +static int init_blk_migration(QEMUFile *f) > { > BlockDriverState *bs; > BlkMigDevState *bmds; > @@ -390,6 +390,8 @@ static void init_blk_migration(QEMUFile *f) > BlkMigDevState *bmds; > BlockDriverState *bs; > } *bmds_bs; > + Error *local_err = NULL; > + int ret; > > block_mig_state.submitted = 0; > block_mig_state.read_done = 0; > @@ -411,12 +413,12 @@ static void init_blk_migration(QEMUFile *f) > > sectors = bdrv_nb_sectors(bs); > if (sectors <= 0) { > + ret = sectors; > goto out; > } > > bmds = g_new0(BlkMigDevState, 1); > - /* FIXME Use real permissions */ > - bmds->blk = blk_new(0, BLK_PERM_ALL); > + bmds->blk = blk_new(BLK_PERM_CONSISTENT_READ, BLK_PERM_ALL); > bmds->blk_name = g_strdup(bdrv_get_device_name(bs)); > bmds->bulk_completed = 0; > bmds->total_sectors = sectors; > @@ -446,7 +448,11 @@ static void init_blk_migration(QEMUFile *f) > BlockDriverState *bs = bmds_bs[i].bs; > > if (bmds) { > - blk_insert_bs(bmds->blk, bs, &error_abort); > + ret = blk_insert_bs(bmds->blk, bs, &local_err); > + if (ret < 0) { > + error_report_err(local_err); > + goto out; > + } > > alloc_aio_bitmap(bmds); > error_setg(&bmds->blocker, "block device is in use by > migration"); > @@ -454,8 +460,10 @@ static void init_blk_migration(QEMUFile *f) > } > } > > + ret = 0; > out: > g_free(bmds_bs); > + return ret; > } > > /* Called with no lock taken. */ > @@ -706,7 +714,10 @@ static int block_save_setup(QEMUFile *f, void *opaque) > block_mig_state.submitted, block_mig_state.transferred); > > qemu_mutex_lock_iothread(); > - init_blk_migration(f); > + ret = init_blk_migration(f); > + if (ret < 0) {
What about qemu_mutex_unlock_iothread()? Max > + return ret; > + } > > /* start track dirty blocks */ > ret = set_dirty_tracking(); >
signature.asc
Description: OpenPGP digital signature