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>
This commit is contained in:
Paolo Bonzini 2018-06-20 19:36:15 +02:00
parent 50fa332516
commit 86933b4e78

View File

@ -558,7 +558,11 @@ static int do_pr_in(int fd, const uint8_t *cdb, uint8_t *sense,
#ifdef CONFIG_MPATH #ifdef CONFIG_MPATH
if (is_mpath(fd)) { if (is_mpath(fd)) {
/* multipath_pr_in fills the whole input buffer. */ /* 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 #endif