On Wed, Dec 9, 2020 at 2:51 AM <jma...@redhat.com> wrote:
>
> From: Jon Maloy <jma...@redhat.com>
>
> Following the priniciples of the preceding commits, we reduce
> the number of parameters passed along in tipc_sk_withdraw(),
> tipc_nametbl_withdraw() and associated functions.
>
> Signed-off-by: Jon Maloy <jma...@redhat.com>
> ---
>  net/tipc/name_distr.c | 11 ++++----
>  net/tipc/name_table.c | 54 +++++++++++++++++++-----------------
>  net/tipc/name_table.h | 11 ++++----
>  net/tipc/node.c       |  3 +-
>  net/tipc/socket.c     | 64 +++++++++++++++++++++----------------------
>  5 files changed, 74 insertions(+), 69 deletions(-)
>
> diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
> index df42fc2b4536..fe5f39792323 100644
> --- a/net/tipc/name_distr.c
> +++ b/net/tipc/name_distr.c
> @@ -244,17 +244,19 @@ static void tipc_publ_purge(struct net *net, struct 
> publication *p, u32 addr)
>  {
>         struct tipc_net *tn = tipc_net(net);
>         struct publication *_p;
> +       struct tipc_uaddr ua;
>
> +       tipc_uaddr(&ua, p->addrtype, p->scope, p->sr.type,
> +                  p->sr.lower, p->sr.upper);
>         spin_lock_bh(&tn->nametbl_lock);
> -       _p = tipc_nametbl_remove_publ(net, p->sr.type, p->sr.lower,
> -                                     p->sr.upper, p->sk.node, p->key);
> +       _p = tipc_nametbl_remove_publ(net, &ua, &p->sk, p->key);
>         if (_p)
>                 tipc_node_unsubscribe(net, &_p->binding_node, addr);
>         spin_unlock_bh(&tn->nametbl_lock);
>
>         if (_p != p) {
>                 pr_err("Unable to remove publication from failed node\n"
> -                      " (type=%u, lower=%u, node=0x%x, port=%u, key=%u)\n",
> +                      " (type=%u, lower=%u, node=%u, port=%u, key=%u)\n",
Currently, there seem still some places using 0x%x to print node value.

>                        p->sr.type, p->sr.lower, p->sk.node, p->sk.ref, 
> p->key);
>         }
>
> @@ -309,8 +311,7 @@ static bool tipc_update_nametbl(struct net *net, struct 
> distr_item *i,
>                         return true;
>                 }
>         } else if (dtype == WITHDRAWAL) {
> -               p = tipc_nametbl_remove_publ(net, ua.sr.type, ua.sr.lower,
> -                                            ua.sr.upper, node, key);
> +               p = tipc_nametbl_remove_publ(net, &ua, &sk, key);
>                 if (p) {
>                         tipc_node_unsubscribe(net, &p->binding_node, node);
>                         kfree_rcu(p, rcu);
> diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
> index ba96d5fc57f3..50562d086016 100644
> --- a/net/tipc/name_table.c
> +++ b/net/tipc/name_table.c
> @@ -367,12 +367,15 @@ static bool tipc_service_insert_publ(struct net *net,
>   * @node: target node
>   * @key: target publication key
>   */
> -static struct publication *tipc_service_remove_publ(struct service_range *sr,
> -                                                   u32 node, u32 key)
> +static struct publication *tipc_service_remove_publ(struct service_range *r,
> +                                                   struct tipc_uaddr *ua,
> +                                                   struct tipc_socket_addr 
> *sk,
> +                                                   u32 key)
>  {
>         struct publication *p;
> +       u32 node = sk->node;
>
> -       list_for_each_entry(p, &sr->all_publ, all_publ) {
> +       list_for_each_entry(p, &r->all_publ, all_publ) {
>                 if (p->key != key || (node && node != p->sk.node))
>                         continue;
>                 list_del(&p->all_publ);
> @@ -496,32 +499,35 @@ struct publication *tipc_nametbl_insert_publ(struct net 
> *net,
>         return NULL;
>  }
>
> -struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type,
> -                                            u32 lower, u32 upper,
> -                                            u32 node, u32 key)
> +struct publication *tipc_nametbl_remove_publ(struct net *net,
> +                                            struct tipc_uaddr *ua,
> +                                            struct tipc_socket_addr *sk,
> +                                            u32 key)
>  {
> -       struct tipc_service *sc = tipc_service_find(net, type);
>         struct tipc_subscription *sub, *tmp;
> -       struct service_range *sr = NULL;
>         struct publication *p = NULL;
> +       struct service_range *sr;
> +       struct tipc_service *sc;
>         bool last;
>
> +       sc = tipc_service_find(net, ua->sr.type);
>         if (!sc)
>                 return NULL;
>
>         spin_lock_bh(&sc->lock);
> -       sr = tipc_service_find_range(sc, lower, upper);
> +       sr = tipc_service_find_range(sc, ua->sr.lower, ua->sr.upper);
>         if (!sr)
>                 goto exit;
> -       p = tipc_service_remove_publ(sr, node, key);
> +       p = tipc_service_remove_publ(sr, ua, sk, key);
>         if (!p)
>                 goto exit;
>
>         /* Notify any waiting subscriptions */
>         last = list_empty(&sr->all_publ);
>         list_for_each_entry_safe(sub, tmp, &sc->subscriptions, service_list) {
> -               tipc_sub_report_overlap(sub, lower, upper, TIPC_WITHDRAWN,
> -                                       p->sk.ref, node, p->scope, last);
> +               tipc_sub_report_overlap(sub, ua->sr.lower, ua->sr.upper,
> +                                       TIPC_WITHDRAWN, sk->ref, sk->node,
> +                                       ua->scope, last);
>         }
>
>         /* Remove service range item if this was its last publication */
> @@ -771,24 +777,22 @@ struct publication *tipc_nametbl_publish(struct net 
> *net, struct tipc_uaddr *ua,
>  /**
>   * tipc_nametbl_withdraw - withdraw a service binding
>   * @net: network namespace
> - * @type: service type
> - * @lower: service range lower bound
> - * @upper: service range upper bound
> + * @ua: service address/range being unbound
> + * @sk: address of socket bveing unbound from
>   * @key: target publication key
>   */
> -int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower,
> -                         u32 upper, u32 key)
> +void tipc_nametbl_withdraw(struct net *net, struct tipc_uaddr *ua,
> +                          struct tipc_socket_addr *sk, u32 key)
>  {
>         struct name_table *nt = tipc_name_table(net);
>         struct tipc_net *tn = tipc_net(net);
> -       u32 self = tipc_own_addr(net);
>         struct sk_buff *skb = NULL;
>         struct publication *p;
>         u32 rc_dests;
>
>         spin_lock_bh(&tn->nametbl_lock);
>
> -       p = tipc_nametbl_remove_publ(net, type, lower, upper, self, key);
> +       p = tipc_nametbl_remove_publ(net, ua, sk, key);
>         if (p) {
>                 nt->local_publ_count--;
>                 skb = tipc_named_withdraw(net, p);
> @@ -796,16 +800,13 @@ int tipc_nametbl_withdraw(struct net *net, u32 type, 
> u32 lower,
>                 kfree_rcu(p, rcu);
>         } else {
>                 pr_err("Failed to remove local publication {%u,%u,%u}/%u\n",
> -                      type, lower, upper, key);
> +                      ua->sr.type, ua->sr.lower, ua->sr.upper, key);
>         }
>         rc_dests = nt->rc_dests;
>         spin_unlock_bh(&tn->nametbl_lock);
>
> -       if (skb) {
> +       if (skb)
>                 tipc_node_broadcast(net, skb, rc_dests);
> -               return 1;
> -       }
> -       return 0;
>  }
>
>  /**
> @@ -899,11 +900,14 @@ static void tipc_service_delete(struct net *net, struct 
> tipc_service *sc)
>  {
>         struct service_range *sr, *tmpr;
>         struct publication *p, *tmp;
> +       struct tipc_uaddr ua;
>
>         spin_lock_bh(&sc->lock);
>         rbtree_postorder_for_each_entry_safe(sr, tmpr, &sc->ranges, 
> tree_node) {
>                 list_for_each_entry_safe(p, tmp, &sr->all_publ, all_publ) {
> -                       tipc_service_remove_publ(sr, p->sk.node, p->key);
> +                       tipc_uaddr(&ua, p->addrtype, p->scope,
> +                                  p->sr.type, p->sr.lower, p->sr.upper);
> +                       tipc_service_remove_publ(sr, &ua, &p->sk, p->key);
>                         kfree_rcu(p, rcu);
>                 }
>                 rb_erase_augmented(&sr->tree_node, &sc->ranges, 
> &sr_callbacks);
> diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h
> index e12b9eb2c7f1..5f48f05b93be 100644
> --- a/net/tipc/name_table.h
> +++ b/net/tipc/name_table.h
> @@ -124,15 +124,16 @@ bool tipc_nametbl_lookup(struct net *net, u32 type, u32 
> instance, u32 domain,
>                          bool all);
>  struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr 
> *ua,
>                                          struct tipc_socket_addr *sk, u32 
> key);
> -int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 upper,
> -                         u32 key);
> +void tipc_nametbl_withdraw(struct net *net, struct tipc_uaddr *ua,
> +                          struct tipc_socket_addr *sk, u32 key);
>  struct publication *tipc_nametbl_insert_publ(struct net *net,
>                                              struct tipc_uaddr *ua,
>                                              struct tipc_socket_addr *sk,
>                                              u32 key);
> -struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type,
> -                                            u32 lower, u32 upper,
> -                                            u32 node, u32 key);
> +struct publication *tipc_nametbl_remove_publ(struct net *net,
> +                                            struct tipc_uaddr *ua,
> +                                            struct tipc_socket_addr *sk,
> +                                            u32 key);
>  bool tipc_nametbl_subscribe(struct tipc_subscription *s);
>  void tipc_nametbl_unsubscribe(struct tipc_subscription *s);
>  int tipc_nametbl_init(struct net *net);
> diff --git a/net/tipc/node.c b/net/tipc/node.c
> index 3a71e26c9509..24f3f5ea968d 100644
> --- a/net/tipc/node.c
> +++ b/net/tipc/node.c
> @@ -429,8 +429,7 @@ static void tipc_node_write_unlock(struct tipc_node *n)
>         }
>         if (flags & TIPC_NOTIFY_LINK_DOWN) {
>                 tipc_mon_peer_down(net, n->addr, bearer_id);
> -               tipc_nametbl_withdraw(net, TIPC_LINK_STATE, n->addr,
> -                                     n->addr, n->link_id);
> +               tipc_nametbl_withdraw(net, &ua, &sk, n->link_id);
>         }
>  }
>
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
> index 0a92ebdd096d..5a017a34fb5f 100644
> --- a/net/tipc/socket.c
> +++ b/net/tipc/socket.c
> @@ -152,8 +152,7 @@ static int tipc_accept(struct socket *sock, struct socket 
> *new_sock, int flags,
>                        bool kern);
>  static void tipc_sk_timeout(struct timer_list *t);
>  static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua);
> -static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
> -                           struct tipc_service_range const *seq);
> +static int tipc_sk_withdraw(struct tipc_sock *tsk, struct tipc_uaddr *ua);
>  static int tipc_sk_leave(struct tipc_sock *tsk);
>  static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid);
>  static int tipc_sk_insert(struct tipc_sock *tsk);
> @@ -643,7 +642,7 @@ static int tipc_release(struct socket *sock)
>         __tipc_shutdown(sock, TIPC_ERR_NO_PORT);
>         sk->sk_shutdown = SHUTDOWN_MASK;
>         tipc_sk_leave(tsk);
> -       tipc_sk_withdraw(tsk, 0, NULL);
> +       tipc_sk_withdraw(tsk, NULL);
>         __skb_queue_purge(&tsk->mc_method.deferredq);
>         sk_stop_timer(sk, &sk->sk_timer);
>         tipc_sk_remove(tsk);
> @@ -681,7 +680,7 @@ static int __tipc_bind(struct socket *sock, struct 
> sockaddr *skaddr, int alen)
>         bool unbind = false;
>
>         if (unlikely(!alen))
> -               return tipc_sk_withdraw(tsk, 0, NULL);
> +               return tipc_sk_withdraw(tsk, NULL);
>
>         if (ua->addrtype == TIPC_SERVICE_ADDR) {
>                 ua->addrtype = TIPC_SERVICE_RANGE;
> @@ -699,7 +698,7 @@ static int __tipc_bind(struct socket *sock, struct 
> sockaddr *skaddr, int alen)
>                 return -EACCES;
>
>         if (unbind)
> -               return tipc_sk_withdraw(tsk, ua->scope, &ua->sr);
> +               return tipc_sk_withdraw(tsk, ua);
>         return tipc_sk_publish(tsk, ua);
>  }
>
> @@ -2923,38 +2922,37 @@ static int tipc_sk_publish(struct tipc_sock *tsk, 
> struct tipc_uaddr *ua)
>         return 0;
>  }
>
> -static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
> -                           struct tipc_service_range const *seq)
> +static int tipc_sk_withdraw(struct tipc_sock *tsk, struct tipc_uaddr *ua)
>  {
>         struct net *net = sock_net(&tsk->sk);
> -       struct publication *publ;
> -       struct publication *safe;
> +       struct publication *safe, *p;
> +       struct tipc_uaddr _ua;
>         int rc = -EINVAL;
>
> -       if (scope != TIPC_NODE_SCOPE)
> -               scope = TIPC_CLUSTER_SCOPE;
> -
> -       list_for_each_entry_safe(publ, safe, &tsk->publications, 
> binding_sock) {
> -               if (seq) {
> -                       if (publ->scope != scope)
> -                               continue;
> -                       if (publ->sr.type != seq->type)
> -                               continue;
> -                       if (publ->sr.lower != seq->lower)
> -                               continue;
> -                       if (publ->sr.upper != seq->upper)
> -                               break;
> -                       tipc_nametbl_withdraw(net, publ->sr.type, 
> publ->sr.lower,
> -                                             publ->sr.upper, publ->key);
> -                       rc = 0;
> -                       break;
> +       list_for_each_entry_safe(p, safe, &tsk->publications, binding_sock) {
> +               if (!ua) {
> +                       tipc_uaddr(&_ua, p->addrtype, p->scope,
> +                                  p->sr.type, p->sr.lower, p->sr.upper);
> +                       tipc_nametbl_withdraw(net, &_ua, &p->sk, p->key);
> +                       continue;
>                 }
> -               tipc_nametbl_withdraw(net, publ->sr.type, publ->sr.lower,
> -                                     publ->sr.upper, publ->key);
> +               /* Unbind specific publication */
> +               if (p->scope != ua->scope)
> +                       continue;
> +               if (p->sr.type != ua->sr.type)
> +                       continue;
> +               if (p->sr.lower != ua->sr.lower)
> +                       continue;
> +               if (p->sr.upper != ua->sr.upper)
> +                       break;
> +               tipc_nametbl_withdraw(net, ua, &p->sk, p->key);
>                 rc = 0;
> +               break;
>         }
> -       if (list_empty(&tsk->publications))
> +       if (list_empty(&tsk->publications)) {
>                 tsk->published = 0;
> +               rc = 0;
> +       }
>         return rc;
>  }
>
> @@ -3107,15 +3105,17 @@ static int tipc_sk_leave(struct tipc_sock *tsk)
>  {
>         struct net *net = sock_net(&tsk->sk);
>         struct tipc_group *grp = tsk->group;
> -       struct tipc_service_range seq;
> +       struct tipc_uaddr ua;
>         int scope;
>
>         if (!grp)
>                 return -EINVAL;
> -       tipc_group_self(grp, &seq, &scope);
> +       ua.addrtype = TIPC_SERVICE_RANGE;
> +       tipc_group_self(grp, &ua.sr, &scope);
> +       ua.scope = scope;
I'm thinking it's possible to change grp->scope to 'signed char' type,
same as scope in struct tipc_uaddr/sockaddr_tipc. then do:

        tipc_group_self(grp, &ua.sr, &ua.scope);

>         tipc_group_delete(net, grp);
>         tsk->group = NULL;
> -       tipc_sk_withdraw(tsk, scope, &seq);
> +       tipc_sk_withdraw(tsk, &ua);
>         return 0;
>  }
>
> --
> 2.28.0
>
>
>
> _______________________________________________
> tipc-discussion mailing list
> tipc-discussion@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tipc-discussion


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

Reply via email to