diff options
-rw-r--r-- | drivers/scsi/libfc/fc_disc.c | 31 | ||||
-rw-r--r-- | drivers/scsi/libfc/fc_lport.c | 26 | ||||
-rw-r--r-- | drivers/scsi/libfc/fc_rport.c | 17 | ||||
-rw-r--r-- | include/scsi/libfc.h | 5 |
4 files changed, 35 insertions, 44 deletions
diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c index 4c8d893af7bd..ecc625c20520 100644 --- a/drivers/scsi/libfc/fc_disc.c +++ b/drivers/scsi/libfc/fc_disc.c | |||
@@ -428,13 +428,7 @@ static int fc_disc_new_target(struct fc_disc *disc, | |||
428 | if (!rport) { | 428 | if (!rport) { |
429 | rport = lport->tt.rport_lookup(lport, ids->port_id); | 429 | rport = lport->tt.rport_lookup(lport, ids->port_id); |
430 | if (!rport) { | 430 | if (!rport) { |
431 | struct fc_disc_port dp; | 431 | rport = lport->tt.rport_create(lport, ids); |
432 | dp.lp = lport; | ||
433 | dp.ids.port_id = ids->port_id; | ||
434 | dp.ids.port_name = ids->port_name; | ||
435 | dp.ids.node_name = ids->node_name; | ||
436 | dp.ids.roles = ids->roles; | ||
437 | rport = lport->tt.rport_create(&dp); | ||
438 | } | 432 | } |
439 | if (!rport) | 433 | if (!rport) |
440 | error = -ENOMEM; | 434 | error = -ENOMEM; |
@@ -578,7 +572,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) | |||
578 | size_t plen; | 572 | size_t plen; |
579 | size_t tlen; | 573 | size_t tlen; |
580 | int error = 0; | 574 | int error = 0; |
581 | struct fc_disc_port dp; | 575 | struct fc_rport_identifiers ids; |
582 | struct fc_rport *rport; | 576 | struct fc_rport *rport; |
583 | struct fc_rport_priv *rdata; | 577 | struct fc_rport_priv *rdata; |
584 | 578 | ||
@@ -621,15 +615,14 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) | |||
621 | * After the first time through the loop, things return to "normal". | 615 | * After the first time through the loop, things return to "normal". |
622 | */ | 616 | */ |
623 | while (plen >= sizeof(*np)) { | 617 | while (plen >= sizeof(*np)) { |
624 | dp.lp = lport; | 618 | ids.port_id = ntoh24(np->fp_fid); |
625 | dp.ids.port_id = ntoh24(np->fp_fid); | 619 | ids.port_name = ntohll(np->fp_wwpn); |
626 | dp.ids.port_name = ntohll(np->fp_wwpn); | 620 | ids.node_name = -1; |
627 | dp.ids.node_name = -1; | 621 | ids.roles = FC_RPORT_ROLE_UNKNOWN; |
628 | dp.ids.roles = FC_RPORT_ROLE_UNKNOWN; | 622 | |
629 | 623 | if (ids.port_id != fc_host_port_id(lport->host) && | |
630 | if ((dp.ids.port_id != fc_host_port_id(lport->host)) && | 624 | ids.port_name != lport->wwpn) { |
631 | (dp.ids.port_name != lport->wwpn)) { | 625 | rport = lport->tt.rport_create(lport, &ids); |
632 | rport = lport->tt.rport_create(&dp); | ||
633 | if (rport) { | 626 | if (rport) { |
634 | rdata = rport->dd_data; | 627 | rdata = rport->dd_data; |
635 | rdata->ops = &fc_disc_rport_ops; | 628 | rdata->ops = &fc_disc_rport_ops; |
@@ -640,7 +633,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) | |||
640 | } else | 633 | } else |
641 | printk(KERN_WARNING "libfc: Failed to allocate " | 634 | printk(KERN_WARNING "libfc: Failed to allocate " |
642 | "memory for the newly discovered port " | 635 | "memory for the newly discovered port " |
643 | "(%6x)\n", dp.ids.port_id); | 636 | "(%6x)\n", ids.port_id); |
644 | } | 637 | } |
645 | 638 | ||
646 | if (np->fp_flags & FC_NS_FID_LAST) { | 639 | if (np->fp_flags & FC_NS_FID_LAST) { |
@@ -781,7 +774,7 @@ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp) | |||
781 | if (dp->ids.port_id == fc_host_port_id(lport->host)) | 774 | if (dp->ids.port_id == fc_host_port_id(lport->host)) |
782 | goto out; | 775 | goto out; |
783 | 776 | ||
784 | new_rport = lport->tt.rport_create(dp); | 777 | new_rport = lport->tt.rport_create(lport, &dp->ids); |
785 | if (new_rport) { | 778 | if (new_rport) { |
786 | rdata = new_rport->dd_data; | 779 | rdata = new_rport->dd_data; |
787 | rdata->ops = &fc_disc_rport_ops; | 780 | rdata->ops = &fc_disc_rport_ops; |
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index f7f328f952a5..a78161cf1811 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
@@ -211,20 +211,19 @@ static void fc_lport_ptp_setup(struct fc_lport *lport, | |||
211 | u32 remote_fid, u64 remote_wwpn, | 211 | u32 remote_fid, u64 remote_wwpn, |
212 | u64 remote_wwnn) | 212 | u64 remote_wwnn) |
213 | { | 213 | { |
214 | struct fc_disc_port dp; | 214 | struct fc_rport_identifiers ids; |
215 | 215 | ||
216 | dp.lp = lport; | 216 | ids.port_id = remote_fid; |
217 | dp.ids.port_id = remote_fid; | 217 | ids.port_name = remote_wwpn; |
218 | dp.ids.port_name = remote_wwpn; | 218 | ids.node_name = remote_wwnn; |
219 | dp.ids.node_name = remote_wwnn; | 219 | ids.roles = FC_RPORT_ROLE_UNKNOWN; |
220 | dp.ids.roles = FC_RPORT_ROLE_UNKNOWN; | ||
221 | 220 | ||
222 | if (lport->ptp_rp) { | 221 | if (lport->ptp_rp) { |
223 | lport->tt.rport_logoff(lport->ptp_rp); | 222 | lport->tt.rport_logoff(lport->ptp_rp); |
224 | lport->ptp_rp = NULL; | 223 | lport->ptp_rp = NULL; |
225 | } | 224 | } |
226 | 225 | ||
227 | lport->ptp_rp = lport->tt.rport_create(&dp); | 226 | lport->ptp_rp = lport->tt.rport_create(lport, &ids); |
228 | 227 | ||
229 | lport->tt.rport_login(lport->ptp_rp); | 228 | lport->tt.rport_login(lport->ptp_rp); |
230 | 229 | ||
@@ -1307,20 +1306,19 @@ static void fc_lport_enter_dns(struct fc_lport *lport) | |||
1307 | { | 1306 | { |
1308 | struct fc_rport *rport; | 1307 | struct fc_rport *rport; |
1309 | struct fc_rport_priv *rdata; | 1308 | struct fc_rport_priv *rdata; |
1310 | struct fc_disc_port dp; | 1309 | struct fc_rport_identifiers ids; |
1311 | 1310 | ||
1312 | dp.ids.port_id = FC_FID_DIR_SERV; | 1311 | ids.port_id = FC_FID_DIR_SERV; |
1313 | dp.ids.port_name = -1; | 1312 | ids.port_name = -1; |
1314 | dp.ids.node_name = -1; | 1313 | ids.node_name = -1; |
1315 | dp.ids.roles = FC_RPORT_ROLE_UNKNOWN; | 1314 | ids.roles = FC_RPORT_ROLE_UNKNOWN; |
1316 | dp.lp = lport; | ||
1317 | 1315 | ||
1318 | FC_LPORT_DBG(lport, "Entered DNS state from %s state\n", | 1316 | FC_LPORT_DBG(lport, "Entered DNS state from %s state\n", |
1319 | fc_lport_state(lport)); | 1317 | fc_lport_state(lport)); |
1320 | 1318 | ||
1321 | fc_lport_state_enter(lport, LPORT_ST_DNS); | 1319 | fc_lport_state_enter(lport, LPORT_ST_DNS); |
1322 | 1320 | ||
1323 | rport = lport->tt.rport_create(&dp); | 1321 | rport = lport->tt.rport_create(lport, &ids); |
1324 | if (!rport) | 1322 | if (!rport) |
1325 | goto err; | 1323 | goto err; |
1326 | 1324 | ||
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index 5f8f437e76b3..2fbc94aaf343 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c | |||
@@ -93,7 +93,8 @@ static void fc_rport_rogue_destroy(struct device *dev) | |||
93 | kfree(rport); | 93 | kfree(rport); |
94 | } | 94 | } |
95 | 95 | ||
96 | struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp) | 96 | struct fc_rport *fc_rport_rogue_create(struct fc_lport *lport, |
97 | struct fc_rport_identifiers *ids) | ||
97 | { | 98 | { |
98 | struct fc_rport *rport; | 99 | struct fc_rport *rport; |
99 | struct fc_rport_priv *rdata; | 100 | struct fc_rport_priv *rdata; |
@@ -105,10 +106,10 @@ struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp) | |||
105 | rdata = RPORT_TO_PRIV(rport); | 106 | rdata = RPORT_TO_PRIV(rport); |
106 | 107 | ||
107 | rport->dd_data = rdata; | 108 | rport->dd_data = rdata; |
108 | rport->port_id = dp->ids.port_id; | 109 | rport->port_id = ids->port_id; |
109 | rport->port_name = dp->ids.port_name; | 110 | rport->port_name = ids->port_name; |
110 | rport->node_name = dp->ids.node_name; | 111 | rport->node_name = ids->node_name; |
111 | rport->roles = dp->ids.roles; | 112 | rport->roles = ids->roles; |
112 | rport->maxframe_size = FC_MIN_MAX_PAYLOAD; | 113 | rport->maxframe_size = FC_MIN_MAX_PAYLOAD; |
113 | /* | 114 | /* |
114 | * Note: all this libfc rogue rport code will be removed for | 115 | * Note: all this libfc rogue rport code will be removed for |
@@ -118,14 +119,14 @@ struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp) | |||
118 | rport->dev.release = fc_rport_rogue_destroy; | 119 | rport->dev.release = fc_rport_rogue_destroy; |
119 | 120 | ||
120 | mutex_init(&rdata->rp_mutex); | 121 | mutex_init(&rdata->rp_mutex); |
121 | rdata->local_port = dp->lp; | 122 | rdata->local_port = lport; |
122 | rdata->trans_state = FC_PORTSTATE_ROGUE; | 123 | rdata->trans_state = FC_PORTSTATE_ROGUE; |
123 | rdata->rp_state = RPORT_ST_INIT; | 124 | rdata->rp_state = RPORT_ST_INIT; |
124 | rdata->event = RPORT_EV_NONE; | 125 | rdata->event = RPORT_EV_NONE; |
125 | rdata->flags = FC_RP_FLAGS_REC_SUPPORTED; | 126 | rdata->flags = FC_RP_FLAGS_REC_SUPPORTED; |
126 | rdata->ops = NULL; | 127 | rdata->ops = NULL; |
127 | rdata->e_d_tov = dp->lp->e_d_tov; | 128 | rdata->e_d_tov = lport->e_d_tov; |
128 | rdata->r_a_tov = dp->lp->r_a_tov; | 129 | rdata->r_a_tov = lport->r_a_tov; |
129 | INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout); | 130 | INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout); |
130 | INIT_WORK(&rdata->event_work, fc_rport_work); | 131 | INIT_WORK(&rdata->event_work, fc_rport_work); |
131 | /* | 132 | /* |
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index aa219514c96b..d888cbecd72e 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
@@ -227,8 +227,6 @@ struct fc_rport_libfc_priv { | |||
227 | #define RPORT_TO_PRIV(x) \ | 227 | #define RPORT_TO_PRIV(x) \ |
228 | (struct fc_rport_libfc_priv *)((void *)x + sizeof(struct fc_rport)); | 228 | (struct fc_rport_libfc_priv *)((void *)x + sizeof(struct fc_rport)); |
229 | 229 | ||
230 | struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *); | ||
231 | |||
232 | static inline void fc_rport_set_name(struct fc_rport *rport, u64 wwpn, u64 wwnn) | 230 | static inline void fc_rport_set_name(struct fc_rport *rport, u64 wwpn, u64 wwnn) |
233 | { | 231 | { |
234 | rport->node_name = wwnn; | 232 | rport->node_name = wwnn; |
@@ -569,7 +567,8 @@ struct libfc_function_template { | |||
569 | /* | 567 | /* |
570 | * Create a remote port | 568 | * Create a remote port |
571 | */ | 569 | */ |
572 | struct fc_rport *(*rport_create)(struct fc_disc_port *); | 570 | struct fc_rport *(*rport_create)(struct fc_lport *, |
571 | struct fc_rport_identifiers *); | ||
573 | 572 | ||
574 | /* | 573 | /* |
575 | * Initiates the RP state machine. It is called from the LP module. | 574 | * Initiates the RP state machine. It is called from the LP module. |