tipc: Fix initialization sequence problems when entering network mode
authorAllan Stephens <allan.stephens@windriver.com>
Wed, 21 May 2008 21:55:04 +0000 (14:55 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 21 May 2008 21:55:04 +0000 (14:55 -0700)
This patch ensures that TIPC's topology service and configuration
service are shut down before switching into "network mode".  This
ensures that TIPC does not mistakenly try to send unnecessary
"publication withdraw" messages to other nodes before it is fully
initialized for sending off-node messages.  Note that the node's
current network address is now updated only after the two services
are shut down; this ensures that any existing connections to the
topology server are terminated correctly using the old address.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/config.c
net/tipc/core.c
net/tipc/core.h
net/tipc/net.c
net/tipc/net.h

index 16e7cb74969b02204b007d59ef9861372fdd4c11..ca3544d030c7f9177fbe426e9f955c4655c157cc 100644 (file)
@@ -293,7 +293,6 @@ static struct sk_buff *cfg_set_own_addr(void)
        if (tipc_mode == TIPC_NET_MODE)
                return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
                                                   " (cannot change node address once assigned)");
-       tipc_own_addr = addr;
 
        /*
         * Must release all spinlocks before calling start_net() because
@@ -306,7 +305,7 @@ static struct sk_buff *cfg_set_own_addr(void)
         */
 
        spin_unlock_bh(&config_lock);
-       tipc_core_start_net();
+       tipc_core_start_net(addr);
        spin_lock_bh(&config_lock);
        return tipc_cfg_reply_none();
 }
index 3d97386af095868f87acbf6e3afb00e6d194a766..3256bd7d398fb0850a4e2fdd5a294ad2d6405c40 100644 (file)
@@ -117,11 +117,11 @@ void tipc_core_stop_net(void)
  * start_net - start TIPC networking sub-systems
  */
 
-int tipc_core_start_net(void)
+int tipc_core_start_net(unsigned long addr)
 {
        int res;
 
-       if ((res = tipc_net_start()) ||
+       if ((res = tipc_net_start(addr)) ||
            (res = tipc_eth_media_start())) {
                tipc_core_stop_net();
        }
index bd78d1705c0f3193ad9dcddb0ab112f17b716d8f..a881f92a8537c71531ca7eda1421c3766c7601db 100644 (file)
@@ -202,7 +202,7 @@ extern atomic_t tipc_user_count;
 
 extern int  tipc_core_start(void);
 extern void tipc_core_stop(void);
-extern int  tipc_core_start_net(void);
+extern int  tipc_core_start_net(unsigned long addr);
 extern void tipc_core_stop_net(void);
 extern int  tipc_handler_start(void);
 extern void tipc_handler_stop(void);
index c39c76201e8edb2bd343c68f4b5e6ce4de202c49..cc51fa483672a12234c5f653f1392536d4b89000 100644 (file)
@@ -266,7 +266,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
        tipc_link_send(buf, dnode, msg_link_selector(msg));
 }
 
-int tipc_net_start(void)
+int tipc_net_start(u32 addr)
 {
        char addr_string[16];
        int res;
@@ -274,6 +274,10 @@ int tipc_net_start(void)
        if (tipc_mode != TIPC_NODE_MODE)
                return -ENOPROTOOPT;
 
+       tipc_subscr_stop();
+       tipc_cfg_stop();
+
+       tipc_own_addr = addr;
        tipc_mode = TIPC_NET_MODE;
        tipc_named_reinit();
        tipc_port_reinit();
@@ -284,10 +288,10 @@ int tipc_net_start(void)
            (res = tipc_bclink_init())) {
                return res;
        }
-       tipc_subscr_stop();
-       tipc_cfg_stop();
+
        tipc_k_signal((Handler)tipc_subscr_start, 0);
        tipc_k_signal((Handler)tipc_cfg_init, 0);
+
        info("Started in network mode\n");
        info("Own node address %s, network identity %u\n",
             addr_string_fill(addr_string, tipc_own_addr), tipc_net_id);
index a6a0e9976ac9e1de14395165e53ca9750f430219..d154ac2bda9a174ab3114dc3b86e0783511daf8c 100644 (file)
@@ -58,7 +58,7 @@ void tipc_net_route_msg(struct sk_buff *buf);
 struct node *tipc_net_select_remote_node(u32 addr, u32 ref);
 u32 tipc_net_select_router(u32 addr, u32 ref);
 
-int tipc_net_start(void);
+int tipc_net_start(u32 addr);
 void tipc_net_stop(void);
 
 #endif