Rework scsifront_action_handler() to add the SCSI device as the first argument, and select between abort and device reset by checking whether the scsi_cmnd argument is NULL. Signed-off-by: Hannes Reinecke <hare@xxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> --- drivers/scsi/xen-scsifront.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/scsi/xen-scsifront.c b/drivers/scsi/xen-scsifront.c index a0c13200d53a..5a6cb582e5eb 100644 --- a/drivers/scsi/xen-scsifront.c +++ b/drivers/scsi/xen-scsifront.c @@ -668,11 +668,12 @@ static int scsifront_queuecommand(struct Scsi_Host *shost, * We have to wait until an answer is returned. This answer contains the * result to be returned to the requestor. */ -static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act) +static int scsifront_action_handler(struct scsi_device *sdev, + struct scsi_cmnd *sc) { - struct Scsi_Host *host = sc->device->host; + struct Scsi_Host *host = sdev->host; struct vscsifrnt_info *info = shost_priv(host); - struct vscsifrnt_shadow *shadow, *s = scsi_cmd_priv(sc); + struct vscsifrnt_shadow *shadow; int err = 0; if (info->host_active == STATE_ERROR) @@ -682,10 +683,14 @@ static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act) if (!shadow) return FAILED; - shadow->act = act; + shadow->act = sc ? VSCSIIF_ACT_SCSI_ABORT : VSCSIIF_ACT_SCSI_RESET; shadow->rslt_reset = RSLT_RESET_WAITING; shadow->sc = sc; - shadow->ref_rqid = s->rqid; + if (sc) { + struct vscsifrnt_shadow *s = scsi_cmd_priv(sc); + + shadow->ref_rqid = s->rqid; + } init_waitqueue_head(&shadow->wq_reset); spin_lock_irq(host->host_lock); @@ -735,13 +740,13 @@ static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act) static int scsifront_eh_abort_handler(struct scsi_cmnd *sc) { pr_debug("%s\n", __func__); - return scsifront_action_handler(sc, VSCSIIF_ACT_SCSI_ABORT); + return scsifront_action_handler(sc->device, sc); } static int scsifront_dev_reset_handler(struct scsi_cmnd *sc) { pr_debug("%s\n", __func__); - return scsifront_action_handler(sc, VSCSIIF_ACT_SCSI_RESET); + return scsifront_action_handler(sc->device, NULL); } static int scsifront_sdev_configure(struct scsi_device *sdev) -- 2.35.3