mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging
Pull request Fiona's virtio-scsi TMF deadlock fix. Paolo: I merged the scsi fix in my block tree, but realize now that it belongs to the scsi subsystem. Sorry about that, I'll be more careful next time. Please reply if you want to handle this patch yourself. # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmj/wl0ACgkQnKSrs4Gr # c8ga0Qf/TaIXqp2xyFmKCmCxbruNvZZtD96qBmK694AXm8+exZcXkGTuFyBcxC6T # 1bHaHNBCRw5mu0h6T88lHT5QQ7h7AvZnm6gOa+6MpkeAY59DP0zDGF4GyCC4enUz # D9kAcC2UGKXDSTv8oyqpFq/ZOamW9T7XI+rjpN+kIr5/Z+vG+IuBFX9atIk5es41 # vuoYCuXldZNcOYeA88L8F0O7ikwpGJk3RI8lJFVPGfGju94BpXiOcP7Csqvkjk8r # F1p6Uy/GD7031em/sVxvezOpRsC62dtnItYFBwt8FGjtbCN7HNy9bCvoM6mIVK0n # B2+Rh7oQeDRVAJIMHtSXtJtuA6pPDw== # =P138 # -----END PGP SIGNATURE----- # gpg: Signature made Mon 27 Oct 2025 08:05:01 PM CET # gpg: using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [unknown] # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8 * tag 'block-pull-request' of https://gitlab.com/stefanha/qemu: hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
+13
-1
@@ -339,6 +339,7 @@ static void virtio_scsi_do_tmf_aio_context(void *opaque)
|
||||
SCSIDevice *d = virtio_scsi_device_get(s, tmf->req.tmf.lun);
|
||||
SCSIRequest *r;
|
||||
bool match_tag;
|
||||
g_autoptr(GList) reqs = NULL;
|
||||
|
||||
if (!d) {
|
||||
tmf->resp.tmf.response = VIRTIO_SCSI_S_BAD_TARGET;
|
||||
@@ -374,10 +375,21 @@ static void virtio_scsi_do_tmf_aio_context(void *opaque)
|
||||
if (match_tag && cmd_req->req.cmd.tag != tmf->req.tmf.tag) {
|
||||
continue;
|
||||
}
|
||||
virtio_scsi_tmf_cancel_req(tmf, r);
|
||||
/*
|
||||
* Cannot cancel directly, because scsi_req_dequeue() would deadlock
|
||||
* when attempting to acquire the request_lock a second time. Taking
|
||||
* a reference here is paired with an unref after cancelling below.
|
||||
*/
|
||||
scsi_req_ref(r);
|
||||
reqs = g_list_prepend(reqs, r);
|
||||
}
|
||||
}
|
||||
|
||||
for (GList *elem = g_list_first(reqs); elem; elem = g_list_next(elem)) {
|
||||
virtio_scsi_tmf_cancel_req(tmf, elem->data);
|
||||
scsi_req_unref(elem->data);
|
||||
}
|
||||
|
||||
/* Incremented by virtio_scsi_do_tmf() */
|
||||
virtio_scsi_tmf_dec_remaining(tmf);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user