Commit aac9e28d authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] ibmvscsi: Prevent IO during partner login
  [SCSI] lpfc : Correct queue tag handling
  [SCSI] Update MAINTAINER email address and trees
  [SCSI] osst: fix if (...) \n #if... cases missing semicolons when false
parents 9f259cc5 3c887e8a
...@@ -2549,7 +2549,7 @@ S: Supported ...@@ -2549,7 +2549,7 @@ S: Supported
MISCELLANEOUS MCA-SUPPORT MISCELLANEOUS MCA-SUPPORT
P: James Bottomley P: James Bottomley
M: jejb@steeleye.com M: James.Bottomley@HansenPartnership.com
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
S: Maintained S: Maintained
...@@ -3301,9 +3301,11 @@ S: Maintained ...@@ -3301,9 +3301,11 @@ S: Maintained
SCSI SUBSYSTEM SCSI SUBSYSTEM
P: James E.J. Bottomley P: James E.J. Bottomley
M: James.Bottomley@SteelEye.com M: James.Bottomley@HansenPartnership.com
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
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-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 S: Maintained
SCSI TAPE DRIVER SCSI TAPE DRIVER
......
...@@ -556,7 +556,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, ...@@ -556,7 +556,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
unsigned long timeout) unsigned long timeout)
{ {
u64 *crq_as_u64 = (u64 *) &evt_struct->crq; u64 *crq_as_u64 = (u64 *) &evt_struct->crq;
int request_status; int request_status = 0;
int rc; int rc;
/* If we have exhausted our request limit, just fail this request, /* 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, ...@@ -574,6 +574,13 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
if (request_status < -1) if (request_status < -1)
goto send_error; goto send_error;
/* Otherwise, we may have run out of requests. */ /* 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. /* Abort and reset calls should make it through.
* Nothing except abort and reset should use the last two * Nothing except abort and reset should use the last two
* slots unless we had two or less to begin with. * slots unless we had two or less to begin with.
...@@ -633,6 +640,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, ...@@ -633,6 +640,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
free_event_struct(&hostdata->pool, evt_struct); free_event_struct(&hostdata->pool, evt_struct);
if (request_status != -1)
atomic_inc(&hostdata->request_limit); atomic_inc(&hostdata->request_limit);
return SCSI_MLQUEUE_HOST_BUSY; return SCSI_MLQUEUE_HOST_BUSY;
...@@ -927,10 +935,11 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata) ...@@ -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; login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT;
spin_lock_irqsave(hostdata->host->host_lock, flags); spin_lock_irqsave(hostdata->host->host_lock, flags);
/* Start out with a request limit of 1, since this is negotiated in /* Start out with a request limit of 0, since this is negotiated in
* the login request we are just sending * 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); rc = ibmvscsi_send_srp_event(evt_struct, hostdata, init_timeout * 2);
spin_unlock_irqrestore(hostdata->host->host_lock, flags); spin_unlock_irqrestore(hostdata->host->host_lock, flags);
......
...@@ -682,6 +682,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, ...@@ -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; IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq); struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq);
int datadir = scsi_cmnd->sc_data_direction; int datadir = scsi_cmnd->sc_data_direction;
char tag[2];
lpfc_cmd->fcp_rsp->rspSnsLen = 0; lpfc_cmd->fcp_rsp->rspSnsLen = 0;
/* clear task management bits */ /* clear task management bits */
...@@ -692,8 +693,8 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, ...@@ -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); memcpy(&fcp_cmnd->fcpCdb[0], scsi_cmnd->cmnd, 16);
if (scsi_cmnd->device->tagged_supported) { if (scsi_populate_tag_msg(scsi_cmnd, tag)) {
switch (scsi_cmnd->tag) { switch (tag[0]) {
case HEAD_OF_QUEUE_TAG: case HEAD_OF_QUEUE_TAG:
fcp_cmnd->fcpCntl1 = HEAD_OF_Q; fcp_cmnd->fcpCntl1 = HEAD_OF_Q;
break; break;
......
...@@ -593,10 +593,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q ...@@ -593,10 +593,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q
if (aux->frame_type != OS_FRAME_TYPE_DATA && if (aux->frame_type != OS_FRAME_TYPE_DATA &&
aux->frame_type != OS_FRAME_TYPE_EOD && aux->frame_type != OS_FRAME_TYPE_EOD &&
aux->frame_type != OS_FRAME_TYPE_MARKER) { aux->frame_type != OS_FRAME_TYPE_MARKER) {
if (!quiet) if (!quiet) {
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Skipping frame, frame type %x\n", name, aux->frame_type); printk(OSST_DEB_MSG "%s:D: Skipping frame, frame type %x\n", name, aux->frame_type);
#endif #endif
}
goto err_out; goto err_out;
} }
if (aux->frame_type == OS_FRAME_TYPE_EOD && 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 ...@@ -606,11 +607,12 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q
goto err_out; goto err_out;
} }
if (frame_seq_number != -1 && ntohl(aux->frame_seq_num) != frame_seq_number) { if (frame_seq_number != -1 && ntohl(aux->frame_seq_num) != frame_seq_number) {
if (!quiet) if (!quiet) {
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Skipping frame, sequence number %u (expected %d)\n", printk(OSST_DEB_MSG "%s:D: Skipping frame, sequence number %u (expected %d)\n",
name, ntohl(aux->frame_seq_num), frame_seq_number); name, ntohl(aux->frame_seq_num), frame_seq_number);
#endif #endif
}
goto err_out; goto err_out;
} }
if (aux->frame_type == OS_FRAME_TYPE_MARKER) { if (aux->frame_type == OS_FRAME_TYPE_MARKER) {
......
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