From 6e9fc1cb3586898f597e565220ef9c2e5bcf6e31 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Wed, 3 Sep 2014 09:18:00 +0200 Subject: [PATCH 07/15] block: acquire AioContext in do_drive_del() Message-id: <1409735881-28863-4-git-send-email-stefanha@redhat.com> Patchwork-id: 60824 O-Subject: [RHEL7.1 qemu-kvm-rhev PATCH 3/4] block: acquire AioContext in do_drive_del() Bugzilla: 1136752 RH-Acked-by: Paolo Bonzini RH-Acked-by: Laszlo Ersek RH-Acked-by: Fam Zheng Make drive_del safe for dataplane where another thread may be running the BlockDriverState's AioContext. Note the assumption that AioContext's lifetime exceeds DriveInfo and BlockDriverState. We release AioContext after DriveInfo and BlockDriverState are potentially freed. This is clearly safe with the global AioContext but also with -object iothread and implicit iothreads created by -device virtio-blk-pci,x-data-plane=on (their lifetime is tied to DeviceState, not BlockDriverState). Signed-off-by: Stefan Hajnoczi (cherry picked from commit 8ad4202bf61bc1d124ff26016cfe17cb261cc392) Signed-off-by: Stefan Hajnoczi --- blockdev.c | 7 +++++++ 1 file changed, 7 insertions(+) Signed-off-by: Miroslav Rezanina --- blockdev.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/blockdev.c b/blockdev.c index caa073d..8211e2a 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1762,6 +1762,7 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) { const char *id = qdict_get_str(qdict, "id"); BlockDriverState *bs; + AioContext *aio_context; Error *local_err = NULL; bs = bdrv_find(id); @@ -1769,9 +1770,14 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) error_report("Device '%s' not found", id); return -1; } + + aio_context = bdrv_get_aio_context(bs); + aio_context_acquire(aio_context); + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) { error_report("%s", error_get_pretty(local_err)); error_free(local_err); + aio_context_release(aio_context); return -1; } @@ -1795,6 +1801,7 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) drive_del(drive_get_by_blockdev(bs)); } + aio_context_release(aio_context); return 0; } -- 1.7.1