summaryrefslogtreecommitdiffstats
path: root/scsi
diff options
context:
space:
mode:
authorPaolo Bonzini2018-06-20 19:36:15 +0200
committerPaolo Bonzini2018-06-28 19:05:35 +0200
commit86933b4e7879e427e03365bf352c0964640cb37b (patch)
tree83d44b80179357c1b55f29d76bff9fb79a52e47b /scsi
parentpr-helper: fix --socket-path default in help (diff)
downloadqemu-86933b4e7879e427e03365bf352c0964640cb37b.tar.gz
qemu-86933b4e7879e427e03365bf352c0964640cb37b.tar.xz
qemu-86933b4e7879e427e03365bf352c0964640cb37b.zip
pr-helper: fix assertion failure on failed multipath PERSISTENT RESERVE IN
The response size is expected to be zero if the SCSI status is not "GOOD", but nothing was resetting it. This can be reproduced simply by "sg_persist -s /dev/sdb" where /dev/sdb in the guest is a scsi-block device corresponding to a multipath device on the host. Before: PR in (Read full status): Aborted command and on the host: prh_write_response: Assertion `resp->sz == 0' failed. After: PR in (Read full status): bad field in cdb or parameter list (perhaps unsupported service action) Reported-by: Jiri Belka <jbelka@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Diffstat (limited to 'scsi')
-rw-r--r--scsi/qemu-pr-helper.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c
index 4057cf355c..0218d65bbf 100644
--- a/scsi/qemu-pr-helper.c
+++ b/scsi/qemu-pr-helper.c
@@ -558,7 +558,11 @@ static int do_pr_in(int fd, const uint8_t *cdb, uint8_t *sense,
#ifdef CONFIG_MPATH
if (is_mpath(fd)) {
/* multipath_pr_in fills the whole input buffer. */
- return multipath_pr_in(fd, cdb, sense, data, *resp_sz);
+ int r = multipath_pr_in(fd, cdb, sense, data, *resp_sz);
+ if (r != GOOD) {
+ *resp_sz = 0;
+ }
+ return r;
}
#endif