diff options
| author | Joe Eykholt <jeykholt@cisco.com> | 2010-07-20 18:20:51 -0400 |
|---|---|---|
| committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-28 10:05:58 -0400 |
| commit | 079ecd8cfe95dfd28b74f3a00d66fdbcdfc8c611 (patch) | |
| tree | 474d1f3851f6e33f04843f91f6ed1d7a3ca41765 | |
| parent | 1dd454d9e5205f9a61d51fb97159afeffa0a506c (diff) | |
[SCSI] libfc: eliminate rport LOGO state
The LOGO state hasn't been used in a while, except in a brief
transition to DELETE state while holding the rport mutex.
All port LOGO responses have been ignored as well as any timeout
if we don't get a response.
So this patch just removes LOGO state and simplifies the response handler.
Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
| -rw-r--r-- | drivers/scsi/libfc/fc_rport.c | 88 | ||||
| -rw-r--r-- | include/scsi/libfc.h | 2 |
2 files changed, 22 insertions, 68 deletions
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index 4d6adf29b4f8..c06d63e4a00f 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c | |||
| @@ -89,7 +89,6 @@ static const char *fc_rport_state_names[] = { | |||
| 89 | [RPORT_ST_PRLI] = "PRLI", | 89 | [RPORT_ST_PRLI] = "PRLI", |
| 90 | [RPORT_ST_RTV] = "RTV", | 90 | [RPORT_ST_RTV] = "RTV", |
| 91 | [RPORT_ST_READY] = "Ready", | 91 | [RPORT_ST_READY] = "Ready", |
| 92 | [RPORT_ST_LOGO] = "LOGO", | ||
| 93 | [RPORT_ST_ADISC] = "ADISC", | 92 | [RPORT_ST_ADISC] = "ADISC", |
| 94 | [RPORT_ST_DELETE] = "Delete", | 93 | [RPORT_ST_DELETE] = "Delete", |
| 95 | }; | 94 | }; |
| @@ -514,9 +513,6 @@ static void fc_rport_timeout(struct work_struct *work) | |||
| 514 | case RPORT_ST_RTV: | 513 | case RPORT_ST_RTV: |
| 515 | fc_rport_enter_rtv(rdata); | 514 | fc_rport_enter_rtv(rdata); |
| 516 | break; | 515 | break; |
| 517 | case RPORT_ST_LOGO: | ||
| 518 | fc_rport_enter_logo(rdata); | ||
| 519 | break; | ||
| 520 | case RPORT_ST_ADISC: | 516 | case RPORT_ST_ADISC: |
| 521 | fc_rport_enter_adisc(rdata); | 517 | fc_rport_enter_adisc(rdata); |
| 522 | break; | 518 | break; |
| @@ -547,7 +543,6 @@ static void fc_rport_error(struct fc_rport_priv *rdata, struct fc_frame *fp) | |||
| 547 | switch (rdata->rp_state) { | 543 | switch (rdata->rp_state) { |
| 548 | case RPORT_ST_FLOGI: | 544 | case RPORT_ST_FLOGI: |
| 549 | case RPORT_ST_PLOGI: | 545 | case RPORT_ST_PLOGI: |
| 550 | case RPORT_ST_LOGO: | ||
| 551 | rdata->flags &= ~FC_RP_STARTED; | 546 | rdata->flags &= ~FC_RP_STARTED; |
| 552 | fc_rport_enter_delete(rdata, RPORT_EV_FAILED); | 547 | fc_rport_enter_delete(rdata, RPORT_EV_FAILED); |
| 553 | break; | 548 | break; |
| @@ -791,7 +786,6 @@ static void fc_rport_recv_flogi_req(struct fc_lport *lport, | |||
| 791 | 786 | ||
| 792 | switch (rdata->rp_state) { | 787 | switch (rdata->rp_state) { |
| 793 | case RPORT_ST_INIT: | 788 | case RPORT_ST_INIT: |
| 794 | case RPORT_ST_LOGO: | ||
| 795 | case RPORT_ST_DELETE: | 789 | case RPORT_ST_DELETE: |
| 796 | mutex_unlock(&rdata->rp_mutex); | 790 | mutex_unlock(&rdata->rp_mutex); |
| 797 | rjt_data.reason = ELS_RJT_FIP; | 791 | rjt_data.reason = ELS_RJT_FIP; |
| @@ -1037,52 +1031,6 @@ err: | |||
| 1037 | } | 1031 | } |
| 1038 | 1032 | ||
| 1039 | /** | 1033 | /** |
| 1040 | * fc_rport_logo_resp() - Handler for logout (LOGO) responses | ||
| 1041 | * @sp: The sequence the LOGO was on | ||
| 1042 | * @fp: The LOGO response frame | ||
| 1043 | * @rdata_arg: The remote port that sent the LOGO response | ||
| 1044 | * | ||
| 1045 | * Locking Note: This function will be called without the rport lock | ||
| 1046 | * held, but it will lock, call an _enter_* function or fc_rport_error | ||
| 1047 | * and then unlock the rport. | ||
| 1048 | */ | ||
| 1049 | static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp, | ||
| 1050 | void *rdata_arg) | ||
| 1051 | { | ||
| 1052 | struct fc_rport_priv *rdata = rdata_arg; | ||
| 1053 | u8 op; | ||
| 1054 | |||
| 1055 | mutex_lock(&rdata->rp_mutex); | ||
| 1056 | |||
| 1057 | FC_RPORT_DBG(rdata, "Received a LOGO %s\n", fc_els_resp_type(fp)); | ||
| 1058 | |||
| 1059 | if (rdata->rp_state != RPORT_ST_LOGO) { | ||
| 1060 | FC_RPORT_DBG(rdata, "Received a LOGO response, but in state " | ||
| 1061 | "%s\n", fc_rport_state(rdata)); | ||
| 1062 | if (IS_ERR(fp)) | ||
| 1063 | goto err; | ||
| 1064 | goto out; | ||
| 1065 | } | ||
| 1066 | |||
| 1067 | if (IS_ERR(fp)) { | ||
| 1068 | fc_rport_error_retry(rdata, fp); | ||
| 1069 | goto err; | ||
| 1070 | } | ||
| 1071 | |||
| 1072 | op = fc_frame_payload_op(fp); | ||
| 1073 | if (op != ELS_LS_ACC) | ||
| 1074 | FC_RPORT_DBG(rdata, "Bad ELS response op %x for LOGO command\n", | ||
| 1075 | op); | ||
| 1076 | fc_rport_enter_delete(rdata, RPORT_EV_LOGO); | ||
| 1077 | |||
| 1078 | out: | ||
| 1079 | fc_frame_free(fp); | ||
| 1080 | err: | ||
| 1081 | mutex_unlock(&rdata->rp_mutex); | ||
| 1082 | kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); | ||
| 1083 | } | ||
| 1084 | |||
| 1085 | /** | ||
| 1086 | * fc_rport_enter_prli() - Send Process Login (PRLI) request | 1034 | * fc_rport_enter_prli() - Send Process Login (PRLI) request |
| 1087 | * @rdata: The remote port to send the PRLI request to | 1035 | * @rdata: The remote port to send the PRLI request to |
| 1088 | * | 1036 | * |
| @@ -1224,6 +1172,24 @@ static void fc_rport_enter_rtv(struct fc_rport_priv *rdata) | |||
| 1224 | } | 1172 | } |
| 1225 | 1173 | ||
| 1226 | /** | 1174 | /** |
| 1175 | * fc_rport_logo_resp() - Handler for logout (LOGO) responses | ||
| 1176 | * @sp: The sequence the LOGO was on | ||
| 1177 | * @fp: The LOGO response frame | ||
| 1178 | * @lport_arg: The local port | ||
| 1179 | */ | ||
| 1180 | static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp, | ||
| 1181 | void *lport_arg) | ||
| 1182 | { | ||
| 1183 | struct fc_lport *lport = lport_arg; | ||
| 1184 | |||
| 1185 | FC_RPORT_ID_DBG(lport, fc_seq_exch(sp)->did, | ||
| 1186 | "Received a LOGO %s\n", fc_els_resp_type(fp)); | ||
| 1187 | if (IS_ERR(fp)) | ||
| 1188 | return; | ||
| 1189 | fc_frame_free(fp); | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | /** | ||
| 1227 | * fc_rport_enter_logo() - Send a logout (LOGO) request | 1193 | * fc_rport_enter_logo() - Send a logout (LOGO) request |
| 1228 | * @rdata: The remote port to send the LOGO request to | 1194 | * @rdata: The remote port to send the LOGO request to |
| 1229 | * | 1195 | * |
| @@ -1235,23 +1201,14 @@ static void fc_rport_enter_logo(struct fc_rport_priv *rdata) | |||
| 1235 | struct fc_lport *lport = rdata->local_port; | 1201 | struct fc_lport *lport = rdata->local_port; |
| 1236 | struct fc_frame *fp; | 1202 | struct fc_frame *fp; |
| 1237 | 1203 | ||
| 1238 | FC_RPORT_DBG(rdata, "Port entered LOGO state from %s state\n", | 1204 | FC_RPORT_DBG(rdata, "Port sending LOGO from %s state\n", |
| 1239 | fc_rport_state(rdata)); | 1205 | fc_rport_state(rdata)); |
| 1240 | 1206 | ||
| 1241 | fc_rport_state_enter(rdata, RPORT_ST_LOGO); | ||
| 1242 | |||
| 1243 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo)); | 1207 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo)); |
| 1244 | if (!fp) { | 1208 | if (!fp) |
| 1245 | fc_rport_error_retry(rdata, fp); | ||
| 1246 | return; | 1209 | return; |
| 1247 | } | 1210 | (void)lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_LOGO, |
| 1248 | 1211 | fc_rport_logo_resp, lport, 0); | |
| 1249 | if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_LOGO, | ||
| 1250 | fc_rport_logo_resp, rdata, | ||
| 1251 | 2 * lport->r_a_tov)) | ||
| 1252 | fc_rport_error_retry(rdata, NULL); | ||
| 1253 | else | ||
| 1254 | kref_get(&rdata->kref); | ||
| 1255 | } | 1212 | } |
| 1256 | 1213 | ||
| 1257 | /** | 1214 | /** |
| @@ -1670,7 +1627,6 @@ static void fc_rport_recv_plogi_req(struct fc_lport *lport, | |||
| 1670 | break; | 1627 | break; |
| 1671 | case RPORT_ST_FLOGI: | 1628 | case RPORT_ST_FLOGI: |
| 1672 | case RPORT_ST_DELETE: | 1629 | case RPORT_ST_DELETE: |
| 1673 | case RPORT_ST_LOGO: | ||
| 1674 | FC_RPORT_DBG(rdata, "Received PLOGI in state %s - send busy\n", | 1630 | FC_RPORT_DBG(rdata, "Received PLOGI in state %s - send busy\n", |
| 1675 | fc_rport_state(rdata)); | 1631 | fc_rport_state(rdata)); |
| 1676 | mutex_unlock(&rdata->rp_mutex); | 1632 | mutex_unlock(&rdata->rp_mutex); |
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 8d297f9a0a47..e6f07fba432c 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
| @@ -103,7 +103,6 @@ enum fc_disc_event { | |||
| 103 | * @RPORT_ST_PRLI: Waiting for PRLI completion | 103 | * @RPORT_ST_PRLI: Waiting for PRLI completion |
| 104 | * @RPORT_ST_RTV: Waiting for RTV completion | 104 | * @RPORT_ST_RTV: Waiting for RTV completion |
| 105 | * @RPORT_ST_READY: Ready for use | 105 | * @RPORT_ST_READY: Ready for use |
| 106 | * @RPORT_ST_LOGO: Remote port logout (LOGO) sent | ||
| 107 | * @RPORT_ST_ADISC: Discover Address sent | 106 | * @RPORT_ST_ADISC: Discover Address sent |
| 108 | * @RPORT_ST_DELETE: Remote port being deleted | 107 | * @RPORT_ST_DELETE: Remote port being deleted |
| 109 | */ | 108 | */ |
| @@ -115,7 +114,6 @@ enum fc_rport_state { | |||
| 115 | RPORT_ST_PRLI, | 114 | RPORT_ST_PRLI, |
| 116 | RPORT_ST_RTV, | 115 | RPORT_ST_RTV, |
| 117 | RPORT_ST_READY, | 116 | RPORT_ST_READY, |
| 118 | RPORT_ST_LOGO, | ||
| 119 | RPORT_ST_ADISC, | 117 | RPORT_ST_ADISC, |
| 120 | RPORT_ST_DELETE, | 118 | RPORT_ST_DELETE, |
| 121 | }; | 119 | }; |
