[pve-devel] applied: [RFC qemu] fix #1420: fix stop mode backup with virtio-blk
Wolfgang Bumiller
w.bumiller at proxmox.com
Tue Sep 5 10:34:35 CEST 2017
applied
On Mon, Aug 28, 2017 at 04:12:34PM +0200, Fabian Grünbichler wrote:
> Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
> ---
> this seems in line with our other VMA modifications, and I get the following
> stacktrace without:
>
> Thread 1 (Thread 0x7fa27cffd700 (LWP 29427)):
> #0 blk_bs (blk=0x0) at block/block-backend.c:1655
> #1 blk_set_aio_context (blk=0x0, new_context=0x7fa27e16a8c0) at block/block-backend.c:1656
> #2 0x000055d7d03c68c8 in block_job_attached_aio_context (new_context=<optimized out>, opaque=0x7fa1768f6d80) at blockjob.c:115
> job = 0x7fa1768f6d80
> #3 0x000055d7d03c2a8b in bdrv_attach_aio_context (bs=bs at entry=0x7fa27e1c6000, new_context=new_context at entry=0x7fa27e16a8c0) at block.c:4400
> ban = <optimized out>
> ban_tmp = 0x0
> child = <optimized out>
> __PRETTY_FUNCTION__ = "bdrv_attach_aio_context"
> #4 0x000055d7d03c2b29 in bdrv_set_aio_context (bs=bs at entry=0x7fa27e1c6000, new_context=new_context at entry=0x7fa27e16a8c0) at block.c:4424
> #5 0x000055d7d03fe6b6 in blk_set_aio_context (blk=0x7fa27e031000, new_context=0x7fa27e16a8c0) at block/block-backend.c:1662
> #6 0x000055d7d014571c in virtio_blk_data_plane_start (vdev=<optimized out>) at hw/block/dataplane/virtio-blk.c:202
> vblk = 0x7fa177039510
> __func__ = "virtio_blk_data_plane_start"
> s = 0x7fa177091f00
> qbus = <optimized out>
> k = <optimized out>
> i = <optimized out>
> nvqs = <optimized out>
> r = <optimized out>
>
> with the inner-most two having a blk parameter of 0x0 leading to a segfault.
>
> blockjob.c:115 does the following:
> job->driver->attached_aio_context(job, new_context);
>
> and job / job->driver in frame #2 are:
> $1 = {driver = 0x55d7d0a261a0 <backup_job_driver>, blk = 0x7fa27e033800, id =
> 0x7fa17703c4e0 "drive-virtio0", co = 0x7fa27e16c440, cancelled = false,
> pause_count = 2, user_paused = false, busy = false, paused = true, ready =
> false, deferred_to_main_loop = false, job_list = {le_next = 0x0, le_prev =
> 0x55d7d0adb198 <block_jobs>}, iostatus = BLOCK_DEVICE_IO_STATUS_OK, offset =
> 285147136, len = 34359738368, speed = 0, cb = 0x55d7d01f8800
> <pvebackup_complete_cb>, blocker = 0x7fa176910f40, nodes = 0x7fa27e02b750,
> opaque = 0x7fa27e1cc000, refcnt = 1, completed = false, ret = 0, txn = 0x0,
> txn_list = {le_next = 0x0, le_prev = 0x0}}
>
> $3 = {common = {driver = 0x55d7d0a261a0 <backup_job_driver>, blk =
> 0x7fa27e033800, id = 0x7fa17703c4e0 "drive-virtio0", co = 0x7fa27e16c440,
> cancelled = false, pause_count = 2, user_paused = false, busy = false, paused =
> true, ready = false, deferred_to_main_loop = false, job_list = {le_next = 0x0,
> le_prev = 0x55d7d0adb198 <block_jobs>}, iostatus = BLOCK_DEVICE_IO_STATUS_OK,
> offset = 285147136, len = 34359738368, speed = 0, cb = 0x55d7d01f8800
> <pvebackup_complete_cb>, blocker = 0x7fa176910f40, nodes = 0x7fa27e02b750,
> opaque = 0x7fa27e1cc000, refcnt = 1, completed = false, ret = 0, txn = 0x0,
> txn_list = { le_next = 0x0, le_prev = 0x0}}, target = 0x0, sync_bitmap = 0x0,
> sync_mode = MIRROR_SYNC_MODE_FULL, limit = {slice_start_time = 0,
> slice_end_time = 0, slice_quota = 0, slice_ns = 0, dispatched = 0}, dump_cb =
> 0x55d7d01f83c0 <pvebackup_dump_cb>, on_source_error = BLOCKDEV_ON_ERROR_REPORT,
> on_target_error = BLOCKDEV_ON_ERROR_REPORT, flush_rwlock = {pending_writer = 0,
> reader = 0, mutex = { locked = 0, ctx = 0x0, from_push = {slh_first = 0x0},
> to_pop = {slh_first = 0x0}, handoff = 0, sequence = 0, holder = 0x0}, queue =
> {entries = {sqh_first = 0x0, sqh_last = 0x7fa1768f6eb0}}}, sectors_read =
> 556928, done_bitmap = 0x7fa179c85000, cluster_size = 65536, compress = false,
> before_write = {notify = 0x55d7d0416ed0 <backup_before_write_notify>, node =
> {le_next = 0x0, le_prev = 0x7fa27e1c91c8}}, inflight_reqs = {lh_first = 0x0}}
>
> this is IMHO the place to fix it (without a target, there is nothing further to
> set the context of). review of someone more familiar with the qemu and VMA code
> bases very welcome ;)
>
> debian/patches/pve/0028-adding-old-vma-files.patch | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/debian/patches/pve/0028-adding-old-vma-files.patch b/debian/patches/pve/0028-adding-old-vma-files.patch
> index 5e87ed7..85927a3 100644
> --- a/debian/patches/pve/0028-adding-old-vma-files.patch
> +++ b/debian/patches/pve/0028-adding-old-vma-files.patch
> @@ -105,7 +105,17 @@ index 1ede70c061..51b5ba6eda 100644
> assert(s->target);
> blk_unref(s->target);
> s->target = NULL;
> -@@ -330,9 +344,11 @@ static BlockErrorAction backup_error_action(BackupBlockJob *job,
> +@@ -255,7 +269,8 @@ static void backup_attached_aio_context(BlockJob *job, AioContext *aio_context)
> + {
> + BackupBlockJob *s = container_of(job, BackupBlockJob, common);
> +
> +- blk_set_aio_context(s->target, aio_context);
> ++ if (s->target)
> ++ blk_set_aio_context(s->target, aio_context);
> + }
> +
> + void backup_do_checkpoint(BlockJob *job, Error **errp)
> +@@ -330,9 +345,11 @@ static BlockErrorAction backup_error_action(BackupBlockJob *job,
> if (read) {
> return block_job_error_action(&job->common, job->on_source_error,
> true, error);
> --
> 2.11.0
More information about the pve-devel
mailing list