SCSI bug fixes for 2.6.24-rc1
Subsystems (4)
James Bottomley
maintainerPATCH 1/1 SCSI bug fixes for 2.6.24-rc1
These are a fairly straightforward and small collection of fixes.
The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
Ilpo Järvinen (1):
osst: fix if (...) \n #if... cases missing semicolons when false
James Bottomley (1):
Update MAINTAINER email address and trees
James Smart (1):
lpfc : Correct queue tag handling
Robert Jennings (1):
ibmvscsi: Prevent IO during partner login
The diffstat is:
MAINTAINERS | 6 ++++-- drivers/scsi/ibmvscsi/ibmvscsi.c | 19 ++++++++++++++----- drivers/scsi/lpfc/lpfc_scsi.c | 5 +++-- drivers/scsi/osst.c | 6 ++++-- 4 files changed, 25 insertions(+), 11 deletions(-)
James
---
And the complete diff:
MAINTAINERS +4 -2
@@ -2544,7 +2544,7 @@ S: Supported MISCELLANEOUS MCA-SUPPORT P: James Bottomley -M: [email protected] +M: [email protected] L: [email protected] S: Maintained
@@ -3296,9 +3296,11 @@ S: Maintained SCSI SUBSYSTEM P: James E.J. Bottomley -M: [email protected] +M: [email protected] L: [email protected] T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git +T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git +T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git S: Maintained SCSI TAPE DRIVER
drivers/scsi/ibmvscsi/ibmvscsi.c +14 -5
@@ -556,7 +556,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, unsigned long timeout) {u64 *crq_as_u64 = (u64 *) &evt_struct->crq; -int request_status; +int request_status =0 ;int rc;/* If we have exhausted our request limit, just fail this request,
@@ -574,6 +574,13 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,if (request_status <-1 ) goto send_error;/* Otherwise, we may have run out of requests. */ +/* If request limit was 0 when we started the adapter is in the +* process of performing a login with the server adapter, or +* we may have run out of requests. +*/ +else if (request_status ==-1 && + evt_struct->iu.srp.login_req.opcode !=SRP_LOGIN_REQ ) + goto send_busy;/* Abort and reset calls should make it through. * Nothing except abort and reset should use the last two * slots unless we had two or less to begin with.
@@ -633,7 +640,8 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,unmap_cmd_data (&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);free_event_struct (&hostdata->pool, evt_struct); -atomic_inc (&hostdata->request_limit); +if (request_status !=-1 ) +atomic_inc (&hostdata->request_limit);return SCSI_MLQUEUE_HOST_BUSY ; send_error:
@@ -927,10 +935,11 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata) login->req_buf_fmt =SRP_BUF_FORMAT_DIRECT |SRP_BUF_FORMAT_INDIRECT ;spin_lock_irqsave (hostdata->host->host_lock, flags); -/* Start out with a request limit of 1, since this is negotiated in -* the login request we are just sending +/* Start out with a request limit of 0, since this is negotiated in +* the login request we are just sending and login requests always +* get sent by the driver regardless of request_limit. */ -atomic_set (&hostdata->request_limit,1 ); +atomic_set (&hostdata->request_limit,0 ); rc =ibmvscsi_send_srp_event (evt_struct, hostdata, init_timeout *2 );spin_unlock_irqrestore (hostdata->host->host_lock, flags);
drivers/scsi/lpfc/lpfc_scsi.c +3 -2
@@ -682,6 +682,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq);int datadir = scsi_cmnd->sc_data_direction; +char tag[2 ]; lpfc_cmd->fcp_rsp->rspSnsLen =0 ;/* clear task management bits */
@@ -692,8 +693,8 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,memcpy (&fcp_cmnd->fcpCdb[0 ], scsi_cmnd->cmnd,16 ); -if (scsi_cmnd->device->tagged_supported) { -switch (scsi_cmnd->tag) { +if (scsi_populate_tag_msg (scsi_cmnd, tag)) { +switch (tag[0 ]) {case HEAD_OF_QUEUE_TAG : fcp_cmnd->fcpCntl1 =HEAD_OF_Q ;break ;
drivers/scsi/osst.c +4 -2
@@ -593,10 +593,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int qif (aux->frame_type !=OS_FRAME_TYPE_DATA && aux->frame_type !=OS_FRAME_TYPE_EOD && aux->frame_type !=OS_FRAME_TYPE_MARKER ) { - if (!quiet) +if (!quiet) {#if DEBUG printk (OSST_DEB_MSG "%s:D: Skipping frame, frame type %x\n" , name, aux->frame_type);#endif + } goto err_out; } if (aux->frame_type == OS_FRAME_TYPE_EOD &&
@@ -606,11 +607,12 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q goto err_out; }if (frame_seq_number !=-1 &&ntohl (aux->frame_seq_num) != frame_seq_number) { - if (!quiet) +if (!quiet) {#if DEBUG printk (OSST_DEB_MSG "%s:D: Skipping frame, sequence number %u (expected %d)\n" , name,ntohl (aux->frame_seq_num), frame_seq_number);#endif + } goto err_out; }if (aux->frame_type ==OS_FRAME_TYPE_MARKER ) {