From patchwork Mon Mar 2 10:08:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 445021 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8FAA7140172 for ; Mon, 2 Mar 2015 21:14:29 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="verification failed; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=tp8Ef48K; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from localhost ([::1]:55987 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSNMp-0001Ds-Mg for incoming@patchwork.ozlabs.org; Mon, 02 Mar 2015 05:14:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33358) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSNHw-0001yI-FQ for qemu-devel@nongnu.org; Mon, 02 Mar 2015 05:09:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YSNHv-0007rG-DJ for qemu-devel@nongnu.org; Mon, 02 Mar 2015 05:09:24 -0500 Received: from mail-we0-x236.google.com ([2a00:1450:400c:c03::236]:44966) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSNHv-0007r9-5v for qemu-devel@nongnu.org; Mon, 02 Mar 2015 05:09:23 -0500 Received: by wesk11 with SMTP id k11so32187641wes.11 for ; Mon, 02 Mar 2015 02:09:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=X5BwKcem+VkDC2xE8GwGJpvvmf9rGgHFeqHA1l1ygSE=; b=tp8Ef48KwLXjRxdyzBxJXBUsE1bGRedJ4jHQanXRYHui1oEb5ab6Hq1RcaiOpdImOD L4u2RfA9Uy8SQOpOhutKvWtKXjZvnMBykyldqPQvvQljkdAWC5W6Hobmr6bB+5VFrelF 6PTp3mIPAzdVSdOM0I0GNHd+e0yyexpvlrVvgGJHN47PhNwSIWWfMM5Uz+IbY+BkU8O2 qPDmJZgisQUO5Hf1tnOqkd0abQG6gsMujmgth6CZ3WlOvtR/qxb5PmgVJTMbRAyer/jD F/wYcEVT0uU40yXIMR++7WfhtMA+HNIeyMIn40GHwMI8Bj5pFgQ9yoOCthyGgy2U1Em4 q94g== X-Received: by 10.194.90.210 with SMTP id by18mr55395752wjb.80.1425290962605; Mon, 02 Mar 2015 02:09:22 -0800 (PST) Received: from localhost.localdomain (net-37-116-207-136.cust.vodafonedsl.it. [37.116.207.136]) by mx.google.com with ESMTPSA id g10sm15364685wic.7.2015.03.02.02.09.20 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Mar 2015 02:09:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Mon, 2 Mar 2015 11:08:52 +0100 Message-Id: <1425290934-60872-14-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 2.3.0 In-Reply-To: <1425290934-60872-1-git-send-email-pbonzini@redhat.com> References: <1425290934-60872-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c03::236 Cc: Max Reitz Subject: [Qemu-devel] [PULL 13/15] virtio-scsi: Allocate op blocker reason before blocking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Max Reitz s->blocker is really only used in hw/scsi/virtio-scsi.c; the only places where it is used in hw/scsi/virtio-scsi-dataplane.c is when it is allocated and when it is freed. That does not make a whole lot of sense (and is actually wrong because this leads to s->blocker potentially being NULL when blk_op_block_all() is called in virtio-scsi.c), so move the allocation and destruction of s->blocker to the device realization and unrealization in virtio-scsi.c, respectively. Case in point: $ echo -e 'eject drv\nquit' | \ x86_64-softmmu/qemu-system-x86_64 \ -monitor stdio -machine accel=qtest -display none \ -object iothread,id=thr -device virtio-scsi-pci,iothread=thr \ -drive if=none,file=test.qcow2,format=qcow2,id=drv \ -device scsi-cd,drive=drv Without this patch: (qemu) eject drv [1] 10102 done 10103 segmentation fault (core dumped) With this patch: (qemu) eject drv Device 'drv' is busy: block device is in use by data plane (qemu) quit Signed-off-by: Max Reitz Message-Id: <1425057113-26940-1-git-send-email-mreitz@redhat.com> Signed-off-by: Paolo Bonzini --- hw/scsi/virtio-scsi-dataplane.c | 4 ---- hw/scsi/virtio-scsi.c | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c index 418d73b..3f40ff0 100644 --- a/hw/scsi/virtio-scsi-dataplane.c +++ b/hw/scsi/virtio-scsi-dataplane.c @@ -211,8 +211,6 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s) s->dataplane_starting = true; - assert(!s->blocker); - error_setg(&s->blocker, "block device is in use by data plane"); /* Set up guest notifier (irq) */ rc = k->set_guest_notifiers(qbus->parent, vs->conf.num_queues + 2, true); if (rc != 0) { @@ -279,8 +277,6 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s) if (!s->dataplane_started || s->dataplane_stopping) { return; } - error_free(s->blocker); - s->blocker = NULL; s->dataplane_stopping = true; assert(s->ctx == iothread_get_aio_context(vs->conf.iothread)); diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 8c437dd..4db3b23 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -903,6 +903,8 @@ static void virtio_scsi_device_realize(DeviceState *dev, Error **errp) virtio_scsi_save, virtio_scsi_load, s); s->migration_state_notifier.notify = virtio_scsi_migration_state_changed; add_migration_state_change_notifier(&s->migration_state_notifier); + + error_setg(&s->blocker, "block device is in use by data plane"); } static void virtio_scsi_instance_init(Object *obj) @@ -928,6 +930,8 @@ static void virtio_scsi_device_unrealize(DeviceState *dev, Error **errp) { VirtIOSCSI *s = VIRTIO_SCSI(dev); + error_free(s->blocker); + unregister_savevm(dev, "virtio-scsi", s); remove_migration_state_change_notifier(&s->migration_state_notifier);