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]
|
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 @@
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
/* 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 *);
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user