|
@@ -50,6 +50,7 @@
|
|
|
* @dest: destination address for request messages
|
|
|
* @domain: network domain to which links can be established
|
|
|
* @num_nodes: number of nodes currently discovered (i.e. with an active link)
|
|
|
+ * @lock: spinlock for controlling access to requests
|
|
|
* @buf: request message to be (repeatedly) sent
|
|
|
* @timer: timer governing period between requests
|
|
|
* @timer_intv: current interval between requests (in ms)
|
|
@@ -59,6 +60,7 @@ struct tipc_link_req {
|
|
|
struct tipc_media_addr dest;
|
|
|
u32 domain;
|
|
|
int num_nodes;
|
|
|
+ spinlock_t lock;
|
|
|
struct sk_buff *buf;
|
|
|
struct timer_list timer;
|
|
|
unsigned int timer_intv;
|
|
@@ -274,7 +276,9 @@ static void disc_update(struct tipc_link_req *req)
|
|
|
*/
|
|
|
void tipc_disc_add_dest(struct tipc_link_req *req)
|
|
|
{
|
|
|
+ spin_lock_bh(&req->lock);
|
|
|
req->num_nodes++;
|
|
|
+ spin_unlock_bh(&req->lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -283,8 +287,10 @@ void tipc_disc_add_dest(struct tipc_link_req *req)
|
|
|
*/
|
|
|
void tipc_disc_remove_dest(struct tipc_link_req *req)
|
|
|
{
|
|
|
+ spin_lock_bh(&req->lock);
|
|
|
req->num_nodes--;
|
|
|
disc_update(req);
|
|
|
+ spin_unlock_bh(&req->lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -297,7 +303,7 @@ static void disc_timeout(struct tipc_link_req *req)
|
|
|
{
|
|
|
int max_delay;
|
|
|
|
|
|
- spin_lock_bh(&req->bearer->lock);
|
|
|
+ spin_lock_bh(&req->lock);
|
|
|
|
|
|
/* Stop searching if only desired node has been found */
|
|
|
if (tipc_node(req->domain) && req->num_nodes) {
|
|
@@ -325,7 +331,7 @@ static void disc_timeout(struct tipc_link_req *req)
|
|
|
|
|
|
k_start_timer(&req->timer, req->timer_intv);
|
|
|
exit:
|
|
|
- spin_unlock_bh(&req->bearer->lock);
|
|
|
+ spin_unlock_bh(&req->lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -356,6 +362,7 @@ int tipc_disc_create(struct tipc_bearer *b_ptr, struct tipc_media_addr *dest,
|
|
|
req->domain = dest_domain;
|
|
|
req->num_nodes = 0;
|
|
|
req->timer_intv = TIPC_LINK_REQ_INIT;
|
|
|
+ spin_lock_init(&req->lock);
|
|
|
k_init_timer(&req->timer, (Handler)disc_timeout, (unsigned long)req);
|
|
|
k_start_timer(&req->timer, req->timer_intv);
|
|
|
b_ptr->link_req = req;
|