From: Jon Maloy <jma...@redhat.com>

We reduce the signature of tipc_find_service() and
tipc_create_service(). The reason for doing this might not
be obvious, but we plan to let struct tipc_uaddr contain
information that is relevant for these functions in a later
commit.

Signed-off-by: Jon Maloy <jma...@redhat.com>
---
 net/tipc/name_table.c | 58 ++++++++++++++++++++++++++-----------------
 net/tipc/name_table.h |  2 +-
 net/tipc/socket.c     |  2 +-
 3 files changed, 37 insertions(+), 25 deletions(-)

diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
index 57abed74d0d9..554a006d7c0d 100644
--- a/net/tipc/name_table.c
+++ b/net/tipc/name_table.c
@@ -255,20 +255,25 @@ static struct publication *tipc_publ_create(struct 
tipc_uaddr *ua,
  *
  * Allocates a single range structure and sets it to all 0's.
  */
-static struct tipc_service *tipc_service_create(u32 type, struct hlist_head 
*hd)
+static struct tipc_service *tipc_service_create(struct net *net,
+                                               struct tipc_uaddr *ua)
 {
-       struct tipc_service *service = kzalloc(sizeof(*service), GFP_ATOMIC);
+       struct name_table *nt = tipc_name_table(net);
+       struct tipc_service *service;
+       struct hlist_head *hd;
 
+       service = kzalloc(sizeof(*service), GFP_ATOMIC);
        if (!service) {
                pr_warn("Service creation failed, no memory\n");
                return NULL;
        }
 
        spin_lock_init(&service->lock);
-       service->type = type;
+       service->type = ua->sr.type;
        service->ranges = RB_ROOT;
        INIT_HLIST_NODE(&service->service_list);
        INIT_LIST_HEAD(&service->subscriptions);
+       hd = &nt->services[hash(ua->sr.type)];
        hlist_add_head_rcu(&service->service_list, hd);
        return service;
 }
@@ -453,15 +458,16 @@ static void tipc_service_subscribe(struct tipc_service 
*service,
        }
 }
 
