All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 21/43] rbd: Fix race between aio completition and aio cancel
Date: Thu, 13 Dec 2012 16:10:28 +0100	[thread overview]
Message-ID: <1355411450-12761-22-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1355411450-12761-1-git-send-email-kwolf@redhat.com>

From: Stefan Priebe <s.priebe@profihost.ag>

This one fixes a race which qemu had also in iscsi block driver
between cancellation and io completition.

qemu_rbd_aio_cancel was not synchronously waiting for the end of
the command.

To archieve this it introduces a new status flag which uses
-EINPROGRESS.

Signed-off-by: Stefan Priebe <s.priebe@profihost.ag>
Reviewed-by: Stefan Hajnoczi <stefanha@gmail.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/rbd.c |   20 ++++++++++++--------
 1 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/block/rbd.c b/block/rbd.c
index f3becc7..737bab1 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -77,6 +77,7 @@ typedef struct RBDAIOCB {
     int error;
     struct BDRVRBDState *s;
     int cancelled;
+    int status;
 } RBDAIOCB;
 
 typedef struct RADOSCB {
@@ -376,12 +377,6 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
     RBDAIOCB *acb = rcb->acb;
     int64_t r;
 
-    if (acb->cancelled) {
-        qemu_vfree(acb->bounce);
-        qemu_aio_release(acb);
-        goto done;
-    }
-
     r = rcb->ret;
 
     if (acb->cmd == RBD_AIO_WRITE ||
@@ -409,7 +404,6 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
     /* Note that acb->bh can be NULL in case where the aio was cancelled */
     acb->bh = qemu_bh_new(rbd_aio_bh_cb, acb);
     qemu_bh_schedule(acb->bh);
-done:
     g_free(rcb);
 }
 
@@ -568,6 +562,12 @@ static void qemu_rbd_aio_cancel(BlockDriverAIOCB *blockacb)
 {
     RBDAIOCB *acb = (RBDAIOCB *) blockacb;
     acb->cancelled = 1;
+
+    while (acb->status == -EINPROGRESS) {
+        qemu_aio_wait();
+    }
+
+    qemu_aio_release(acb);
 }
 
 static const AIOCBInfo rbd_aiocb_info = {
@@ -639,8 +639,11 @@ static void rbd_aio_bh_cb(void *opaque)
     acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
     qemu_bh_delete(acb->bh);
     acb->bh = NULL;
+    acb->status = 0;
 
-    qemu_aio_release(acb);
+    if (!acb->cancelled) {
+        qemu_aio_release(acb);
+    }
 }
 
 static int rbd_aio_discard_wrapper(rbd_image_t image,
@@ -685,6 +688,7 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
     acb->s = s;
     acb->cancelled = 0;
     acb->bh = NULL;
+    acb->status = -EINPROGRESS;
 
     if (cmd == RBD_AIO_WRITE) {
         qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
-- 
1.7.6.5

  parent reply	other threads:[~2012-12-13 15:12 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-13 15:10 [Qemu-devel] [PULL 00/43] Block patches Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 01/43] tests: use aio_poll() instead of aio_flush() in test-aio.c Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 02/43] tests: avoid qemu_aio_flush() in test-thread-pool.c Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 03/43] block: Improve bdrv_aio_co_cancel_em Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 04/43] aio: Get rid of qemu_aio_flush() Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 05/43] block: Factor out bdrv_open_flags Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 06/43] block: Avoid second open for format probing Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 07/43] virtio-blk: Remove duplicate property definition Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 08/43] block: vpc initialize the uuid footer field Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 09/43] block: vpc support for ~2 TB disks Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 10/43] raw-posix: inline paio_ioctl into hdev_aio_ioctl Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 11/43] Support default block interfaces per QEMUMachine Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 12/43] block: simplify default_drive Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 13/43] block: bdrv_img_create(): add Error ** argument Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 14/43] qemu-img: img_create(): pass Error object to bdrv_img_create() Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 15/43] qemu-img: img_create(): drop unneeded goto and ret variable Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 16/43] qmp: qmp_transaction(): pass Error object to bdrv_img_create() Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 17/43] qmp: qmp_drive_mirror(): " Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 18/43] block: bdrv_img_create(): drop unused error handling code Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 19/43] tests: Add tests for fdsets Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 20/43] qemu-io: Implement write -c for compressed clusters Kevin Wolf
2012-12-13 15:10 ` Kevin Wolf [this message]
2012-12-13 15:10 ` [Qemu-devel] [PATCH 22/43] Fix error code checking for SetFilePointer() call Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 23/43] qemu-option: opt_set(): split it up into more functions Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 24/43] qemu-option: qemu_opts_validate(): fix duplicated code Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 25/43] qemu-option: qemu_opt_set_bool(): fix code duplication Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 26/43] introduce qemu_opts_create_nofail function Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 27/43] use qemu_opts_create_nofail Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 28/43] create new function: qemu_opt_set_number Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 29/43] blkdebug: Allow usage without config file Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 30/43] blkdebug: Factor out remove_rule() Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 31/43] blkdebug: Implement suspend/resume of AIO requests Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 32/43] qemu-io: Add AIO debugging commands Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 33/43] qcow2: Move BLKDBG_EVENT out of the lock Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 34/43] qemu-iotests: Test concurrent cluster allocations Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 35/43] atapi: reset cdrom tray statuses on ide_reset Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 36/43] qcow2: Round QCowL2Meta.offset down to cluster boundary Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 37/43] qcow2: Introduce Qcow2COWRegion Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 38/43] qcow2: Allocate l2meta dynamically Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 39/43] qcow2: Drop l2meta.cluster_offset Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 40/43] qcow2: Allocate l2meta only for cluster allocations Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 41/43] qcow2: Enable dirty flag in qcow2_alloc_cluster_link_l2 Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 42/43] qcow2: Execute run_dependent_requests() without lock Kevin Wolf
2012-12-13 15:10 ` [Qemu-devel] [PATCH 43/43] qcow2: Factor out handle_dependencies() Kevin Wolf

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=1355411450-12761-22-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.