diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2010-01-13 11:52:36 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-01-17 13:38:46 -0500 |
commit | f09d5454576b9aabd4ce454937cd86263428090b (patch) | |
tree | 538175bae5fc1906646052fc16111f325963b5cb /drivers/s390 | |
parent | 22c24734ce5e7cee9a63e02e5aa7ed108f8fad4d (diff) |
[SCSI] zfcp: Issue zfcp_fc_wka_port_put after FC CT BSG request
The patch "zfcp: Simplify handling of ct and els requests"
accidentally removed the call to zfcp_fc_wka_port_put for FC CT BSG
requests, thus not issuing a "close" request for the WKA ports.
Introduce a CT specific handler to first call zfcp_fc_wka_port_put and
then continue with the generic handler when returning from FC CT BSG
requests.
Reviewed-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index ac5e3b7a3576..81d4375aa50e 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -677,6 +677,44 @@ static void zfcp_fc_ct_els_job_handler(void *data) | |||
677 | job->job_done(job); | 677 | job->job_done(job); |
678 | } | 678 | } |
679 | 679 | ||
680 | static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job) | ||
681 | { | ||
682 | u32 preamble_word1; | ||
683 | u8 gs_type; | ||
684 | struct zfcp_adapter *adapter; | ||
685 | |||
686 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | ||
687 | gs_type = (preamble_word1 & 0xff000000) >> 24; | ||
688 | |||
689 | adapter = (struct zfcp_adapter *) job->shost->hostdata[0]; | ||
690 | |||
691 | switch (gs_type) { | ||
692 | case FC_FST_ALIAS: | ||
693 | return &adapter->gs->as; | ||
694 | case FC_FST_MGMT: | ||
695 | return &adapter->gs->ms; | ||
696 | case FC_FST_TIME: | ||
697 | return &adapter->gs->ts; | ||
698 | break; | ||
699 | case FC_FST_DIR: | ||
700 | return &adapter->gs->ds; | ||
701 | break; | ||
702 | default: | ||
703 | return NULL; | ||
704 | } | ||
705 | } | ||
706 | |||
707 | static void zfcp_fc_ct_job_handler(void *data) | ||
708 | { | ||
709 | struct fc_bsg_job *job = data; | ||
710 | struct zfcp_fc_wka_port *wka_port; | ||
711 | |||
712 | wka_port = zfcp_fc_job_wka_port(job); | ||
713 | zfcp_fc_wka_port_put(wka_port); | ||
714 | |||
715 | zfcp_fc_ct_els_job_handler(data); | ||
716 | } | ||
717 | |||
680 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | 718 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, |
681 | struct zfcp_adapter *adapter) | 719 | struct zfcp_adapter *adapter) |
682 | { | 720 | { |
@@ -695,6 +733,7 @@ static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | |||
695 | } else | 733 | } else |
696 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); | 734 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); |
697 | 735 | ||
736 | els->handler = zfcp_fc_ct_els_job_handler; | ||
698 | return zfcp_fsf_send_els(adapter, d_id, els); | 737 | return zfcp_fsf_send_els(adapter, d_id, els); |
699 | } | 738 | } |
700 | 739 | ||
@@ -702,35 +741,18 @@ static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job, | |||
702 | struct zfcp_adapter *adapter) | 741 | struct zfcp_adapter *adapter) |
703 | { | 742 | { |
704 | int ret; | 743 | int ret; |
705 | u8 gs_type; | ||
706 | struct zfcp_fsf_ct_els *ct = job->dd_data; | 744 | struct zfcp_fsf_ct_els *ct = job->dd_data; |
707 | struct zfcp_fc_wka_port *wka_port; | 745 | struct zfcp_fc_wka_port *wka_port; |
708 | u32 preamble_word1; | ||
709 | 746 | ||
710 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | 747 | wka_port = zfcp_fc_job_wka_port(job); |
711 | gs_type = (preamble_word1 & 0xff000000) >> 24; | 748 | if (!wka_port) |
712 | 749 | return -EINVAL; | |
713 | switch (gs_type) { | ||
714 | case FC_FST_ALIAS: | ||
715 | wka_port = &adapter->gs->as; | ||
716 | break; | ||
717 | case FC_FST_MGMT: | ||
718 | wka_port = &adapter->gs->ms; | ||
719 | break; | ||
720 | case FC_FST_TIME: | ||
721 | wka_port = &adapter->gs->ts; | ||
722 | break; | ||
723 | case FC_FST_DIR: | ||
724 | wka_port = &adapter->gs->ds; | ||
725 | break; | ||
726 | default: | ||
727 | return -EINVAL; /* no such service */ | ||
728 | } | ||
729 | 750 | ||
730 | ret = zfcp_fc_wka_port_get(wka_port); | 751 | ret = zfcp_fc_wka_port_get(wka_port); |
731 | if (ret) | 752 | if (ret) |
732 | return ret; | 753 | return ret; |
733 | 754 | ||
755 | ct->handler = zfcp_fc_ct_job_handler; | ||
734 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL); | 756 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL); |
735 | if (ret) | 757 | if (ret) |
736 | zfcp_fc_wka_port_put(wka_port); | 758 | zfcp_fc_wka_port_put(wka_port); |
@@ -752,7 +774,6 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job) | |||
752 | 774 | ||
753 | ct_els->req = job->request_payload.sg_list; | 775 | ct_els->req = job->request_payload.sg_list; |
754 | ct_els->resp = job->reply_payload.sg_list; | 776 | ct_els->resp = job->reply_payload.sg_list; |
755 | ct_els->handler = zfcp_fc_ct_els_job_handler; | ||
756 | ct_els->handler_data = job; | 777 | ct_els->handler_data = job; |
757 | 778 | ||
758 | switch (job->request->msgcode) { | 779 | switch (job->request->msgcode) { |