-static struct tipc_service *tipc_service_find(struct net *net, u32 type)
+static struct tipc_service *tipc_service_find(struct net *net,
+                                             struct tipc_uaddr *ua)
 {
        struct name_table *nt = tipc_name_table(net);
        struct hlist_head *service_head;
        struct tipc_service *service;
 
-       service_head = &nt->services[hash(type)];
+       service_head = &nt->services[hash(ua->sr.type)];
        hlist_for_each_entry_rcu(service, service_head, service_list) {
-               if (service->type == type)
+               if (service->type == ua->sr.type)
                        return service;
        }
        return NULL;
@@ -472,7 +478,6 @@ struct publication *tipc_nametbl_insert_publ(struct net 
*net,
                                             struct tipc_socket_addr *sk,
                                             u32 key)
 {
-       struct name_table *nt = tipc_name_table(net);
        struct tipc_service *sc;
        struct publication *p;
        u32 type = ua->sr.type;
@@ -487,9 +492,9 @@ struct publication *tipc_nametbl_insert_publ(struct net 
*net,
                         type, ua->sr.lower, ua->sr.upper, sk->node);
                return NULL;
        }
-       sc = tipc_service_find(net, type);
+       sc = tipc_service_find(net, ua);
        if (!sc)
-               sc = tipc_service_create(type, &nt->services[hash(type)]);
+               sc = tipc_service_create(net, ua);
        if (sc) {
                spin_lock_bh(&sc->lock);
                res = tipc_service_insert_publ(net, sc, p);
@@ -512,7 +517,7 @@ struct publication *tipc_nametbl_remove_publ(struct net 
*net,
        struct tipc_service *sc;
        bool last;
 
-       sc = tipc_service_find(net, ua->sr.type);
+       sc = tipc_service_find(net, ua);
        if (!sc)
                return NULL;
 
@@ -585,7 +590,7 @@ bool tipc_nametbl_lookup_anycast(struct net *net,
                return true;
 
        rcu_read_lock();
-       sc = tipc_service_find(net, ua->sr.type);
+       sc = tipc_service_find(net, ua);
        if (unlikely(!sc))
                goto exit;
 
@@ -638,7 +643,7 @@ bool tipc_nametbl_lookup_group(struct net *net, struct 
tipc_uaddr *ua,
 
        *dstcnt = 0;
        rcu_read_lock();
-       sc = tipc_service_find(net, ua->sa.type);
+       sc = tipc_service_find(net, ua);
        if (unlikely(!sc))
                goto exit;
 
@@ -682,7 +687,7 @@ void tipc_nametbl_lookup_mcast_sockets(struct net *net, 
struct tipc_uaddr *ua,
        u32 scope = ua->scope;
 
        rcu_read_lock();
-       sc = tipc_service_find(net, ua->sr.type);
+       sc = tipc_service_find(net, ua);
        if (!sc)
                goto exit;
 
@@ -711,7 +716,7 @@ void tipc_nametbl_lookup_mcast_nodes(struct net *net, 
struct tipc_uaddr *ua,
        struct publication *p;
 
        rcu_read_lock();
-       sc = tipc_service_find(net, ua->sr.type);
+       sc = tipc_service_find(net, ua);
        if (!sc)
                goto exit;
 
@@ -729,7 +734,7 @@ void tipc_nametbl_lookup_mcast_nodes(struct net *net, 
struct tipc_uaddr *ua,
 /* tipc_nametbl_build_group - build list of communication group members
  */
 void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
-                             u32 type, u32 scope)
+                             struct tipc_uaddr *ua)
 {
        struct service_range *sr;
        struct tipc_service *sc;
@@ -737,7 +742,7 @@ void tipc_nametbl_build_group(struct net *net, struct 
tipc_group *grp,
        struct rb_node *n;
 
        rcu_read_lock();
-       sc = tipc_service_find(net, type);
+       sc = tipc_service_find(net, ua);
        if (!sc)
                goto exit;
 
@@ -745,9 +750,10 @@ void tipc_nametbl_build_group(struct net *net, struct 
tipc_group *grp,
        for (n = rb_first(&sc->ranges); n; n = rb_next(n)) {
                sr = container_of(n, struct service_range, tree_node);
                list_for_each_entry(p, &sr->all_publ, all_publ) {
-                       if (p->scope != scope)
+                       if (p->scope != ua->scope)
                                continue;
-                       tipc_group_add_member(grp, p->sk.node, p->sk.ref, 
p->sr.lower);
+                       tipc_group_add_member(grp, p->sk.node, p->sk.ref,
+                                             p->sr.lower);
                }
        }
        spin_unlock_bh(&sc->lock);
@@ -829,17 +835,18 @@ void tipc_nametbl_withdraw(struct net *net, struct 
tipc_uaddr *ua,
  */
 bool tipc_nametbl_subscribe(struct tipc_subscription *sub)
 {
-       struct name_table *nt = tipc_name_table(sub->net);
        struct tipc_net *tn = tipc_net(sub->net);
        struct tipc_subscr *s = &sub->evt.s;
        u32 type = tipc_sub_read(s, seq.type);
        struct tipc_service *sc;
+       struct tipc_uaddr ua;
        bool res = true;
 
+       tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, type, 0, 0);
        spin_lock_bh(&tn->nametbl_lock);
-       sc = tipc_service_find(sub->net, type);
+       sc = tipc_service_find(sub->net, &ua);
        if (!sc)
-               sc = tipc_service_create(type, &nt->services[hash(type)]);
+               sc = tipc_service_create(sub->net, &ua);
        if (sc) {
                spin_lock_bh(&sc->lock);
                tipc_service_subscribe(sc, sub);
@@ -864,9 +871,11 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription 
*sub)
        struct tipc_subscr *s = &sub->evt.s;
        u32 type = tipc_sub_read(s, seq.type);
        struct tipc_service *sc;
+       struct tipc_uaddr ua;
 
+       tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, type, 0, 0);
        spin_lock_bh(&tn->nametbl_lock);
-       sc = tipc_service_find(sub->net, type);
+       sc = tipc_service_find(sub->net, &ua);
        if (!sc)
                goto exit;
 
@@ -1058,6 +1067,7 @@ static int tipc_nl_service_list(struct net *net, struct 
tipc_nl_msg *msg,
        struct tipc_net *tn = tipc_net(net);
        struct tipc_service *service = NULL;
        struct hlist_head *head;
+       struct tipc_uaddr ua;
        int err;
        int i;
 
@@ -1071,7 +1081,9 @@ static int tipc_nl_service_list(struct net *net, struct 
tipc_nl_msg *msg,
 
                if (*last_type ||
                    (!i && *last_key && (*last_lower == *last_key))) {
-                       service = tipc_service_find(net, *last_type);
+                       tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE,
+                                  *last_type, *last_lower, *last_lower);
+                       service = tipc_service_find(net, &ua);
                        if (!service)
                                return -EPIPE;
                } else {
diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h
index 909eaf706553..5b8102e70f3b 100644
--- a/net/tipc/name_table.h
+++ b/net/tipc/name_table.h
@@ -121,7 +121,7 @@ bool tipc_nametbl_lookup_group(struct net *net, struct 
tipc_uaddr *ua,
                               struct list_head *dsts, int *dstcnt,
                               u32 exclude, bool mcast);
 void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
-                             u32 type, u32 domain);
+                             struct tipc_uaddr *ua);
 struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr 
*ua,
                                         struct tipc_socket_addr *sk, u32 key);
 void tipc_nametbl_withdraw(struct net *net, struct tipc_uaddr *ua,
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index a349160a5ae4..8f1083d3859d 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -3073,9 +3073,9 @@ static int tipc_sk_join(struct tipc_sock *tsk, struct 
tipc_group_req *mreq)
        msg_set_lookup_scope(hdr, mreq->scope);
        msg_set_nametype(hdr, mreq->type);
        msg_set_dest_droppable(hdr, true);
-       tipc_nametbl_build_group(net, grp, mreq->type, mreq->scope);
        tipc_uaddr(&ua, TIPC_SERVICE_RANGE, mreq->scope,
                   mreq->type, mreq->instance, mreq->instance);
+       tipc_nametbl_build_group(net, grp, &ua);
        rc = tipc_sk_publish(tsk, &ua);
        if (rc) {
                tipc_group_delete(net, grp);
-- 
2.28.0



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to