Commit a6f230c8 authored by Alberto Garcia's avatar Alberto Garcia Committed by Kevin Wolf
Browse files

virtio-scsi: Move BlockBackend back to the main AioContext on unplug



This fixes a crash when attaching a disk to a SCSI device using
iothreads, then detaching it and reattaching it again. Test case
included.

Signed-off-by: default avatarAlberto Garcia <berto@igalia.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 14632122
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -824,6 +824,12 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
        virtio_scsi_release(s);
    }

    if (s->ctx) {
        virtio_scsi_acquire(s);
        blk_set_aio_context(sd->conf.blk, qemu_get_aio_context());
        virtio_scsi_release(s);
    }

    qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
}

tests/qemu-iotests/240

0 → 100755
+89 −0
Original line number Diff line number Diff line
#!/bin/bash
#
# Test hot plugging and unplugging with iothreads
#
# Copyright (C) 2019 Igalia, S.L.
# Author: Alberto Garcia <berto@igalia.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# creator
owner=berto@igalia.com

seq=`basename $0`
echo "QA output created by $seq"

status=1	# failure is the default!

# get standard environment, filters and checks
. ./common.rc
. ./common.filter

_supported_fmt generic
_supported_proto generic
_supported_os Linux

do_run_qemu()
{
    echo Testing: "$@"
    $QEMU -nographic -qmp stdio -serial none "$@"
    echo
}

# Remove QMP events from (pretty-printed) output. Doesn't handle
# nested dicts correctly, but we don't get any of those in this test.
_filter_qmp_events()
{
    tr '\n' '\t' | sed -e \
	's/{\s*"timestamp":\s*{[^}]*},\s*"event":[^,}]*\(,\s*"data":\s*{[^}]*}\)\?\s*}\s*//g' \
	| tr '\t' '\n'
}

run_qemu()
{
    do_run_qemu "$@" 2>&1 | _filter_qmp | _filter_qmp_events
}

case "$QEMU_DEFAULT_MACHINE" in
  s390-ccw-virtio)
      virtio_scsi=virtio-scsi-ccw
      ;;
  *)
      virtio_scsi=virtio-scsi-pci
      ;;
esac

echo
echo === Unplug a SCSI disk and then plug it again ===
echo

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "hd0"}}
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread0"}}
{ "execute": "device_add", "arguments": {"id": "scsi0", "driver": "${virtio_scsi}", "iothread": "iothread0"}}
{ "execute": "device_add", "arguments": {"id": "scsi-hd0", "driver": "scsi-hd", "drive": "hd0"}}
{ "execute": "device_del", "arguments": {"id": "scsi-hd0"}}
{ "execute": "device_add", "arguments": {"id": "scsi-hd0", "driver": "scsi-hd", "drive": "hd0"}}
{ "execute": "device_del", "arguments": {"id": "scsi-hd0"}}
{ "execute": "device_del", "arguments": {"id": "scsi0"}}
{ "execute": "blockdev-del", "arguments": {"node-name": "hd0"}}
{ "execute": "quit"}
EOF

# success, all done
echo "*** done"
rm -f $seq.full
status=0
+18 −0
Original line number Diff line number Diff line
QA output created by 240

=== Unplug a SCSI disk and then plug it again ===

Testing:
QMP_VERSION
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
*** done
+1 −0
Original line number Diff line number Diff line
@@ -237,3 +237,4 @@
237 rw auto quick
238 auto quick
239 rw auto quick
240 auto quick