qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	Jeff Cody <jcody@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	Max Reitz <mreitz@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	john@redhat.com
Subject: [Qemu-devel] [PATCH 05/50] block: Fix BB AIOCB AioContext without BDS
Date: Mon, 26 Jan 2015 11:02:39 -0500	[thread overview]
Message-ID: <1422288204-29271-6-git-send-email-mreitz@redhat.com> (raw)
In-Reply-To: <1422288204-29271-1-git-send-email-mreitz@redhat.com>

Fix the BlockBackend's AIOCB AioContext for aborting AIO in case there
is no BDS. If there is no implementation of AIOCBInfo::get_aio_context()
the AioContext is derived from the BDS the AIOCB belongs to. If that BDS
is NULL (because it has been removed from the BB) this will not work.

This patch makes blk_get_aio_context() fall back to the main loop
context if the BDS pointer is NULL and implements
AIOCBInfo::get_aio_context() (blk_aiocb_get_aio_context()) which invokes
blk_get_aio_context().

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block/block-backend.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/block/block-backend.c b/block/block-backend.c
index 96a5bc6..4c40747 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -18,6 +18,8 @@
 /* Number of coroutines to reserve per attached device model */
 #define COROUTINE_POOL_RESERVATION 64
 
+static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb);
+
 struct BlockBackend {
     char *name;
     int refcnt;
@@ -34,10 +36,12 @@ struct BlockBackend {
 typedef struct BlockBackendAIOCB {
     BlockAIOCB common;
     QEMUBH *bh;
+    BlockBackend *blk;
     int ret;
 } BlockBackendAIOCB;
 
 static const AIOCBInfo block_backend_aiocb_info = {
+    .get_aio_context = blk_aiocb_get_aio_context,
     .aiocb_size = sizeof(BlockBackendAIOCB),
 };
 
@@ -530,6 +534,7 @@ static BlockAIOCB *abort_aio_request(BlockBackend *blk, BlockCompletionFunc *cb,
     QEMUBH *bh;
 
     acb = blk_aio_get(&block_backend_aiocb_info, blk, cb, opaque);
+    acb->blk = blk;
     acb->ret = ret;
 
     bh = aio_bh_new(blk_get_aio_context(blk), error_callback_bh, acb);
@@ -783,7 +788,17 @@ void blk_op_unblock_all(BlockBackend *blk, Error *reason)
 
 AioContext *blk_get_aio_context(BlockBackend *blk)
 {
-    return bdrv_get_aio_context(blk->bs);
+    if (blk->bs) {
+        return bdrv_get_aio_context(blk->bs);
+    } else {
+        return qemu_get_aio_context();
+    }
+}
+
+static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb)
+{
+    BlockBackendAIOCB *blk_acb = DO_UPCAST(BlockBackendAIOCB, common, acb);
+    return blk_get_aio_context(blk_acb->blk);
 }
 
 void blk_set_aio_context(BlockBackend *blk, AioContext *new_context)
-- 
2.1.0

  parent reply	other threads:[~2015-01-26 16:03 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-26 16:02 [Qemu-devel] [PATCH 00/50] blockdev: BlockBackend and media Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 01/50] blockdev: Allow creation of BDS trees without BB Max Reitz
2015-01-27 18:22   ` Eric Blake
2015-01-27 18:26     ` Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 02/50] iotests: Only create BB if necessary Max Reitz
2015-01-27 18:49   ` Eric Blake
2015-01-26 16:02 ` [Qemu-devel] [PATCH 03/50] hw/block/fdc: Implement tray status Max Reitz
2015-01-27 18:58   ` Eric Blake
2015-01-26 16:02 ` [Qemu-devel] [PATCH 04/50] hw/usb-storage: Check whether BB is inserted Max Reitz
2015-01-27 19:05   ` Eric Blake
2015-01-26 16:02 ` Max Reitz [this message]
2015-01-27 19:12   ` [Qemu-devel] [PATCH 05/50] block: Fix BB AIOCB AioContext without BDS Eric Blake
2015-01-26 16:02 ` [Qemu-devel] [PATCH 06/50] block: Add blk_is_available() Max Reitz
2015-01-27 19:15   ` Eric Blake
2015-01-27 19:16     ` Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 07/50] block: Make bdrv_is_inserted() recursive Max Reitz
2015-01-27 19:18   ` Eric Blake
2015-01-26 16:02 ` [Qemu-devel] [PATCH 08/50] block/quorum: Implement bdrv_is_inserted() Max Reitz
2015-01-27 19:20   ` Eric Blake
2015-01-26 16:02 ` [Qemu-devel] [PATCH 09/50] block: Move guest_block_size into BlockBackend Max Reitz
2015-01-27 19:22   ` Eric Blake
2015-01-27 19:37     ` John Priddy
2015-01-27 19:40       ` Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 10/50] block: Remove wr_highest_offset from BlockAcctStats Max Reitz
2015-01-27 20:01   ` Eric Blake
2015-01-27 20:02     ` Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 11/50] block: Move BlockAcctStats into BlockBackend Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 12/50] block: Move I/O status and error actions into BB Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 13/50] block: Add BlockBackendRootState Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 14/50] block: Make some BB functions fall back to BBRS Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 15/50] block: Fail requests to empty BlockBackend Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 16/50] block: Prepare remaining BB functions for NULL BDS Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 17/50] block: Respect empty BB in bdrv_lookup_bs() Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 18/50] block: Respect empty BB in bdrv_query_info() Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 19/50] blockdev: Use BlockBackend for blockdev-backup TA Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 20/50] blockdev: Check blk_is_available() in sn-del-int-sync Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 21/50] blockdev: Check BB validity in internal snapshot TA Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 22/50] blockdev: Check BB validity in drive-backup TA Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 23/50] blockdev: Catch NULL BDS in block_set_io_throttle Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 24/50] blockdev: Check BB validity in block-stream Max Reitz
2015-01-26 16:02 ` [Qemu-devel] [PATCH 25/50] blockdev: Check BB validity in block-commit Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 26/50] blockdev: Check BB validity in drive-backup Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 27/50] blockdev: Check BB validity in blockdev-backup Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 28/50] blockdev: Check BB validity in drive-mirror Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 29/50] blockdev: Check BB validity in find_block_job() Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 30/50] blockdev: Check BB validity in change-backing-file Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 31/50] block: Add blk_insert_bs() Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 32/50] blockdev: Check BB validity in eject and change Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 33/50] blockdev: Respect NULL BDS in do_drive_del() Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 34/50] blockdev: Do not create BDS for empty drive Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 35/50] blockdev: Pull out blockdev option extraction Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 36/50] blockdev: Allow more options for BB-less BDS tree Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 37/50] block: Add blk_remove_bs() Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 38/50] blockdev: Add blockdev-open-tray Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 39/50] blockdev: Add blockdev-close-tray Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 40/50] blockdev: Add blockdev-remove-medium Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 41/50] blockdev: Add blockdev-insert-medium Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 42/50] blockdev: Implement eject with basic operations Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 43/50] blockdev: Implement change " Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 44/50] block: Inquire tray state before tray-moved events Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 45/50] qmp: Introduce blockdev-change-medium Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 46/50] hmp: Use blockdev-change-medium for change command Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 47/50] blockdev: Add read-only option to blockdev-change-medium Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 48/50] hmp: Add read-only option to change command Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 49/50] iotests: More options for VM.add_drive() Max Reitz
2015-01-26 16:03 ` [Qemu-devel] [PATCH 50/50] iotests: Add test for change-related QMP commands Max Reitz
2015-01-27 19:30 ` [Qemu-devel] [PATCH 00/50] blockdev: BlockBackend and media Eric Blake
2015-01-27 19:38   ` Max Reitz
2015-01-27 19:49 ` Max Reitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1422288204-29271-6-git-send-email-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=famz@redhat.com \
    --cc=jcody@redhat.com \
    --cc=john@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).