aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorAriel Nahum <arieln@mellanox.com>2014-07-31 06:27:47 -0400
committerRoland Dreier <roland@purestorage.com>2014-08-01 18:10:04 -0400
commit0a6907588a8b9bf1aa9ee84b809a1d49caea594a (patch)
treee81a22d10d9deb7e5118953e11ffd95c0e1406ab /drivers/infiniband
parent2ea32938f3a702d08c5cc2cc9cb8b11235eaad8c (diff)
IB/iser: Seperate iser_conn and iscsi_endpoint storage space
iser connection needs asynchronous cleanup completions which are triggered in ep_disconnect. As a result we are keeping the corresponding iscsi_endpoint structure hanging for no good reason. In order to avoid that, we seperate iser_conn from iscsi_endpoint storage space to have their destruction being independent. iscsi_endpoint will be destroyed at ep_disconnect stage, while the iser connection will wait for asynchronous completions to be released in an orderly fashion. Signed-off-by: Ariel Nahum <arieln@mellanox.com> Signed-off-by: Roi Dayan <roid@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c16
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c2
2 files changed, 14 insertions, 4 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 1a53fd22aedf..d7acd4b62d6e 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -596,19 +596,28 @@ iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,
596 struct iser_conn *ib_conn; 596 struct iser_conn *ib_conn;
597 struct iscsi_endpoint *ep; 597 struct iscsi_endpoint *ep;
598 598
599 ep = iscsi_create_endpoint(sizeof(*ib_conn)); 599 ep = iscsi_create_endpoint(0);
600 if (!ep) 600 if (!ep)
601 return ERR_PTR(-ENOMEM); 601 return ERR_PTR(-ENOMEM);
602 602
603 ib_conn = ep->dd_data; 603 ib_conn = kzalloc(sizeof(*ib_conn), GFP_KERNEL);
604 if (!ib_conn) {
605 err = -ENOMEM;
606 goto failure;
607 }
608
609 ep->dd_data = ib_conn;
604 ib_conn->ep = ep; 610 ib_conn->ep = ep;
605 iser_conn_init(ib_conn); 611 iser_conn_init(ib_conn);
606 612
607 err = iser_connect(ib_conn, NULL, dst_addr, non_blocking); 613 err = iser_connect(ib_conn, NULL, dst_addr, non_blocking);
608 if (err) 614 if (err)
609 return ERR_PTR(err); 615 goto failure;
610 616
611 return ep; 617 return ep;
618failure:
619 iscsi_destroy_endpoint(ep);
620 return ERR_PTR(err);
612} 621}
613 622
614static int 623static int
@@ -658,6 +667,7 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)
658 } else { 667 } else {
659 iser_conn_release(ib_conn); 668 iser_conn_release(ib_conn);
660 } 669 }
670 iscsi_destroy_endpoint(ep);
661} 671}
662 672
663static umode_t iser_attr_is_visible(int param_type, int param) 673static umode_t iser_attr_is_visible(int param_type, int param)
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 6c7d8ce7b016..fffb4ac4c6ac 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -620,7 +620,7 @@ void iser_conn_release(struct iser_conn *ib_conn)
620 rdma_destroy_id(ib_conn->cma_id); 620 rdma_destroy_id(ib_conn->cma_id);
621 ib_conn->cma_id = NULL; 621 ib_conn->cma_id = NULL;
622 } 622 }
623 iscsi_destroy_endpoint(ib_conn->ep); 623 kfree(ib_conn);
624} 624}
625 625
626/** 626/**