Signed-off-by: Robert Love <[EMAIL PROTECTED]>
---
drivers/scsi/libfc/fc_ns.c | 41 +++++++++++++++++++++++------------------
1 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/drivers/scsi/libfc/fc_ns.c b/drivers/scsi/libfc/fc_ns.c
index c58d131..d6a0725 100644
--- a/drivers/scsi/libfc/fc_ns.c
+++ b/drivers/scsi/libfc/fc_ns.c
@@ -48,7 +48,7 @@ static void fc_ns_gpn_id_req(struct work_struct *);
static void fc_ns_gpn_id_resp(struct fc_seq *, struct fc_frame *, void *);
static void fc_ns_gpn_id_error(struct fc_ns_port *rp, struct fc_frame *fp);
-static int fc_ns_gnn_id_req(struct fc_lport *, struct fc_ns_port *);
+static void fc_ns_gnn_id_req(struct work_struct *work);
static void fc_ns_gnn_id_resp(struct fc_seq *, struct fc_frame *, void *);
static void fc_ns_gnn_id_error(struct fc_ns_port *, struct fc_frame *);
static void fc_ns_enter_reg_pn(struct fc_lport *lp);
@@ -762,14 +762,16 @@ static int fc_ns_gpn_ft_parse(struct fc_lport *lp, void
*buf, size_t len)
dp = kzalloc(sizeof(*dp), GFP_KERNEL);
if (!dp)
break;
+
dp->lp = lp;
dp->ids.port_id = ntoh24(np->fp_fid);
dp->ids.port_name = ntohll(np->fp_wwpn);
dp->ids.node_name = -1;
dp->ids.roles = FC_RPORT_ROLE_UNKNOWN;
- error = fc_ns_gnn_id_req(lp, dp);
- if (error)
- break;
+
+ INIT_WORK(&dp->rport_create_work, fc_ns_gnn_id_req);
+ schedule_work(&dp->rport_create_work);
+
if (np->fp_flags & FC_NS_FID_LAST) {
fc_ns_disc_done(lp);
len = 0;
@@ -979,7 +981,9 @@ static void fc_ns_gpn_id_resp(struct fc_seq *sp, struct
fc_frame *fp,
break;
}
dp->ids.port_name = ntohll(cp->wwn);
- fc_ns_gnn_id_req(lp, dp);
+
+ INIT_WORK(&dp->rport_create_work, fc_ns_gnn_id_req);
+ schedule_work(&dp->rport_create_work);
break;
case FC_FS_RJT:
fc_ns_restart(lp);
@@ -1163,20 +1167,24 @@ EXPORT_SYMBOL(fc_ns_init);
* @lp: Fibre Channel host port instance
* @dp: Temporary discovery port for holding IDs and world wide names
*
+ * XXX- Is the following statement still true?
* The remote port is held by the caller for us.
*/
-static int fc_ns_gnn_id_req(struct fc_lport *lp, struct fc_ns_port *dp)
+static void fc_ns_gnn_id_req(struct work_struct *work)
{
+ struct fc_ns_port *dp = container_of(work,
+ struct fc_ns_port,
+ rport_create_work);
+ struct fc_lport *lp = dp->lp;
struct fc_frame *fp;
struct req {
struct fc_ct_hdr ct;
struct fc_ns_fid fid;
} *cp;
- int error = 0;
fp = fc_frame_alloc(lp, sizeof(*cp));
- if (fp == NULL)
- return -ENOMEM;
+ if (!fp)
+ return;
cp = fc_frame_payload_get(fp, sizeof(*cp));
fc_ns_fill_dns_hdr(lp, &cp->ct, FC_NS_GNN_ID, sizeof(cp->fid));
@@ -1185,15 +1193,12 @@ static int fc_ns_gnn_id_req(struct fc_lport *lp, struct
fc_ns_port *dp)
WARN_ON(!fc_lport_test_ready(lp));
fc_frame_setup(fp, FC_RCTL_DD_UNSOL_CTL, FC_TYPE_CT);
- if (!lp->tt.exch_seq_send(lp, fp,
- fc_ns_gnn_id_resp,
- dp, lp->e_d_tov,
- lp->fid,
- lp->dns_rp->port_id,
- FC_FC_SEQ_INIT | FC_FC_END_SEQ))
- error = -ENOMEM;
-
- return error;
+ lp->tt.exch_seq_send(lp, fp,
+ fc_ns_gnn_id_resp,
+ dp, lp->e_d_tov,
+ lp->fid,
+ lp->dns_rp->port_id,
+ FC_FC_SEQ_INIT | FC_FC_END_SEQ);
}
/**
_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel