qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,
	John Snow <jsnow@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v7 13/24] virtio-scsi: Catch BDS-BB removal/insertion
Date: Mon,  9 Nov 2015 23:39:22 +0100	[thread overview]
Message-ID: <1447108773-6836-14-git-send-email-mreitz@redhat.com> (raw)
In-Reply-To: <1447108773-6836-1-git-send-email-mreitz@redhat.com>

Make use of the BDS-BB removal and insertion notifiers to remove or set
up, respectively, virtio-scsi's op blockers.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 hw/scsi/virtio-scsi.c           | 59 +++++++++++++++++++++++++++++++++++++++++
 include/hw/virtio/virtio-scsi.h | 10 +++++++
 2 files changed, 69 insertions(+)

diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 7655401..02606e6 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -757,6 +757,22 @@ static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
     }
 }
 
+static void virtio_scsi_blk_insert_notifier(Notifier *n, void *data)
+{
+    VirtIOSCSIBlkChangeNotifier *cn = DO_UPCAST(VirtIOSCSIBlkChangeNotifier,
+                                                n, n);
+    assert(cn->sd->conf.blk == data);
+    blk_op_block_all(cn->sd->conf.blk, cn->s->blocker);
+}
+
+static void virtio_scsi_blk_remove_notifier(Notifier *n, void *data)
+{
+    VirtIOSCSIBlkChangeNotifier *cn = DO_UPCAST(VirtIOSCSIBlkChangeNotifier,
+                                                n, n);
+    assert(cn->sd->conf.blk == data);
+    blk_op_unblock_all(cn->sd->conf.blk, cn->s->blocker);
+}
+
 static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                 Error **errp)
 {
@@ -765,6 +781,22 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
     SCSIDevice *sd = SCSI_DEVICE(dev);
 
     if (s->ctx && !s->dataplane_disabled) {
+        VirtIOSCSIBlkChangeNotifier *insert_notifier, *remove_notifier;
+
+        insert_notifier = g_new0(VirtIOSCSIBlkChangeNotifier, 1);
+        insert_notifier->n.notify = virtio_scsi_blk_insert_notifier;
+        insert_notifier->s = s;
+        insert_notifier->sd = sd;
+        blk_add_insert_bs_notifier(sd->conf.blk, &insert_notifier->n);
+        QTAILQ_INSERT_TAIL(&s->insert_notifiers, insert_notifier, next);
+
+        remove_notifier = g_new0(VirtIOSCSIBlkChangeNotifier, 1);
+        remove_notifier->n.notify = virtio_scsi_blk_remove_notifier;
+        remove_notifier->s = s;
+        remove_notifier->sd = sd;
+        blk_add_remove_bs_notifier(sd->conf.blk, &remove_notifier->n);
+        QTAILQ_INSERT_TAIL(&s->remove_notifiers, remove_notifier, next);
+
         if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
             return;
         }
@@ -787,6 +819,7 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
     VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
     SCSIDevice *sd = SCSI_DEVICE(dev);
+    VirtIOSCSIBlkChangeNotifier *insert_notifier, *remove_notifier;
 
     if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
         virtio_scsi_push_event(s, sd,
@@ -797,6 +830,29 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
     if (s->ctx) {
         blk_op_unblock_all(sd->conf.blk, s->blocker);
     }
+
+    QTAILQ_FOREACH(insert_notifier, &s->insert_notifiers, next) {
+        if (insert_notifier->sd == sd) {
+            break;
+        }
+    }
+    if (insert_notifier) {
+        notifier_remove(&insert_notifier->n);
+        QTAILQ_REMOVE(&s->insert_notifiers, insert_notifier, next);
+        g_free(insert_notifier);
+    }
+
+    QTAILQ_FOREACH(remove_notifier, &s->remove_notifiers, next) {
+        if (remove_notifier->sd == sd) {
+            break;
+        }
+    }
+    if (remove_notifier) {
+        notifier_remove(&remove_notifier->n);
+        QTAILQ_REMOVE(&s->remove_notifiers, remove_notifier, next);
+        g_free(remove_notifier);
+    }
+
     qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
 }
 
@@ -911,6 +967,9 @@ static void virtio_scsi_device_realize(DeviceState *dev, Error **errp)
     add_migration_state_change_notifier(&s->migration_state_notifier);
 
     error_setg(&s->blocker, "block device is in use by data plane");
+
+    QTAILQ_INIT(&s->insert_notifiers);
+    QTAILQ_INIT(&s->remove_notifiers);
 }
 
 static void virtio_scsi_instance_init(Object *obj)
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index 088fe9f..0394eb2 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -76,6 +76,13 @@ typedef struct VirtIOSCSICommon {
     VirtQueue **cmd_vqs;
 } VirtIOSCSICommon;
 
+typedef struct VirtIOSCSIBlkChangeNotifier {
+    Notifier n;
+    struct VirtIOSCSI *s;
+    SCSIDevice *sd;
+    QTAILQ_ENTRY(VirtIOSCSIBlkChangeNotifier) next;
+} VirtIOSCSIBlkChangeNotifier;
+
 typedef struct VirtIOSCSI {
     VirtIOSCSICommon parent_obj;
 
@@ -86,6 +93,9 @@ typedef struct VirtIOSCSI {
     /* Fields for dataplane below */
     AioContext *ctx; /* one iothread per virtio-scsi-pci for now */
 
+    QTAILQ_HEAD(, VirtIOSCSIBlkChangeNotifier) insert_notifiers;
+    QTAILQ_HEAD(, VirtIOSCSIBlkChangeNotifier) remove_notifiers;
+
     /* Vring is used instead of vq in dataplane code, because of the underlying
      * memory layer thread safety */
     VirtIOSCSIVring *ctrl_vring;
-- 
2.6.2

  parent reply	other threads:[~2015-11-09 22:40 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-09 22:39 [Qemu-devel] [PATCH v7 for-2.6 00/24] block: Rework bdrv_close_all() Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 01/24] blockdev: Add missing bdrv_unref() in drive-backup Max Reitz
2015-11-12  6:14   ` Fam Zheng
2015-11-18 15:24   ` Kevin Wolf
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 02/24] blockjob: Call bdrv_unref() on creation error Max Reitz
2015-11-12  6:16   ` Fam Zheng
2015-11-18 15:24   ` Kevin Wolf
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 03/24] block: Release dirty bitmaps in bdrv_close() Max Reitz
2015-11-11 21:08   ` John Snow
2015-11-12  6:23   ` Fam Zheng
2015-11-13 22:49     ` John Snow
2015-11-16  1:27       ` Fam Zheng
2015-11-16 17:07         ` John Snow
2015-11-17  4:22           ` Fam Zheng
2015-11-17 17:05             ` [Qemu-devel] Closing Bitmaps (Was: Re: [PATCH v7 03/24] block: Release dirty bitmaps in bdrv_close()) John Snow
2015-11-18  2:29               ` Fam Zheng
2015-11-18 15:47                 ` John Snow
2015-11-18 15:03               ` Kevin Wolf
2015-11-18 15:49                 ` John Snow
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 04/24] iotests: Rename filter_nbd to _filter_nbd in 083 Max Reitz
2015-11-12  6:25   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 05/24] iotests: Change coding style of " Max Reitz
2015-11-12  6:25   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 06/24] iotests: Move _filter_nbd into common.filter Max Reitz
2015-11-12  6:26   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 07/24] iotests: Make _filter_nbd drop log lines Max Reitz
2015-11-12  6:27   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 08/24] iotests: Make _filter_nbd support more URL types Max Reitz
2015-11-12  6:28   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 09/24] iotests: Make redirecting qemu's stderr optional Max Reitz
2015-11-12  6:31   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 10/24] iotests: Add test for eject under NBD server Max Reitz
2015-11-11 21:46   ` John Snow
2015-11-12  6:37   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 11/24] block: Add BB-BDS remove/insert notifiers Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 12/24] virtio-blk: Functions for op blocker management Max Reitz
2015-11-25 15:57   ` Kevin Wolf
2015-11-25 16:03     ` Max Reitz
2015-11-25 16:18       ` Kevin Wolf
2015-11-25 16:26         ` Max Reitz
2015-11-26  7:48           ` Stefan Hajnoczi
2015-11-26 10:43             ` Kevin Wolf
2015-11-09 22:39 ` Max Reitz [this message]
2015-11-25 16:03   ` [Qemu-devel] [PATCH v7 13/24] virtio-scsi: Catch BDS-BB removal/insertion Kevin Wolf
2015-11-25 16:08     ` Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 14/24] nbd: Switch from close to eject notifier Max Reitz
2015-11-30 15:36   ` Kevin Wolf
2015-11-30 17:22     ` Max Reitz
2015-12-01 13:16       ` Kevin Wolf
2015-12-02 15:51         ` Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 15/24] block: Remove BDS close notifier Max Reitz
2015-11-30 15:38   ` Kevin Wolf
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 16/24] block: Use blk_remove_bs() in blk_delete() Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 17/24] blockdev: Use blk_remove_bs() in do_drive_del() Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 18/24] block: Make bdrv_close() static Max Reitz
2015-11-12  7:07   ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 19/24] block: Add list of all BlockDriverStates Max Reitz
2015-11-12  7:12   ` Fam Zheng
2015-11-16 16:03     ` Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 20/24] blockdev: Keep track of monitor-owned BDS Max Reitz
2015-11-10  1:25   ` Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 21/24] block: Add blk_remove_all_bs() Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 22/24] block: Rewrite bdrv_close_all() Max Reitz
2015-11-12  7:34   ` Fam Zheng
2015-11-16 16:15     ` Max Reitz
2015-11-18  2:52       ` Fam Zheng
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 23/24] iotests: Add test for multiple BB on BDS tree Max Reitz
2015-11-09 22:39 ` [Qemu-devel] [PATCH v7 24/24] iotests: Add test for block jobs and BDS ejection Max Reitz
2015-11-30 16:23   ` Kevin Wolf
2015-11-30 17:44     ` Max Reitz
2015-11-25 16:09 ` [Qemu-devel] [PATCH v7 for-2.6 00/24] block: Rework bdrv_close_all() 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=1447108773-6836-14-git-send-email-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berto@igalia.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --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).