Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley: "Five changes, two in drivers (qla2xxx, zfcp), one to MAINTAINERS (qla2xxx) and two in the core. The last two are mostly about removing incorrect messages from the kernel log: the resid message is definitely wrong and the sync cache on protected drive problem is arguably wrong" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: MAINTAINERS: Update qla2xxx driver scsi: zfcp: fix reaction on bit error threshold notification scsi: core: save/restore command resid for error handling scsi: qla2xxx: Remove WARN_ON_ONCE in qla2x00_status_cont_entry() scsi: sd: Ignore a failure to sync cache due to lack of authorization
This commit is contained in:
@@ -13364,7 +13364,7 @@ S: Maintained
|
||||
F: drivers/scsi/qla1280.[ch]
|
||||
|
||||
QLOGIC QLA2XXX FC-SCSI DRIVER
|
||||
M: qla2xxx-upstream@qlogic.com
|
||||
M: hmadhani@marvell.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/scsi/LICENSE.qla2xxx
|
||||
|
@@ -27,6 +27,11 @@
|
||||
|
||||
struct kmem_cache *zfcp_fsf_qtcb_cache;
|
||||
|
||||
static bool ber_stop = true;
|
||||
module_param(ber_stop, bool, 0600);
|
||||
MODULE_PARM_DESC(ber_stop,
|
||||
"Shuts down FCP devices for FCP channels that report a bit-error count in excess of its threshold (default on)");
|
||||
|
||||
static void zfcp_fsf_request_timeout_handler(struct timer_list *t)
|
||||
{
|
||||
struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer);
|
||||
@@ -236,10 +241,15 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
|
||||
case FSF_STATUS_READ_SENSE_DATA_AVAIL:
|
||||
break;
|
||||
case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
|
||||
dev_warn(&adapter->ccw_device->dev,
|
||||
"The error threshold for checksum statistics "
|
||||
"has been exceeded\n");
|
||||
zfcp_dbf_hba_bit_err("fssrh_3", req);
|
||||
if (ber_stop) {
|
||||
dev_warn(&adapter->ccw_device->dev,
|
||||
"All paths over this FCP device are disused because of excessive bit errors\n");
|
||||
zfcp_erp_adapter_shutdown(adapter, 0, "fssrh_b");
|
||||
} else {
|
||||
dev_warn(&adapter->ccw_device->dev,
|
||||
"The error threshold for checksum statistics has been exceeded\n");
|
||||
}
|
||||
break;
|
||||
case FSF_STATUS_READ_LINK_DOWN:
|
||||
zfcp_fsf_status_read_link_down(req);
|
||||
|
@@ -2837,8 +2837,6 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
|
||||
if (sense_len == 0) {
|
||||
rsp->status_srb = NULL;
|
||||
sp->done(sp, cp->result);
|
||||
} else {
|
||||
WARN_ON_ONCE(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -967,6 +967,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
|
||||
ses->data_direction = scmd->sc_data_direction;
|
||||
ses->sdb = scmd->sdb;
|
||||
ses->result = scmd->result;
|
||||
ses->resid_len = scmd->req.resid_len;
|
||||
ses->underflow = scmd->underflow;
|
||||
ses->prot_op = scmd->prot_op;
|
||||
ses->eh_eflags = scmd->eh_eflags;
|
||||
@@ -977,6 +978,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
|
||||
memset(scmd->cmnd, 0, BLK_MAX_CDB);
|
||||
memset(&scmd->sdb, 0, sizeof(scmd->sdb));
|
||||
scmd->result = 0;
|
||||
scmd->req.resid_len = 0;
|
||||
|
||||
if (sense_bytes) {
|
||||
scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE,
|
||||
@@ -1029,6 +1031,7 @@ void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
|
||||
scmd->sc_data_direction = ses->data_direction;
|
||||
scmd->sdb = ses->sdb;
|
||||
scmd->result = ses->result;
|
||||
scmd->req.resid_len = ses->resid_len;
|
||||
scmd->underflow = ses->underflow;
|
||||
scmd->prot_op = ses->prot_op;
|
||||
scmd->eh_eflags = ses->eh_eflags;
|
||||
|
@@ -1654,7 +1654,8 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr)
|
||||
/* we need to evaluate the error return */
|
||||
if (scsi_sense_valid(sshdr) &&
|
||||
(sshdr->asc == 0x3a || /* medium not present */
|
||||
sshdr->asc == 0x20)) /* invalid command */
|
||||
sshdr->asc == 0x20 || /* invalid command */
|
||||
(sshdr->asc == 0x74 && sshdr->ascq == 0x71))) /* drive is password locked */
|
||||
/* this is no error here */
|
||||
return 0;
|
||||
|
||||
|
@@ -32,6 +32,7 @@ extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
|
||||
struct scsi_eh_save {
|
||||
/* saved state */
|
||||
int result;
|
||||
unsigned int resid_len;
|
||||
int eh_eflags;
|
||||
enum dma_data_direction data_direction;
|
||||
unsigned underflow;
|
||||
|
Reference in New Issue
Block a user