tipc: refactor name table updates out of named packet receive routine
authorErik Hugne <erik.hugne@ericsson.com>
Thu, 28 Aug 2014 07:08:46 +0000 (09:08 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Sep 2014 00:51:48 +0000 (17:51 -0700)
We need to perform the same actions when processing deferred name
table updates, so this functionality is moved to a separate
function.

Signed-off-by: Erik Hugne <erik.hugne@ericsson.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/name_distr.c

index dcc15bc..0591f33 100644 (file)
@@ -262,53 +262,55 @@ static void named_purge_publ(struct publication *publ)
        kfree(p);
 }
 
+/**
+ * tipc_update_nametbl - try to process a nametable update and notify
+ *                      subscribers
+ *
+ * tipc_nametbl_lock must be held.
+ * Returns the publication item if successful, otherwise NULL.
+ */
+struct publication *tipc_update_nametbl(struct distr_item *i, u32 node,
+                                       u32 dtype)
+{
+       struct publication *publ = NULL;
+
+       if (dtype == PUBLICATION) {
+               publ = tipc_nametbl_insert_publ(ntohl(i->type), ntohl(i->lower),
+                                               ntohl(i->upper),
+                                               TIPC_CLUSTER_SCOPE, node,
+                                               ntohl(i->ref), ntohl(i->key));
+               if (publ) {
+                       tipc_nodesub_subscribe(&publ->subscr, node, publ,
+                                              (net_ev_handler)
+                                              named_purge_publ);
+               }
+       } else if (dtype == WITHDRAWAL) {
+               publ = tipc_nametbl_remove_publ(ntohl(i->type), ntohl(i->lower),
+                                               node, ntohl(i->ref),
+                                               ntohl(i->key));
+               if (publ) {
+                       tipc_nodesub_unsubscribe(&publ->subscr);
+                       kfree(publ);
+               }
+       } else {
+               pr_warn("Unrecognized name table message received\n");
+       }
+       return publ;
+}
+
 /**
  * tipc_named_rcv - process name table update message sent by another node
  */
 void tipc_named_rcv(struct sk_buff *buf)
 {
-       struct publication *publ;
        struct tipc_msg *msg = buf_msg(buf);
        struct distr_item *item = (struct distr_item *)msg_data(msg);
        u32 count = msg_data_sz(msg) / ITEM_SIZE;
 
        write_lock_bh(&tipc_nametbl_lock);
        while (count--) {
-               if (msg_type(msg) == PUBLICATION) {
-                       publ = tipc_nametbl_insert_publ(ntohl(item->type),
-                                                       ntohl(item->lower),
-                                                       ntohl(item->upper),
-                                                       TIPC_CLUSTER_SCOPE,
-                                                       msg_orignode(msg),
-                                                       ntohl(item->ref),
-                                                       ntohl(item->key));
-                       if (publ) {
-                               tipc_nodesub_subscribe(&publ->subscr,
-                                                      msg_orignode(msg),
-                                                      publ,
-                                                      (net_ev_handler)
-                                                      named_purge_publ);
-                       }
-               } else if (msg_type(msg) == WITHDRAWAL) {
-                       publ = tipc_nametbl_remove_publ(ntohl(item->type),
-                                                       ntohl(item->lower),
-                                                       msg_orignode(msg),
-                                                       ntohl(item->ref),
-                                                       ntohl(item->key));
-
-                       if (publ) {
-                               tipc_nodesub_unsubscribe(&publ->subscr);
-                               kfree(publ);
-                       } else {
-                               pr_err("Unable to remove publication by node 0x%x\n"
-                                      " (type=%u, lower=%u, ref=%u, key=%u)\n",
-                                      msg_orignode(msg), ntohl(item->type),
-                                      ntohl(item->lower), ntohl(item->ref),
-                                      ntohl(item->key));
-                       }
-               } else {
-                       pr_warn("Unrecognized name table message received\n");
-               }
+               tipc_update_nametbl(item, msg_orignode(msg),
+                                   msg_type(msg));
                item++;
        }
        write_unlock_bh(&tipc_nametbl_lock);