diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-05 12:57:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-05 12:57:13 -0500 |
commit | aac9e28d2f3d3c1eacc4114d685864a2a6423b80 (patch) | |
tree | 3075a2d4c70840c3b2f7173f95c0f278072db8b7 /drivers/scsi | |
parent | 9f259cc59ba45b8db401d60be9700e275676fb15 (diff) | |
parent | 3c887e8a1a4553ae6263fc9490e33de213e3746f (diff) |
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
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvscsi.c | 19 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 5 | ||||
-rw-r--r-- | drivers/scsi/osst.c | 6 |
3 files changed, 21 insertions, 9 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 22d91ee173c5..5f2396c03958 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
@@ -556,7 +556,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
556 | unsigned long timeout) | 556 | unsigned long timeout) |
557 | { | 557 | { |
558 | u64 *crq_as_u64 = (u64 *) &evt_struct->crq; | 558 | u64 *crq_as_u64 = (u64 *) &evt_struct->crq; |
559 | int request_status; | 559 | int request_status = 0; |
560 | int rc; | 560 | int rc; |
561 | 561 | ||
562 | /* If we have exhausted our request limit, just fail this request, | 562 | /* 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 | if (request_status < -1) | 574 | if (request_status < -1) |
575 | goto send_error; | 575 | goto send_error; |
576 | /* Otherwise, we may have run out of requests. */ | 576 | /* Otherwise, we may have run out of requests. */ |
577 | /* If request limit was 0 when we started the adapter is in the | ||
578 | * process of performing a login with the server adapter, or | ||
579 | * we may have run out of requests. | ||
580 | */ | ||
581 | else if (request_status == -1 && | ||
582 | evt_struct->iu.srp.login_req.opcode != SRP_LOGIN_REQ) | ||
583 | goto send_busy; | ||
577 | /* Abort and reset calls should make it through. | 584 | /* Abort and reset calls should make it through. |
578 | * Nothing except abort and reset should use the last two | 585 | * Nothing except abort and reset should use the last two |
579 | * slots unless we had two or less to begin with. | 586 | * 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, | |||
633 | unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); | 640 | unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); |
634 | 641 | ||
635 | free_event_struct(&hostdata->pool, evt_struct); | 642 | free_event_struct(&hostdata->pool, evt_struct); |
636 | atomic_inc(&hostdata->request_limit); | 643 | if (request_status != -1) |
644 | atomic_inc(&hostdata->request_limit); | ||
637 | return SCSI_MLQUEUE_HOST_BUSY; | 645 | return SCSI_MLQUEUE_HOST_BUSY; |
638 | 646 | ||
639 | send_error: | 647 | send_error: |
@@ -927,10 +935,11 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata) | |||
927 | login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT; | 935 | login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT; |
928 | 936 | ||
929 | spin_lock_irqsave(hostdata->host->host_lock, flags); | 937 | spin_lock_irqsave(hostdata->host->host_lock, flags); |
930 | /* Start out with a request limit of 1, since this is negotiated in | 938 | /* Start out with a request limit of 0, since this is negotiated in |
931 | * the login request we are just sending | 939 | * the login request we are just sending and login requests always |
940 | * get sent by the driver regardless of request_limit. | ||
932 | */ | 941 | */ |
933 | atomic_set(&hostdata->request_limit, 1); | 942 | atomic_set(&hostdata->request_limit, 0); |
934 | 943 | ||
935 | rc = ibmvscsi_send_srp_event(evt_struct, hostdata, init_timeout * 2); | 944 | rc = ibmvscsi_send_srp_event(evt_struct, hostdata, init_timeout * 2); |
936 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); | 945 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index c0755565fae9..4e46045dea6d 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -682,6 +682,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | |||
682 | IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb; | 682 | IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb; |
683 | struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq); | 683 | struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq); |
684 | int datadir = scsi_cmnd->sc_data_direction; | 684 | int datadir = scsi_cmnd->sc_data_direction; |
685 | char tag[2]; | ||
685 | 686 | ||
686 | lpfc_cmd->fcp_rsp->rspSnsLen = 0; | 687 | lpfc_cmd->fcp_rsp->rspSnsLen = 0; |
687 | /* clear task management bits */ | 688 | /* clear task management bits */ |
@@ -692,8 +693,8 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | |||
692 | 693 | ||
693 | memcpy(&fcp_cmnd->fcpCdb[0], scsi_cmnd->cmnd, 16); | 694 | memcpy(&fcp_cmnd->fcpCdb[0], scsi_cmnd->cmnd, 16); |
694 | 695 | ||
695 | if (scsi_cmnd->device->tagged_supported) { | 696 | if (scsi_populate_tag_msg(scsi_cmnd, tag)) { |
696 | switch (scsi_cmnd->tag) { | 697 | switch (tag[0]) { |
697 | case HEAD_OF_QUEUE_TAG: | 698 | case HEAD_OF_QUEUE_TAG: |
698 | fcp_cmnd->fcpCntl1 = HEAD_OF_Q; | 699 | fcp_cmnd->fcpCntl1 = HEAD_OF_Q; |
699 | break; | 700 | break; |
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index 4652ad22516b..abef7048f25b 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c | |||
@@ -593,10 +593,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q | |||
593 | if (aux->frame_type != OS_FRAME_TYPE_DATA && | 593 | if (aux->frame_type != OS_FRAME_TYPE_DATA && |
594 | aux->frame_type != OS_FRAME_TYPE_EOD && | 594 | aux->frame_type != OS_FRAME_TYPE_EOD && |
595 | aux->frame_type != OS_FRAME_TYPE_MARKER) { | 595 | aux->frame_type != OS_FRAME_TYPE_MARKER) { |
596 | if (!quiet) | 596 | if (!quiet) { |
597 | #if DEBUG | 597 | #if DEBUG |
598 | printk(OSST_DEB_MSG "%s:D: Skipping frame, frame type %x\n", name, aux->frame_type); | 598 | printk(OSST_DEB_MSG "%s:D: Skipping frame, frame type %x\n", name, aux->frame_type); |
599 | #endif | 599 | #endif |
600 | } | ||
600 | goto err_out; | 601 | goto err_out; |
601 | } | 602 | } |
602 | if (aux->frame_type == OS_FRAME_TYPE_EOD && | 603 | 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 | goto err_out; | 607 | goto err_out; |
607 | } | 608 | } |
608 | if (frame_seq_number != -1 && ntohl(aux->frame_seq_num) != frame_seq_number) { | 609 | if (frame_seq_number != -1 && ntohl(aux->frame_seq_num) != frame_seq_number) { |
609 | if (!quiet) | 610 | if (!quiet) { |
610 | #if DEBUG | 611 | #if DEBUG |
611 | printk(OSST_DEB_MSG "%s:D: Skipping frame, sequence number %u (expected %d)\n", | 612 | printk(OSST_DEB_MSG "%s:D: Skipping frame, sequence number %u (expected %d)\n", |
612 | name, ntohl(aux->frame_seq_num), frame_seq_number); | 613 | name, ntohl(aux->frame_seq_num), frame_seq_number); |
613 | #endif | 614 | #endif |
615 | } | ||
614 | goto err_out; | 616 | goto err_out; |
615 | } | 617 | } |
616 | if (aux->frame_type == OS_FRAME_TYPE_MARKER) { | 618 | if (aux->frame_type == OS_FRAME_TYPE_MARKER) { |