[SCSI] lpfc 8.3.30: Enhancements for T10 DIF debugfs error injection
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
cf9712403f
commit
9a6b09c071
3 changed files with 213 additions and 158 deletions
|
@ -1010,25 +1010,28 @@ lpfc_debugfs_dif_err_read(struct file *file, char __user *buf,
|
||||||
{
|
{
|
||||||
struct dentry *dent = file->f_dentry;
|
struct dentry *dent = file->f_dentry;
|
||||||
struct lpfc_hba *phba = file->private_data;
|
struct lpfc_hba *phba = file->private_data;
|
||||||
char cbuf[16];
|
char cbuf[32];
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
if (dent == phba->debug_writeGuard)
|
if (dent == phba->debug_writeGuard)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wgrd_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wgrd_cnt);
|
||||||
else if (dent == phba->debug_writeApp)
|
else if (dent == phba->debug_writeApp)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wapp_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wapp_cnt);
|
||||||
else if (dent == phba->debug_writeRef)
|
else if (dent == phba->debug_writeRef)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wref_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wref_cnt);
|
||||||
else if (dent == phba->debug_readGuard)
|
else if (dent == phba->debug_readGuard)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rgrd_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rgrd_cnt);
|
||||||
else if (dent == phba->debug_readApp)
|
else if (dent == phba->debug_readApp)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rapp_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rapp_cnt);
|
||||||
else if (dent == phba->debug_readRef)
|
else if (dent == phba->debug_readRef)
|
||||||
cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rref_cnt);
|
cnt = snprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rref_cnt);
|
||||||
else if (dent == phba->debug_InjErrLBA)
|
else if (dent == phba->debug_InjErrLBA) {
|
||||||
cnt = snprintf(cbuf, 16, "0x%lx\n",
|
if (phba->lpfc_injerr_lba == (unsigned long)(-1))
|
||||||
|
cnt = snprintf(cbuf, 32, "off\n");
|
||||||
|
else
|
||||||
|
cnt = snprintf(cbuf, 32, "0x%lx\n",
|
||||||
(unsigned long) phba->lpfc_injerr_lba);
|
(unsigned long) phba->lpfc_injerr_lba);
|
||||||
else
|
} else
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||||
"0547 Unknown debugfs error injection entry\n");
|
"0547 Unknown debugfs error injection entry\n");
|
||||||
|
|
||||||
|
@ -1042,7 +1045,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
||||||
struct dentry *dent = file->f_dentry;
|
struct dentry *dent = file->f_dentry;
|
||||||
struct lpfc_hba *phba = file->private_data;
|
struct lpfc_hba *phba = file->private_data;
|
||||||
char dstbuf[32];
|
char dstbuf[32];
|
||||||
unsigned long tmp;
|
unsigned long tmp = 0;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
memset(dstbuf, 0, 32);
|
memset(dstbuf, 0, 32);
|
||||||
|
@ -1050,7 +1053,12 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
||||||
if (copy_from_user(dstbuf, buf, size))
|
if (copy_from_user(dstbuf, buf, size))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (strict_strtoul(dstbuf, 0, &tmp))
|
if (dent == phba->debug_InjErrLBA) {
|
||||||
|
if ((buf[0] == 'o') && (buf[1] == 'f') && (buf[2] == 'f'))
|
||||||
|
tmp = (unsigned long)(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((tmp == 0) && (kstrtoul(dstbuf, 0, &tmp)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (dent == phba->debug_writeGuard)
|
if (dent == phba->debug_writeGuard)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*******************************************************************
|
/******************************************************************r
|
||||||
* This file is part of the Emulex Linux Device Driver for *
|
* This file is part of the Emulex Linux Device Driver for *
|
||||||
* Fibre Channel Host Bus Adapters. *
|
* Fibre Channel Host Bus Adapters. *
|
||||||
* Copyright (C) 2004-2012 Emulex. All rights reserved. *
|
* Copyright (C) 2004-2012 Emulex. All rights reserved. *
|
||||||
|
@ -39,8 +39,8 @@
|
||||||
#include "lpfc_sli4.h"
|
#include "lpfc_sli4.h"
|
||||||
#include "lpfc_nl.h"
|
#include "lpfc_nl.h"
|
||||||
#include "lpfc_disc.h"
|
#include "lpfc_disc.h"
|
||||||
#include "lpfc_scsi.h"
|
|
||||||
#include "lpfc.h"
|
#include "lpfc.h"
|
||||||
|
#include "lpfc_scsi.h"
|
||||||
#include "lpfc_logmsg.h"
|
#include "lpfc_logmsg.h"
|
||||||
#include "lpfc_crtn.h"
|
#include "lpfc_crtn.h"
|
||||||
#include "lpfc_vport.h"
|
#include "lpfc_vport.h"
|
||||||
|
@ -51,13 +51,19 @@
|
||||||
int _dump_buf_done;
|
int _dump_buf_done;
|
||||||
|
|
||||||
static char *dif_op_str[] = {
|
static char *dif_op_str[] = {
|
||||||
"SCSI_PROT_NORMAL",
|
"PROT_NORMAL",
|
||||||
"SCSI_PROT_READ_INSERT",
|
"PROT_READ_INSERT",
|
||||||
"SCSI_PROT_WRITE_STRIP",
|
"PROT_WRITE_STRIP",
|
||||||
"SCSI_PROT_READ_STRIP",
|
"PROT_READ_STRIP",
|
||||||
"SCSI_PROT_WRITE_INSERT",
|
"PROT_WRITE_INSERT",
|
||||||
"SCSI_PROT_READ_PASS",
|
"PROT_READ_PASS",
|
||||||
"SCSI_PROT_WRITE_PASS",
|
"PROT_WRITE_PASS",
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *dif_grd_str[] = {
|
||||||
|
"NO_GUARD",
|
||||||
|
"DIF_CRC",
|
||||||
|
"DIX_IP",
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scsi_dif_tuple {
|
struct scsi_dif_tuple {
|
||||||
|
@ -1281,10 +1287,14 @@ lpfc_cmd_blksize(struct scsi_cmnd *sc)
|
||||||
|
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
|
|
||||||
#define BG_ERR_INIT 1
|
/* Return if if error injection is detected by Initiator */
|
||||||
#define BG_ERR_TGT 2
|
#define BG_ERR_INIT 0x1
|
||||||
#define BG_ERR_SWAP 3
|
/* Return if if error injection is detected by Target */
|
||||||
#define BG_ERR_CHECK 4
|
#define BG_ERR_TGT 0x2
|
||||||
|
/* Return if if swapping CSUM<-->CRC is required for error injection */
|
||||||
|
#define BG_ERR_SWAP 0x10
|
||||||
|
/* Return if disabling Guard/Ref/App checking is required for error injection */
|
||||||
|
#define BG_ERR_CHECK 0x20
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lpfc_bg_err_inject - Determine if we should inject an error
|
* lpfc_bg_err_inject - Determine if we should inject an error
|
||||||
|
@ -1294,10 +1304,7 @@ lpfc_cmd_blksize(struct scsi_cmnd *sc)
|
||||||
* @apptag: (out) BlockGuard application tag for transmitted data
|
* @apptag: (out) BlockGuard application tag for transmitted data
|
||||||
* @new_guard (in) Value to replace CRC with if needed
|
* @new_guard (in) Value to replace CRC with if needed
|
||||||
*
|
*
|
||||||
* Returns (1) if error injection is detected by Initiator
|
* Returns BG_ERR_* bit mask or 0 if request ignored
|
||||||
* Returns (2) if error injection is detected by Target
|
|
||||||
* Returns (3) if swapping CSUM->CRC is required for error injection
|
|
||||||
* Returns (4) disabling Guard/Ref/App checking is required for error injection
|
|
||||||
**/
|
**/
|
||||||
static int
|
static int
|
||||||
lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
|
@ -1305,6 +1312,7 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
{
|
{
|
||||||
struct scatterlist *sgpe; /* s/g prot entry */
|
struct scatterlist *sgpe; /* s/g prot entry */
|
||||||
struct scatterlist *sgde; /* s/g data entry */
|
struct scatterlist *sgde; /* s/g data entry */
|
||||||
|
struct lpfc_scsi_buf *lpfc_cmd = NULL;
|
||||||
struct scsi_dif_tuple *src = NULL;
|
struct scsi_dif_tuple *src = NULL;
|
||||||
uint32_t op = scsi_get_prot_op(sc);
|
uint32_t op = scsi_get_prot_op(sc);
|
||||||
uint32_t blksize;
|
uint32_t blksize;
|
||||||
|
@ -1336,6 +1344,7 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
blockoff = numblks;
|
blockoff = numblks;
|
||||||
src = (struct scsi_dif_tuple *)sg_virt(sgpe);
|
src = (struct scsi_dif_tuple *)sg_virt(sgpe);
|
||||||
src += blockoff;
|
src += blockoff;
|
||||||
|
lpfc_cmd = (struct lpfc_scsi_buf *)sc->host_scribble;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1344,27 +1353,58 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
if (phba->lpfc_injerr_wref_cnt) {
|
if (phba->lpfc_injerr_wref_cnt) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case SCSI_PROT_WRITE_PASS:
|
case SCSI_PROT_WRITE_PASS:
|
||||||
if (blockoff && src) {
|
if (src) {
|
||||||
/* Insert error in middle of the IO */
|
/*
|
||||||
|
* For WRITE_PASS, force the error
|
||||||
|
* to be sent on the wire. It should
|
||||||
|
* be detected by the Target.
|
||||||
|
* If blockoff != 0 error will be
|
||||||
|
* inserted in middle of the IO.
|
||||||
|
*/
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
"9076 BLKGRD: Injecting reftag error: "
|
"9076 BLKGRD: Injecting reftag error: "
|
||||||
"write lba x%lx + x%x oldrefTag x%x\n",
|
"write lba x%lx + x%x oldrefTag x%x\n",
|
||||||
(unsigned long)lba, blockoff,
|
(unsigned long)lba, blockoff,
|
||||||
src->ref_tag);
|
be32_to_cpu(src->ref_tag));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE, this will change ref tag in
|
* Save the old ref_tag so we can
|
||||||
* the memory location forever!
|
* restore it on completion.
|
||||||
*/
|
*/
|
||||||
src->ref_tag = 0xDEADBEEF;
|
if (lpfc_cmd) {
|
||||||
|
lpfc_cmd->prot_data_type =
|
||||||
|
LPFC_INJERR_REFTAG;
|
||||||
|
lpfc_cmd->prot_data_segment =
|
||||||
|
src;
|
||||||
|
lpfc_cmd->prot_data =
|
||||||
|
src->ref_tag;
|
||||||
|
}
|
||||||
|
src->ref_tag = cpu_to_be32(0xDEADBEEF);
|
||||||
phba->lpfc_injerr_wref_cnt--;
|
phba->lpfc_injerr_wref_cnt--;
|
||||||
phba->lpfc_injerr_lba =
|
phba->lpfc_injerr_lba =
|
||||||
LPFC_INJERR_LBA_OFF;
|
LPFC_INJERR_LBA_OFF;
|
||||||
rc = BG_ERR_CHECK;
|
rc = BG_ERR_TGT | BG_ERR_CHECK;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Drop thru */
|
/* Drop thru */
|
||||||
|
case SCSI_PROT_WRITE_INSERT:
|
||||||
|
/*
|
||||||
|
* For WRITE_INSERT, force the error
|
||||||
|
* to be sent on the wire. It should be
|
||||||
|
* detected by the Target.
|
||||||
|
*/
|
||||||
|
/* DEADBEEF will be the reftag on the wire */
|
||||||
|
*reftag = 0xDEADBEEF;
|
||||||
|
phba->lpfc_injerr_wref_cnt--;
|
||||||
|
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
||||||
|
rc = BG_ERR_TGT | BG_ERR_CHECK;
|
||||||
|
|
||||||
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
|
"9078 BLKGRD: Injecting reftag error: "
|
||||||
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
|
break;
|
||||||
case SCSI_PROT_WRITE_STRIP:
|
case SCSI_PROT_WRITE_STRIP:
|
||||||
/*
|
/*
|
||||||
* For WRITE_STRIP and WRITE_PASS,
|
* For WRITE_STRIP and WRITE_PASS,
|
||||||
|
@ -1380,22 +1420,6 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
"9077 BLKGRD: Injecting reftag error: "
|
"9077 BLKGRD: Injecting reftag error: "
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
break;
|
break;
|
||||||
case SCSI_PROT_WRITE_INSERT:
|
|
||||||
/*
|
|
||||||
* For WRITE_INSERT, force the
|
|
||||||
* error to be sent on the wire. It should be
|
|
||||||
* detected by the Target.
|
|
||||||
*/
|
|
||||||
/* DEADBEEF will be the reftag on the wire */
|
|
||||||
*reftag = 0xDEADBEEF;
|
|
||||||
phba->lpfc_injerr_wref_cnt--;
|
|
||||||
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
|
||||||
rc = BG_ERR_TGT;
|
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
|
||||||
"9078 BLKGRD: Injecting reftag error: "
|
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (phba->lpfc_injerr_rref_cnt) {
|
if (phba->lpfc_injerr_rref_cnt) {
|
||||||
|
@ -1432,26 +1456,58 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case SCSI_PROT_WRITE_PASS:
|
case SCSI_PROT_WRITE_PASS:
|
||||||
if (blockoff && src) {
|
if (blockoff && src) {
|
||||||
/* Insert error in middle of the IO */
|
/*
|
||||||
|
* For WRITE_PASS, force the error
|
||||||
|
* to be sent on the wire. It should
|
||||||
|
* be detected by the Target.
|
||||||
|
* If blockoff != 0 error will be
|
||||||
|
* inserted in middle of the IO.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
"9080 BLKGRD: Injecting apptag error: "
|
"9080 BLKGRD: Injecting apptag error: "
|
||||||
"write lba x%lx + x%x oldappTag x%x\n",
|
"write lba x%lx + x%x oldappTag x%x\n",
|
||||||
(unsigned long)lba, blockoff,
|
(unsigned long)lba, blockoff,
|
||||||
src->app_tag);
|
be16_to_cpu(src->app_tag));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE, this will change app tag in
|
* Save the old app_tag so we can
|
||||||
* the memory location forever!
|
* restore it on completion.
|
||||||
*/
|
*/
|
||||||
src->app_tag = 0xDEAD;
|
if (lpfc_cmd) {
|
||||||
|
lpfc_cmd->prot_data_type =
|
||||||
|
LPFC_INJERR_APPTAG;
|
||||||
|
lpfc_cmd->prot_data_segment =
|
||||||
|
src;
|
||||||
|
lpfc_cmd->prot_data =
|
||||||
|
src->app_tag;
|
||||||
|
}
|
||||||
|
src->app_tag = cpu_to_be16(0xDEAD);
|
||||||
phba->lpfc_injerr_wapp_cnt--;
|
phba->lpfc_injerr_wapp_cnt--;
|
||||||
phba->lpfc_injerr_lba =
|
phba->lpfc_injerr_lba =
|
||||||
LPFC_INJERR_LBA_OFF;
|
LPFC_INJERR_LBA_OFF;
|
||||||
rc = BG_ERR_CHECK;
|
rc = BG_ERR_TGT | BG_ERR_CHECK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Drop thru */
|
/* Drop thru */
|
||||||
|
case SCSI_PROT_WRITE_INSERT:
|
||||||
|
/*
|
||||||
|
* For WRITE_INSERT, force the
|
||||||
|
* error to be sent on the wire. It should be
|
||||||
|
* detected by the Target.
|
||||||
|
*/
|
||||||
|
/* DEAD will be the apptag on the wire */
|
||||||
|
*apptag = 0xDEAD;
|
||||||
|
phba->lpfc_injerr_wapp_cnt--;
|
||||||
|
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
||||||
|
rc = BG_ERR_TGT;
|
||||||
|
rc = BG_ERR_TGT | BG_ERR_CHECK;
|
||||||
|
|
||||||
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
|
"0813 BLKGRD: Injecting apptag error: "
|
||||||
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
|
break;
|
||||||
case SCSI_PROT_WRITE_STRIP:
|
case SCSI_PROT_WRITE_STRIP:
|
||||||
/*
|
/*
|
||||||
* For WRITE_STRIP and WRITE_PASS,
|
* For WRITE_STRIP and WRITE_PASS,
|
||||||
|
@ -1467,22 +1523,6 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
"0812 BLKGRD: Injecting apptag error: "
|
"0812 BLKGRD: Injecting apptag error: "
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
break;
|
break;
|
||||||
case SCSI_PROT_WRITE_INSERT:
|
|
||||||
/*
|
|
||||||
* For WRITE_INSERT, force the
|
|
||||||
* error to be sent on the wire. It should be
|
|
||||||
* detected by the Target.
|
|
||||||
*/
|
|
||||||
/* DEAD will be the apptag on the wire */
|
|
||||||
*apptag = 0xDEAD;
|
|
||||||
phba->lpfc_injerr_wapp_cnt--;
|
|
||||||
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
|
||||||
rc = BG_ERR_TGT;
|
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
|
||||||
"0813 BLKGRD: Injecting apptag error: "
|
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (phba->lpfc_injerr_rapp_cnt) {
|
if (phba->lpfc_injerr_rapp_cnt) {
|
||||||
|
@ -1519,43 +1559,9 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
if (phba->lpfc_injerr_wgrd_cnt) {
|
if (phba->lpfc_injerr_wgrd_cnt) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case SCSI_PROT_WRITE_PASS:
|
case SCSI_PROT_WRITE_PASS:
|
||||||
if (blockoff && src) {
|
rc = BG_ERR_CHECK;
|
||||||
/* Insert error in middle of the IO */
|
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
|
||||||
"0815 BLKGRD: Injecting guard error: "
|
|
||||||
"write lba x%lx + x%x oldgrdTag x%x\n",
|
|
||||||
(unsigned long)lba, blockoff,
|
|
||||||
src->guard_tag);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOTE, this will change guard tag in
|
|
||||||
* the memory location forever!
|
|
||||||
*/
|
|
||||||
src->guard_tag = 0xDEAD;
|
|
||||||
phba->lpfc_injerr_wgrd_cnt--;
|
|
||||||
phba->lpfc_injerr_lba =
|
|
||||||
LPFC_INJERR_LBA_OFF;
|
|
||||||
rc = BG_ERR_CHECK;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Drop thru */
|
/* Drop thru */
|
||||||
case SCSI_PROT_WRITE_STRIP:
|
|
||||||
/*
|
|
||||||
* For WRITE_STRIP and WRITE_PASS,
|
|
||||||
* force the error on data
|
|
||||||
* being copied from SLI-Host to SLI-Port.
|
|
||||||
*/
|
|
||||||
phba->lpfc_injerr_wgrd_cnt--;
|
|
||||||
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
|
||||||
|
|
||||||
rc = BG_ERR_SWAP;
|
|
||||||
/* Signals the caller to swap CRC->CSUM */
|
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
|
||||||
"0816 BLKGRD: Injecting guard error: "
|
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
|
||||||
break;
|
|
||||||
case SCSI_PROT_WRITE_INSERT:
|
case SCSI_PROT_WRITE_INSERT:
|
||||||
/*
|
/*
|
||||||
* For WRITE_INSERT, force the
|
* For WRITE_INSERT, force the
|
||||||
|
@ -1565,13 +1571,29 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
phba->lpfc_injerr_wgrd_cnt--;
|
phba->lpfc_injerr_wgrd_cnt--;
|
||||||
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
||||||
|
|
||||||
rc = BG_ERR_SWAP;
|
rc |= BG_ERR_TGT | BG_ERR_SWAP;
|
||||||
/* Signals the caller to swap CRC->CSUM */
|
/* Signals the caller to swap CRC->CSUM */
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
"0817 BLKGRD: Injecting guard error: "
|
"0817 BLKGRD: Injecting guard error: "
|
||||||
"write lba x%lx\n", (unsigned long)lba);
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
break;
|
break;
|
||||||
|
case SCSI_PROT_WRITE_STRIP:
|
||||||
|
/*
|
||||||
|
* For WRITE_STRIP and WRITE_PASS,
|
||||||
|
* force the error on data
|
||||||
|
* being copied from SLI-Host to SLI-Port.
|
||||||
|
*/
|
||||||
|
phba->lpfc_injerr_wgrd_cnt--;
|
||||||
|
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
||||||
|
|
||||||
|
rc = BG_ERR_INIT | BG_ERR_SWAP;
|
||||||
|
/* Signals the caller to swap CRC->CSUM */
|
||||||
|
|
||||||
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
|
"0816 BLKGRD: Injecting guard error: "
|
||||||
|
"write lba x%lx\n", (unsigned long)lba);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (phba->lpfc_injerr_rgrd_cnt) {
|
if (phba->lpfc_injerr_rgrd_cnt) {
|
||||||
|
@ -1589,11 +1611,10 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
* error on data being read off the wire. It
|
* error on data being read off the wire. It
|
||||||
* should force an IO error to the driver.
|
* should force an IO error to the driver.
|
||||||
*/
|
*/
|
||||||
*apptag = 0xDEAD;
|
|
||||||
phba->lpfc_injerr_rgrd_cnt--;
|
phba->lpfc_injerr_rgrd_cnt--;
|
||||||
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
|
||||||
|
|
||||||
rc = BG_ERR_SWAP;
|
rc = BG_ERR_INIT | BG_ERR_SWAP;
|
||||||
/* Signals the caller to swap CRC->CSUM */
|
/* Signals the caller to swap CRC->CSUM */
|
||||||
|
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
lpfc_printf_log(phba, KERN_ERR, LOG_BG,
|
||||||
|
@ -1722,7 +1743,7 @@ lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
|
|
||||||
case SCSI_PROT_READ_PASS:
|
case SCSI_PROT_READ_PASS:
|
||||||
case SCSI_PROT_WRITE_PASS:
|
case SCSI_PROT_WRITE_PASS:
|
||||||
*txop = BG_OP_IN_CRC_OUT_CRC;
|
*txop = BG_OP_IN_CRC_OUT_CSUM;
|
||||||
*rxop = BG_OP_IN_CRC_OUT_CRC;
|
*rxop = BG_OP_IN_CRC_OUT_CRC;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1741,7 +1762,7 @@ lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
|
|
||||||
case SCSI_PROT_READ_PASS:
|
case SCSI_PROT_READ_PASS:
|
||||||
case SCSI_PROT_WRITE_PASS:
|
case SCSI_PROT_WRITE_PASS:
|
||||||
*txop = BG_OP_IN_CSUM_OUT_CRC;
|
*txop = BG_OP_IN_CSUM_OUT_CSUM;
|
||||||
*rxop = BG_OP_IN_CRC_OUT_CSUM;
|
*rxop = BG_OP_IN_CRC_OUT_CSUM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1819,9 +1840,9 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (rc == BG_ERR_SWAP)
|
if (rc & BG_ERR_SWAP)
|
||||||
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
||||||
if (rc == BG_ERR_CHECK)
|
if (rc & BG_ERR_CHECK)
|
||||||
checking = 0;
|
checking = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1966,9 +1987,9 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (rc == BG_ERR_SWAP)
|
if (rc & BG_ERR_SWAP)
|
||||||
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
||||||
if (rc == BG_ERR_CHECK)
|
if (rc & BG_ERR_CHECK)
|
||||||
checking = 0;
|
checking = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2174,9 +2195,9 @@ lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (rc == BG_ERR_SWAP)
|
if (rc & BG_ERR_SWAP)
|
||||||
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
||||||
if (rc == BG_ERR_CHECK)
|
if (rc & BG_ERR_CHECK)
|
||||||
checking = 0;
|
checking = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2314,9 +2335,9 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (rc == BG_ERR_SWAP)
|
if (rc & BG_ERR_SWAP)
|
||||||
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
|
||||||
if (rc == BG_ERR_CHECK)
|
if (rc & BG_ERR_CHECK)
|
||||||
checking = 0;
|
checking = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -3460,6 +3481,37 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
||||||
/* pick up SLI4 exhange busy status from HBA */
|
/* pick up SLI4 exhange busy status from HBA */
|
||||||
lpfc_cmd->exch_busy = pIocbOut->iocb_flag & LPFC_EXCHANGE_BUSY;
|
lpfc_cmd->exch_busy = pIocbOut->iocb_flag & LPFC_EXCHANGE_BUSY;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
|
if (lpfc_cmd->prot_data_type) {
|
||||||
|
struct scsi_dif_tuple *src = NULL;
|
||||||
|
|
||||||
|
src = (struct scsi_dif_tuple *)lpfc_cmd->prot_data_segment;
|
||||||
|
/*
|
||||||
|
* Used to restore any changes to protection
|
||||||
|
* data for error injection.
|
||||||
|
*/
|
||||||
|
switch (lpfc_cmd->prot_data_type) {
|
||||||
|
case LPFC_INJERR_REFTAG:
|
||||||
|
src->ref_tag =
|
||||||
|
lpfc_cmd->prot_data;
|
||||||
|
break;
|
||||||
|
case LPFC_INJERR_APPTAG:
|
||||||
|
src->app_tag =
|
||||||
|
(uint16_t)lpfc_cmd->prot_data;
|
||||||
|
break;
|
||||||
|
case LPFC_INJERR_GUARD:
|
||||||
|
src->guard_tag =
|
||||||
|
(uint16_t)lpfc_cmd->prot_data;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpfc_cmd->prot_data = 0;
|
||||||
|
lpfc_cmd->prot_data_type = 0;
|
||||||
|
lpfc_cmd->prot_data_segment = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (pnode && NLP_CHK_NODE_ACT(pnode))
|
if (pnode && NLP_CHK_NODE_ACT(pnode))
|
||||||
atomic_dec(&pnode->cmd_pending);
|
atomic_dec(&pnode->cmd_pending);
|
||||||
|
|
||||||
|
@ -4119,63 +4171,48 @@ lpfc_queuecommand_lck(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
|
||||||
if (scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) {
|
if (scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) {
|
||||||
if (vport->phba->cfg_enable_bg) {
|
if (vport->phba->cfg_enable_bg) {
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9033 BLKGRD: rcvd protected cmd:%02x op:%02x "
|
"9033 BLKGRD: rcvd protected cmd:%02x op=%s "
|
||||||
"str=%s\n",
|
"guard=%s\n", cmnd->cmnd[0],
|
||||||
cmnd->cmnd[0], scsi_get_prot_op(cmnd),
|
dif_op_str[scsi_get_prot_op(cmnd)],
|
||||||
dif_op_str[scsi_get_prot_op(cmnd)]);
|
dif_grd_str[scsi_host_get_guard(shost)]);
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
|
||||||
"9034 BLKGRD: CDB: %02x %02x %02x %02x %02x "
|
|
||||||
"%02x %02x %02x %02x %02x\n",
|
|
||||||
cmnd->cmnd[0], cmnd->cmnd[1], cmnd->cmnd[2],
|
|
||||||
cmnd->cmnd[3], cmnd->cmnd[4], cmnd->cmnd[5],
|
|
||||||
cmnd->cmnd[6], cmnd->cmnd[7], cmnd->cmnd[8],
|
|
||||||
cmnd->cmnd[9]);
|
|
||||||
if (cmnd->cmnd[0] == READ_10)
|
if (cmnd->cmnd[0] == READ_10)
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9035 BLKGRD: READ @ sector %llu, "
|
"9035 BLKGRD: READ @ sector %llu, "
|
||||||
"count %u\n",
|
"cnt %u, rpt %d\n",
|
||||||
(unsigned long long)scsi_get_lba(cmnd),
|
(unsigned long long)scsi_get_lba(cmnd),
|
||||||
blk_rq_sectors(cmnd->request));
|
blk_rq_sectors(cmnd->request),
|
||||||
|
(cmnd->cmnd[1]>>5));
|
||||||
else if (cmnd->cmnd[0] == WRITE_10)
|
else if (cmnd->cmnd[0] == WRITE_10)
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9036 BLKGRD: WRITE @ sector %llu, "
|
"9036 BLKGRD: WRITE @ sector %llu, "
|
||||||
"count %u cmd=%p\n",
|
"cnt %u, wpt %d\n",
|
||||||
(unsigned long long)scsi_get_lba(cmnd),
|
(unsigned long long)scsi_get_lba(cmnd),
|
||||||
blk_rq_sectors(cmnd->request),
|
blk_rq_sectors(cmnd->request),
|
||||||
cmnd);
|
(cmnd->cmnd[1]>>5));
|
||||||
}
|
}
|
||||||
|
|
||||||
err = lpfc_bg_scsi_prep_dma_buf(phba, lpfc_cmd);
|
err = lpfc_bg_scsi_prep_dma_buf(phba, lpfc_cmd);
|
||||||
} else {
|
} else {
|
||||||
if (vport->phba->cfg_enable_bg) {
|
if (vport->phba->cfg_enable_bg) {
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9038 BLKGRD: rcvd unprotected cmd:"
|
"9038 BLKGRD: rcvd unprotected cmd:"
|
||||||
"%02x op:%02x str=%s\n",
|
"%02x op=%s guard=%s\n", cmnd->cmnd[0],
|
||||||
cmnd->cmnd[0], scsi_get_prot_op(cmnd),
|
dif_op_str[scsi_get_prot_op(cmnd)],
|
||||||
dif_op_str[scsi_get_prot_op(cmnd)]);
|
dif_grd_str[scsi_host_get_guard(shost)]);
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
|
||||||
"9039 BLKGRD: CDB: %02x %02x %02x "
|
|
||||||
"%02x %02x %02x %02x %02x %02x %02x\n",
|
|
||||||
cmnd->cmnd[0], cmnd->cmnd[1],
|
|
||||||
cmnd->cmnd[2], cmnd->cmnd[3],
|
|
||||||
cmnd->cmnd[4], cmnd->cmnd[5],
|
|
||||||
cmnd->cmnd[6], cmnd->cmnd[7],
|
|
||||||
cmnd->cmnd[8], cmnd->cmnd[9]);
|
|
||||||
if (cmnd->cmnd[0] == READ_10)
|
if (cmnd->cmnd[0] == READ_10)
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9040 dbg: READ @ sector %llu, "
|
"9040 dbg: READ @ sector %llu, "
|
||||||
"count %u\n",
|
"cnt %u, rpt %d\n",
|
||||||
(unsigned long long)scsi_get_lba(cmnd),
|
(unsigned long long)scsi_get_lba(cmnd),
|
||||||
blk_rq_sectors(cmnd->request));
|
blk_rq_sectors(cmnd->request),
|
||||||
|
(cmnd->cmnd[1]>>5));
|
||||||
else if (cmnd->cmnd[0] == WRITE_10)
|
else if (cmnd->cmnd[0] == WRITE_10)
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
||||||
"9041 dbg: WRITE @ sector %llu, "
|
"9041 dbg: WRITE @ sector %llu, "
|
||||||
"count %u cmd=%p\n",
|
"cnt %u, wpt %d\n",
|
||||||
(unsigned long long)scsi_get_lba(cmnd),
|
(unsigned long long)scsi_get_lba(cmnd),
|
||||||
blk_rq_sectors(cmnd->request), cmnd);
|
blk_rq_sectors(cmnd->request),
|
||||||
else
|
(cmnd->cmnd[1]>>5));
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_BG,
|
|
||||||
"9042 dbg: parser not implemented\n");
|
|
||||||
}
|
}
|
||||||
err = lpfc_scsi_prep_dma_buf(phba, lpfc_cmd);
|
err = lpfc_scsi_prep_dma_buf(phba, lpfc_cmd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,16 @@ struct lpfc_scsi_buf {
|
||||||
struct lpfc_iocbq cur_iocbq;
|
struct lpfc_iocbq cur_iocbq;
|
||||||
wait_queue_head_t *waitq;
|
wait_queue_head_t *waitq;
|
||||||
unsigned long start_time;
|
unsigned long start_time;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
|
/* Used to restore any changes to protection data for error injection */
|
||||||
|
void *prot_data_segment;
|
||||||
|
uint32_t prot_data;
|
||||||
|
uint32_t prot_data_type;
|
||||||
|
#define LPFC_INJERR_REFTAG 1
|
||||||
|
#define LPFC_INJERR_APPTAG 2
|
||||||
|
#define LPFC_INJERR_GUARD 3
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LPFC_SCSI_DMA_EXT_SIZE 264
|
#define LPFC_SCSI_DMA_EXT_SIZE 264
|
||||||
|
|
Loading…
Reference in a new issue