diff options
| author | Michael S. Tsirkin <mst@mellanox.co.il> | 2006-08-21 19:40:12 -0400 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2006-09-22 18:22:53 -0400 |
| commit | c1a0b23bf477c2e1068905f4e2b5c3cee139e853 (patch) | |
| tree | 68357e32e8b6542647f639da8ca3859b4cb3b59b /drivers | |
| parent | 2439a6e65ff09729c3b4215f134dc5cd4e8a30c0 (diff) | |
IB/sa: Require SA registration
Require users to register with SA module, to prevent the sa_query
module text from going away while an SA query callback is still
running. Update all in-tree users for the new interface.
Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/infiniband/core/cma.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/core/sa_query.c | 60 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 12 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 12 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 9 |
6 files changed, 82 insertions, 20 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 488fa1d642a7..1178bd434d1b 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
| @@ -62,6 +62,7 @@ static struct ib_client cma_client = { | |||
| 62 | .remove = cma_remove_one | 62 | .remove = cma_remove_one |
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | static struct ib_sa_client sa_client; | ||
| 65 | static LIST_HEAD(dev_list); | 66 | static LIST_HEAD(dev_list); |
| 66 | static LIST_HEAD(listen_any_list); | 67 | static LIST_HEAD(listen_any_list); |
| 67 | static DEFINE_MUTEX(lock); | 68 | static DEFINE_MUTEX(lock); |
| @@ -1323,7 +1324,7 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms, | |||
| 1323 | path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr)); | 1324 | path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr)); |
| 1324 | path_rec.numb_path = 1; | 1325 | path_rec.numb_path = 1; |
| 1325 | 1326 | ||
| 1326 | id_priv->query_id = ib_sa_path_rec_get(id_priv->id.device, | 1327 | id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device, |
| 1327 | id_priv->id.port_num, &path_rec, | 1328 | id_priv->id.port_num, &path_rec, |
| 1328 | IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID | | 1329 | IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID | |
| 1329 | IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH, | 1330 | IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH, |
| @@ -2199,12 +2200,15 @@ static int cma_init(void) | |||
| 2199 | if (!cma_wq) | 2200 | if (!cma_wq) |
| 2200 | return -ENOMEM; | 2201 | return -ENOMEM; |
| 2201 | 2202 | ||
| 2203 | ib_sa_register_client(&sa_client); | ||
| 2204 | |||
| 2202 | ret = ib_register_client(&cma_client); | 2205 | ret = ib_register_client(&cma_client); |
| 2203 | if (ret) | 2206 | if (ret) |
| 2204 | goto err; | 2207 | goto err; |
| 2205 | return 0; | 2208 | return 0; |
| 2206 | 2209 | ||
| 2207 | err: | 2210 | err: |
| 2211 | ib_sa_unregister_client(&sa_client); | ||
| 2208 | destroy_workqueue(cma_wq); | 2212 | destroy_workqueue(cma_wq); |
| 2209 | return ret; | 2213 | return ret; |
| 2210 | } | 2214 | } |
| @@ -2212,6 +2216,7 @@ err: | |||
| 2212 | static void cma_cleanup(void) | 2216 | static void cma_cleanup(void) |
| 2213 | { | 2217 | { |
| 2214 | ib_unregister_client(&cma_client); | 2218 | ib_unregister_client(&cma_client); |
| 2219 | ib_sa_unregister_client(&sa_client); | ||
| 2215 | destroy_workqueue(cma_wq); | 2220 | destroy_workqueue(cma_wq); |
| 2216 | idr_destroy(&sdp_ps); | 2221 | idr_destroy(&sdp_ps); |
| 2217 | idr_destroy(&tcp_ps); | 2222 | idr_destroy(&tcp_ps); |
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c index ca8760a7d88c..1706d3c7e95e 100644 --- a/drivers/infiniband/core/sa_query.c +++ b/drivers/infiniband/core/sa_query.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2004 Topspin Communications. All rights reserved. | 2 | * Copyright (c) 2004 Topspin Communications. All rights reserved. |
| 3 | * Copyright (c) 2005 Voltaire, Inc. All rights reserved. | 3 | * Copyright (c) 2005 Voltaire, Inc. All rights reserved. |
| 4 | * Copyright (c) 2006 Intel Corporation. All rights reserved. | ||
| 4 | * | 5 | * |
| 5 | * This software is available to you under a choice of one of two | 6 | * This software is available to you under a choice of one of two |
| 6 | * licenses. You may choose to be licensed under the terms of the GNU | 7 | * licenses. You may choose to be licensed under the terms of the GNU |
| @@ -75,6 +76,7 @@ struct ib_sa_device { | |||
| 75 | struct ib_sa_query { | 76 | struct ib_sa_query { |
| 76 | void (*callback)(struct ib_sa_query *, int, struct ib_sa_mad *); | 77 | void (*callback)(struct ib_sa_query *, int, struct ib_sa_mad *); |
| 77 | void (*release)(struct ib_sa_query *); | 78 | void (*release)(struct ib_sa_query *); |
| 79 | struct ib_sa_client *client; | ||
| 78 | struct ib_sa_port *port; | 80 | struct ib_sa_port *port; |
| 79 | struct ib_mad_send_buf *mad_buf; | 81 | struct ib_mad_send_buf *mad_buf; |
| 80 | struct ib_sa_sm_ah *sm_ah; | 82 | struct ib_sa_sm_ah *sm_ah; |
| @@ -415,6 +417,31 @@ static void ib_sa_event(struct ib_event_handler *handler, struct ib_event *event | |||
| 415 | } | 417 | } |
| 416 | } | 418 | } |
| 417 | 419 | ||
| 420 | void ib_sa_register_client(struct ib_sa_client *client) | ||
| 421 | { | ||
| 422 | atomic_set(&client->users, 1); | ||
| 423 | init_completion(&client->comp); | ||
| 424 | } | ||
| 425 | EXPORT_SYMBOL(ib_sa_register_client); | ||
| 426 | |||
| 427 | static inline void ib_sa_client_get(struct ib_sa_client *client) | ||
| 428 | { | ||
| 429 | atomic_inc(&client->users); | ||
| 430 | } | ||
| 431 | |||
| 432 | static inline void ib_sa_client_put(struct ib_sa_client *client) | ||
| 433 | { | ||
| 434 | if (atomic_dec_and_test(&client->users)) | ||
| 435 | complete(&client->comp); | ||
| 436 | } | ||
| 437 | |||
| 438 | void ib_sa_unregister_client(struct ib_sa_client *client) | ||
| 439 | { | ||
| 440 | ib_sa_client_put(client); | ||
| 441 | wait_for_completion(&client->comp); | ||
| 442 | } | ||
| 443 | EXPORT_SYMBOL(ib_sa_unregister_client); | ||
| 444 | |||
| 418 | /** | 445 | /** |
| 419 | * ib_sa_cancel_query - try to cancel an SA query | 446 | * ib_sa_cancel_query - try to cancel an SA query |
| 420 | * @id:ID of query to cancel | 447 | * @id:ID of query to cancel |
| @@ -557,6 +584,7 @@ static void ib_sa_path_rec_release(struct ib_sa_query *sa_query) | |||
| 557 | 584 | ||
| 558 | /** | 585 | /** |
| 559 | * ib_sa_path_rec_get - Start a Path get query | 586 | * ib_sa_path_rec_get - Start a Path get query |
| 587 | * @client:SA client | ||
| 560 | * @device:device to send query on | 588 | * @device:device to send query on |
| 561 | * @port_num: port number to send query on | 589 | * @port_num: port number to send query on |
| 562 | * @rec:Path Record to send in query | 590 | * @rec:Path Record to send in query |
| @@ -579,7 +607,8 @@ static void ib_sa_path_rec_release(struct ib_sa_query *sa_query) | |||
| 579 | * error code. Otherwise it is a query ID that can be used to cancel | 607 | * error code. Otherwise it is a query ID that can be used to cancel |
| 580 | * the query. | 608 | * the query. |
| 581 | */ | 609 | */ |
| 582 | int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, | 610 | int ib_sa_path_rec_get(struct ib_sa_client *client, |
| 611 | struct ib_device *device, u8 port_num, | ||
| 583 | struct ib_sa_path_rec *rec, | 612 | struct ib_sa_path_rec *rec, |
| 584 | ib_sa_comp_mask comp_mask, | 613 | ib_sa_comp_mask comp_mask, |
| 585 | int timeout_ms, gfp_t gfp_mask, | 614 | int timeout_ms, gfp_t gfp_mask, |
| @@ -614,8 +643,10 @@ int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, | |||
| 614 | goto err1; | 643 | goto err1; |
| 615 | } | 644 | } |
| 616 | 645 | ||
| 617 | query->callback = callback; | 646 | ib_sa_client_get(client); |
| 618 | query->context = context; | 647 | query->sa_query.client = client; |
| 648 | query->callback = callback; | ||
| 649 | query->context = context; | ||
| 619 | 650 | ||
| 620 | mad = query->sa_query.mad_buf->mad; | 651 | mad = query->sa_query.mad_buf->mad; |
| 621 | init_mad(mad, agent); | 652 | init_mad(mad, agent); |
| @@ -639,6 +670,7 @@ int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, | |||
| 639 | 670 | ||
| 640 | err2: | 671 | err2: |
| 641 | *sa_query = NULL; | 672 | *sa_query = NULL; |
| 673 | ib_sa_client_put(query->sa_query.client); | ||
| 642 | ib_free_send_mad(query->sa_query.mad_buf); | 674 | ib_free_send_mad(query->sa_query.mad_buf); |
| 643 | 675 | ||
| 644 | err1: | 676 | err1: |
| @@ -671,6 +703,7 @@ static void ib_sa_service_rec_release(struct ib_sa_query *sa_query) | |||
| 671 | 703 | ||
| 672 | /** | 704 | /** |
| 673 | * ib_sa_service_rec_query - Start Service Record operation | 705 | * ib_sa_service_rec_query - Start Service Record operation |
| 706 | * @client:SA client | ||
| 674 | * @device:device to send request on | 707 | * @device:device to send request on |
| 675 | * @port_num: port number to send request on | 708 | * @port_num: port number to send request on |
| 676 | * @method:SA method - should be get, set, or delete | 709 | * @method:SA method - should be get, set, or delete |
| @@ -695,7 +728,8 @@ static void ib_sa_service_rec_release(struct ib_sa_query *sa_query) | |||
| 695 | * error code. Otherwise it is a request ID that can be used to cancel | 728 | * error code. Otherwise it is a request ID that can be used to cancel |
| 696 | * the query. | 729 | * the query. |
| 697 | */ | 730 | */ |
| 698 | int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method, | 731 | int ib_sa_service_rec_query(struct ib_sa_client *client, |
| 732 | struct ib_device *device, u8 port_num, u8 method, | ||
| 699 | struct ib_sa_service_rec *rec, | 733 | struct ib_sa_service_rec *rec, |
| 700 | ib_sa_comp_mask comp_mask, | 734 | ib_sa_comp_mask comp_mask, |
| 701 | int timeout_ms, gfp_t gfp_mask, | 735 | int timeout_ms, gfp_t gfp_mask, |
| @@ -735,8 +769,10 @@ int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method, | |||
| 735 | goto err1; | 769 | goto err1; |
| 736 | } | 770 | } |
| 737 | 771 | ||
| 738 | query->callback = callback; | 772 | ib_sa_client_get(client); |
| 739 | query->context = context; | 773 | query->sa_query.client = client; |
| 774 | query->callback = callback; | ||
| 775 | query->context = context; | ||
| 740 | 776 | ||
| 741 | mad = query->sa_query.mad_buf->mad; | 777 | mad = query->sa_query.mad_buf->mad; |
| 742 | init_mad(mad, agent); | 778 | init_mad(mad, agent); |
| @@ -761,6 +797,7 @@ int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method, | |||
| 761 | 797 | ||
| 762 | err2: | 798 | err2: |
| 763 | *sa_query = NULL; | 799 | *sa_query = NULL; |
| 800 | ib_sa_client_put(query->sa_query.client); | ||
| 764 | ib_free_send_mad(query->sa_query.mad_buf); | 801 | ib_free_send_mad(query->sa_query.mad_buf); |
| 765 | 802 | ||
| 766 | err1: | 803 | err1: |
| @@ -791,7 +828,8 @@ static void ib_sa_mcmember_rec_release(struct ib_sa_query *sa_query) | |||
| 791 | kfree(container_of(sa_query, struct ib_sa_mcmember_query, sa_query)); | 828 | kfree(container_of(sa_query, struct ib_sa_mcmember_query, sa_query)); |
| 792 | } | 829 | } |
| 793 | 830 | ||
| 794 | int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num, | 831 | int ib_sa_mcmember_rec_query(struct ib_sa_client *client, |
| 832 | struct ib_device *device, u8 port_num, | ||
| 795 | u8 method, | 833 | u8 method, |
| 796 | struct ib_sa_mcmember_rec *rec, | 834 | struct ib_sa_mcmember_rec *rec, |
| 797 | ib_sa_comp_mask comp_mask, | 835 | ib_sa_comp_mask comp_mask, |
| @@ -827,8 +865,10 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num, | |||
| 827 | goto err1; | 865 | goto err1; |
| 828 | } | 866 | } |
| 829 | 867 | ||
| 830 | query->callback = callback; | 868 | ib_sa_client_get(client); |
| 831 | query->context = context; | 869 | query->sa_query.client = client; |
| 870 | query->callback = callback; | ||
| 871 | query->context = context; | ||
| 832 | 872 | ||
| 833 | mad = query->sa_query.mad_buf->mad; | 873 | mad = query->sa_query.mad_buf->mad; |
| 834 | init_mad(mad, agent); | 874 | init_mad(mad, agent); |
| @@ -853,6 +893,7 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num, | |||
| 853 | 893 | ||
| 854 | err2: | 894 | err2: |
| 855 | *sa_query = NULL; | 895 | *sa_query = NULL; |
| 896 | ib_sa_client_put(query->sa_query.client); | ||
| 856 | ib_free_send_mad(query->sa_query.mad_buf); | 897 | ib_free_send_mad(query->sa_query.mad_buf); |
| 857 | 898 | ||
| 858 | err1: | 899 | err1: |
| @@ -889,6 +930,7 @@ static void send_handler(struct ib_mad_agent *agent, | |||
| 889 | 930 | ||
| 890 | ib_free_send_mad(mad_send_wc->send_buf); | 931 | ib_free_send_mad(mad_send_wc->send_buf); |
| 891 | kref_put(&query->sm_ah->ref, free_sm_ah); | 932 | kref_put(&query->sm_ah->ref, free_sm_ah); |
| 933 | ib_sa_client_put(query->client); | ||
| 892 | query->release(query); | 934 | query->release(query); |
| 893 | } | 935 | } |
| 894 | 936 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 474aa214ab57..0b8a79d53a00 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
| @@ -336,6 +336,8 @@ static inline void ipoib_unregister_debugfs(void) { } | |||
| 336 | extern int ipoib_sendq_size; | 336 | extern int ipoib_sendq_size; |
| 337 | extern int ipoib_recvq_size; | 337 | extern int ipoib_recvq_size; |
| 338 | 338 | ||
| 339 | extern struct ib_sa_client ipoib_sa_client; | ||
| 340 | |||
| 339 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 341 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
| 340 | extern int ipoib_debug_level; | 342 | extern int ipoib_debug_level; |
| 341 | 343 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index e9a7659eb1d7..ae3a4982cddb 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -82,6 +82,8 @@ static const u8 ipv4_bcast_addr[] = { | |||
| 82 | 82 | ||
| 83 | struct workqueue_struct *ipoib_workqueue; | 83 | struct workqueue_struct *ipoib_workqueue; |
| 84 | 84 | ||
| 85 | struct ib_sa_client ipoib_sa_client; | ||
| 86 | |||
| 85 | static void ipoib_add_one(struct ib_device *device); | 87 | static void ipoib_add_one(struct ib_device *device); |
| 86 | static void ipoib_remove_one(struct ib_device *device); | 88 | static void ipoib_remove_one(struct ib_device *device); |
| 87 | 89 | ||
| @@ -463,7 +465,7 @@ static int path_rec_start(struct net_device *dev, | |||
| 463 | init_completion(&path->done); | 465 | init_completion(&path->done); |
| 464 | 466 | ||
| 465 | path->query_id = | 467 | path->query_id = |
| 466 | ib_sa_path_rec_get(priv->ca, priv->port, | 468 | ib_sa_path_rec_get(&ipoib_sa_client, priv->ca, priv->port, |
| 467 | &path->pathrec, | 469 | &path->pathrec, |
| 468 | IB_SA_PATH_REC_DGID | | 470 | IB_SA_PATH_REC_DGID | |
| 469 | IB_SA_PATH_REC_SGID | | 471 | IB_SA_PATH_REC_SGID | |
| @@ -1191,13 +1193,16 @@ static int __init ipoib_init_module(void) | |||
| 1191 | goto err_fs; | 1193 | goto err_fs; |
| 1192 | } | 1194 | } |
| 1193 | 1195 | ||
| 1196 | ib_sa_register_client(&ipoib_sa_client); | ||
| 1197 | |||
| 1194 | ret = ib_register_client(&ipoib_client); | 1198 | ret = ib_register_client(&ipoib_client); |
| 1195 | if (ret) | 1199 | if (ret) |
| 1196 | goto err_wq; | 1200 | goto err_sa; |
| 1197 | 1201 | ||
| 1198 | return 0; | 1202 | return 0; |
| 1199 | 1203 | ||
| 1200 | err_wq: | 1204 | err_sa: |
| 1205 | ib_sa_unregister_client(&ipoib_sa_client); | ||
| 1201 | destroy_workqueue(ipoib_workqueue); | 1206 | destroy_workqueue(ipoib_workqueue); |
| 1202 | 1207 | ||
| 1203 | err_fs: | 1208 | err_fs: |
| @@ -1209,6 +1214,7 @@ err_fs: | |||
| 1209 | static void __exit ipoib_cleanup_module(void) | 1214 | static void __exit ipoib_cleanup_module(void) |
| 1210 | { | 1215 | { |
| 1211 | ib_unregister_client(&ipoib_client); | 1216 | ib_unregister_client(&ipoib_client); |
| 1217 | ib_sa_unregister_client(&ipoib_sa_client); | ||
| 1212 | ipoib_unregister_debugfs(); | 1218 | ipoib_unregister_debugfs(); |
| 1213 | destroy_workqueue(ipoib_workqueue); | 1219 | destroy_workqueue(ipoib_workqueue); |
| 1214 | } | 1220 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 60b09f5cb347..fb3e4875a46d 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
| @@ -361,7 +361,7 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
| 361 | 361 | ||
| 362 | init_completion(&mcast->done); | 362 | init_completion(&mcast->done); |
| 363 | 363 | ||
| 364 | ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, | 364 | ret = ib_sa_mcmember_rec_set(&ipoib_sa_client, priv->ca, priv->port, &rec, |
| 365 | IB_SA_MCMEMBER_REC_MGID | | 365 | IB_SA_MCMEMBER_REC_MGID | |
| 366 | IB_SA_MCMEMBER_REC_PORT_GID | | 366 | IB_SA_MCMEMBER_REC_PORT_GID | |
| 367 | IB_SA_MCMEMBER_REC_PKEY | | 367 | IB_SA_MCMEMBER_REC_PKEY | |
| @@ -485,9 +485,9 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, | |||
| 485 | 485 | ||
| 486 | init_completion(&mcast->done); | 486 | init_completion(&mcast->done); |
| 487 | 487 | ||
| 488 | ret = ib_sa_mcmember_rec_set(priv->ca, priv->port, &rec, comp_mask, | 488 | ret = ib_sa_mcmember_rec_set(&ipoib_sa_client, priv->ca, priv->port, |
| 489 | mcast->backoff * 1000, GFP_ATOMIC, | 489 | &rec, comp_mask, mcast->backoff * 1000, |
| 490 | ipoib_mcast_join_complete, | 490 | GFP_ATOMIC, ipoib_mcast_join_complete, |
| 491 | mcast, &mcast->query); | 491 | mcast, &mcast->query); |
| 492 | 492 | ||
| 493 | if (ret < 0) { | 493 | if (ret < 0) { |
| @@ -528,7 +528,7 @@ void ipoib_mcast_join_task(void *dev_ptr) | |||
| 528 | priv->local_rate = attr.active_speed * | 528 | priv->local_rate = attr.active_speed * |
| 529 | ib_width_enum_to_int(attr.active_width); | 529 | ib_width_enum_to_int(attr.active_width); |
| 530 | } else | 530 | } else |
| 531 | ipoib_warn(priv, "ib_query_port failed\n"); | 531 | ipoib_warn(priv, "ib_query_port failed\n"); |
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | if (!priv->broadcast) { | 534 | if (!priv->broadcast) { |
| @@ -681,7 +681,7 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) | |||
| 681 | * Just make one shot at leaving and don't wait for a reply; | 681 | * Just make one shot at leaving and don't wait for a reply; |
| 682 | * if we fail, too bad. | 682 | * if we fail, too bad. |
| 683 | */ | 683 | */ |
| 684 | ret = ib_sa_mcmember_rec_delete(priv->ca, priv->port, &rec, | 684 | ret = ib_sa_mcmember_rec_delete(&ipoib_sa_client, priv->ca, priv->port, &rec, |
| 685 | IB_SA_MCMEMBER_REC_MGID | | 685 | IB_SA_MCMEMBER_REC_MGID | |
| 686 | IB_SA_MCMEMBER_REC_PORT_GID | | 686 | IB_SA_MCMEMBER_REC_PORT_GID | |
| 687 | IB_SA_MCMEMBER_REC_PKEY | | 687 | IB_SA_MCMEMBER_REC_PKEY | |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index feb1fcd0f2fb..44b9e5be6687 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
| @@ -96,6 +96,8 @@ static struct ib_client srp_client = { | |||
| 96 | .remove = srp_remove_one | 96 | .remove = srp_remove_one |
| 97 | }; | 97 | }; |
| 98 | 98 | ||
| 99 | static struct ib_sa_client srp_sa_client; | ||
| 100 | |||
| 99 | static inline struct srp_target_port *host_to_target(struct Scsi_Host *host) | 101 | static inline struct srp_target_port *host_to_target(struct Scsi_Host *host) |
| 100 | { | 102 | { |
| 101 | return (struct srp_target_port *) host->hostdata; | 103 | return (struct srp_target_port *) host->hostdata; |
| @@ -267,7 +269,8 @@ static int srp_lookup_path(struct srp_target_port *target) | |||
| 267 | 269 | ||
| 268 | init_completion(&target->done); | 270 | init_completion(&target->done); |
| 269 | 271 | ||
| 270 | target->path_query_id = ib_sa_path_rec_get(target->srp_host->dev->dev, | 272 | target->path_query_id = ib_sa_path_rec_get(&srp_sa_client, |
| 273 | target->srp_host->dev->dev, | ||
| 271 | target->srp_host->port, | 274 | target->srp_host->port, |
| 272 | &target->path, | 275 | &target->path, |
| 273 | IB_SA_PATH_REC_DGID | | 276 | IB_SA_PATH_REC_DGID | |
| @@ -1998,9 +2001,12 @@ static int __init srp_init_module(void) | |||
| 1998 | return ret; | 2001 | return ret; |
| 1999 | } | 2002 | } |
| 2000 | 2003 | ||
| 2004 | ib_sa_register_client(&srp_sa_client); | ||
| 2005 | |||
| 2001 | ret = ib_register_client(&srp_client); | 2006 | ret = ib_register_client(&srp_client); |
| 2002 | if (ret) { | 2007 | if (ret) { |
| 2003 | printk(KERN_ERR PFX "couldn't register IB client\n"); | 2008 | printk(KERN_ERR PFX "couldn't register IB client\n"); |
| 2009 | ib_sa_unregister_client(&srp_sa_client); | ||
| 2004 | class_unregister(&srp_class); | 2010 | class_unregister(&srp_class); |
| 2005 | return ret; | 2011 | return ret; |
| 2006 | } | 2012 | } |
| @@ -2011,6 +2017,7 @@ static int __init srp_init_module(void) | |||
| 2011 | static void __exit srp_cleanup_module(void) | 2017 | static void __exit srp_cleanup_module(void) |
| 2012 | { | 2018 | { |
| 2013 | ib_unregister_client(&srp_client); | 2019 | ib_unregister_client(&srp_client); |
| 2020 | ib_sa_unregister_client(&srp_sa_client); | ||
| 2014 | class_unregister(&srp_class); | 2021 | class_unregister(&srp_class); |
| 2015 | } | 2022 | } |
| 2016 | 2023 | ||
