Skip to content

Commit c51b199

Browse files
steffen-maierZhengShunQian
authored andcommitted
scsi: zfcp: fix missing SCSI trace for result of eh_host_reset_handler
commit df30781 upstream. For problem determination we need to see whether and why we were successful or not. This allows deduction of scsi_eh escalation. Example trace record formatted with zfcpdbf from s390-tools: Timestamp : ... Area : SCSI Subarea : 00 Level : 1 Exception : - CPU ID : .. Caller : 0x... Record ID : 1 Tag : schrh_r SCSI host reset handler result Request ID : 0x0000000000000000 none (invalid) SCSI ID : 0xffffffff none (invalid) SCSI LUN : 0xffffffff none (invalid) SCSI LUN high : 0xffffffff none (invalid) SCSI result : 0x00002002 field re-used for midlayer value: SUCCESS or in other cases: 0x2009 == FAST_IO_FAIL SCSI retries : 0xff none (invalid) SCSI allowed : 0xff none (invalid) SCSI scribble : 0xffffffffffffffff none (invalid) SCSI opcode : ffffffff ffffffff ffffffff ffffffff none (invalid) FCP rsp inf cod: 0xff none (invalid) FCP rsp IU : 00000000 00000000 00000000 00000000 none (invalid) 00000000 00000000 v2.6.35 commit a1dbfdd ("[SCSI] zfcp: Pass return code from fc_block_scsi_eh to scsi eh") introduced the first return with something other than the previously hardcoded single SUCCESS return path. Signed-off-by: Steffen Maier <maier@linux.ibm.com> Fixes: a1dbfdd ("[SCSI] zfcp: Pass return code from fc_block_scsi_eh to scsi eh") Cc: <stable@vger.kernel.org> #2.6.38+ Reviewed-by: Jens Remus <jremus@linux.ibm.com> Reviewed-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 5d8c3cf commit c51b199

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

drivers/s390/scsi/zfcp_dbf.c

+40
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,46 @@ void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc,
625625
spin_unlock_irqrestore(&dbf->scsi_lock, flags);
626626
}
627627

628+
/**
629+
* zfcp_dbf_scsi_eh() - Trace event for special cases of scsi_eh callbacks.
630+
* @tag: Identifier for event.
631+
* @adapter: Pointer to zfcp adapter as context for this event.
632+
* @scsi_id: SCSI ID/target to indicate scope of task management function (TMF).
633+
* @ret: Return value of calling function.
634+
*
635+
* This SCSI trace variant does not depend on any of:
636+
* scsi_cmnd, zfcp_fsf_req, scsi_device.
637+
*/
638+
void zfcp_dbf_scsi_eh(char *tag, struct zfcp_adapter *adapter,
639+
unsigned int scsi_id, int ret)
640+
{
641+
struct zfcp_dbf *dbf = adapter->dbf;
642+
struct zfcp_dbf_scsi *rec = &dbf->scsi_buf;
643+
unsigned long flags;
644+
static int const level = 1;
645+
646+
if (unlikely(!debug_level_enabled(adapter->dbf->scsi, level)))
647+
return;
648+
649+
spin_lock_irqsave(&dbf->scsi_lock, flags);
650+
memset(rec, 0, sizeof(*rec));
651+
652+
memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
653+
rec->id = ZFCP_DBF_SCSI_CMND;
654+
rec->scsi_result = ret; /* re-use field, int is 4 bytes and fits */
655+
rec->scsi_retries = ~0;
656+
rec->scsi_allowed = ~0;
657+
rec->fcp_rsp_info = ~0;
658+
rec->scsi_id = scsi_id;
659+
rec->scsi_lun = (u32)ZFCP_DBF_INVALID_LUN;
660+
rec->scsi_lun_64_hi = (u32)(ZFCP_DBF_INVALID_LUN >> 32);
661+
rec->host_scribble = ~0;
662+
memset(rec->scsi_opcode, 0xff, ZFCP_DBF_SCSI_OPCODE);
663+
664+
debug_event(dbf->scsi, level, rec, sizeof(*rec));
665+
spin_unlock_irqrestore(&dbf->scsi_lock, flags);
666+
}
667+
628668
static debug_info_t *zfcp_dbf_reg(const char *name, int size, int rec_size)
629669
{
630670
struct debug_info *d;

drivers/s390/scsi/zfcp_ext.h

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *);
5252
extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *);
5353
extern void zfcp_dbf_scsi(char *, int, struct scsi_cmnd *,
5454
struct zfcp_fsf_req *);
55+
extern void zfcp_dbf_scsi_eh(char *tag, struct zfcp_adapter *adapter,
56+
unsigned int scsi_id, int ret);
5557

5658
/* zfcp_erp.c */
5759
extern void zfcp_erp_set_adapter_status(struct zfcp_adapter *, u32);

drivers/s390/scsi/zfcp_scsi.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -322,15 +322,16 @@ static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
322322
{
323323
struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
324324
struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
325-
int ret;
325+
int ret = SUCCESS, fc_ret;
326326

327327
zfcp_erp_adapter_reopen(adapter, 0, "schrh_1");
328328
zfcp_erp_wait(adapter);
329-
ret = fc_block_scsi_eh(scpnt);
330-
if (ret)
331-
return ret;
329+
fc_ret = fc_block_scsi_eh(scpnt);
330+
if (fc_ret)
331+
ret = fc_ret;
332332

333-
return SUCCESS;
333+
zfcp_dbf_scsi_eh("schrh_r", adapter, ~0, ret);
334+
return ret;
334335
}
335336

336337
struct scsi_transport_template *zfcp_scsi_transport_template;

0 commit comments

Comments
 (0)