Commit 8625732e authored by Linus Torvalds's avatar Linus Torvalds

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
parents 8e0d0ad2 b23f330d
...@@ -13364,7 +13364,7 @@ S: Maintained ...@@ -13364,7 +13364,7 @@ S: Maintained
F: drivers/scsi/qla1280.[ch] F: drivers/scsi/qla1280.[ch]
QLOGIC QLA2XXX FC-SCSI DRIVER QLOGIC QLA2XXX FC-SCSI DRIVER
M: qla2xxx-upstream@qlogic.com M: hmadhani@marvell.com
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
S: Supported S: Supported
F: Documentation/scsi/LICENSE.qla2xxx F: Documentation/scsi/LICENSE.qla2xxx
......
...@@ -27,6 +27,11 @@ ...@@ -27,6 +27,11 @@
struct kmem_cache *zfcp_fsf_qtcb_cache; 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) static void zfcp_fsf_request_timeout_handler(struct timer_list *t)
{ {
struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer); 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) ...@@ -236,10 +241,15 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
case FSF_STATUS_READ_SENSE_DATA_AVAIL: case FSF_STATUS_READ_SENSE_DATA_AVAIL:
break; break;
case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: 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); 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; break;
case FSF_STATUS_READ_LINK_DOWN: case FSF_STATUS_READ_LINK_DOWN:
zfcp_fsf_status_read_link_down(req); zfcp_fsf_status_read_link_down(req);
......
...@@ -2837,8 +2837,6 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) ...@@ -2837,8 +2837,6 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
if (sense_len == 0) { if (sense_len == 0) {
rsp->status_srb = NULL; rsp->status_srb = NULL;
sp->done(sp, cp->result); 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, ...@@ -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->data_direction = scmd->sc_data_direction;
ses->sdb = scmd->sdb; ses->sdb = scmd->sdb;
ses->result = scmd->result; ses->result = scmd->result;
ses->resid_len = scmd->req.resid_len;
ses->underflow = scmd->underflow; ses->underflow = scmd->underflow;
ses->prot_op = scmd->prot_op; ses->prot_op = scmd->prot_op;
ses->eh_eflags = scmd->eh_eflags; ses->eh_eflags = scmd->eh_eflags;
...@@ -977,6 +978,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses, ...@@ -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->cmnd, 0, BLK_MAX_CDB);
memset(&scmd->sdb, 0, sizeof(scmd->sdb)); memset(&scmd->sdb, 0, sizeof(scmd->sdb));
scmd->result = 0; scmd->result = 0;
scmd->req.resid_len = 0;
if (sense_bytes) { if (sense_bytes) {
scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, 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) ...@@ -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->sc_data_direction = ses->data_direction;
scmd->sdb = ses->sdb; scmd->sdb = ses->sdb;
scmd->result = ses->result; scmd->result = ses->result;
scmd->req.resid_len = ses->resid_len;
scmd->underflow = ses->underflow; scmd->underflow = ses->underflow;
scmd->prot_op = ses->prot_op; scmd->prot_op = ses->prot_op;
scmd->eh_eflags = ses->eh_eflags; scmd->eh_eflags = ses->eh_eflags;
......
...@@ -1654,7 +1654,8 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr) ...@@ -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 */ /* we need to evaluate the error return */
if (scsi_sense_valid(sshdr) && if (scsi_sense_valid(sshdr) &&
(sshdr->asc == 0x3a || /* medium not present */ (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 */ /* this is no error here */
return 0; return 0;
......
...@@ -32,6 +32,7 @@ extern int scsi_ioctl_reset(struct scsi_device *, int __user *); ...@@ -32,6 +32,7 @@ extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
struct scsi_eh_save { struct scsi_eh_save {
/* saved state */ /* saved state */
int result; int result;
unsigned int resid_len;
int eh_eflags; int eh_eflags;
enum dma_data_direction data_direction; enum dma_data_direction data_direction;
unsigned underflow; unsigned underflow;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment