提交 6f5ef23a 编写于 作者: K Kevin Wolf

migration/block: Use real permissions

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: NKevin Wolf <kwolf@redhat.com>
Acked-by: NFam Zheng <famz@redhat.com>
Reviewed-by: NMax Reitz <mreitz@redhat.com>
上级 887354bd
......@@ -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,11 @@ 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) {
qemu_mutex_unlock_iothread();
return ret;
}
/* start track dirty blocks */
ret = set_dirty_tracking();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册