|
@@ -54,8 +54,6 @@ struct tipc_subscriber {
|
|
|
|
|
|
static void tipc_subscrp_delete(struct tipc_subscription *sub);
|
|
|
static void tipc_subscrb_put(struct tipc_subscriber *subscriber);
|
|
|
-static void tipc_subscrp_put(struct tipc_subscription *subscription);
|
|
|
-static void tipc_subscrp_get(struct tipc_subscription *subscription);
|
|
|
|
|
|
/**
|
|
|
* htohl - convert value to endianness used by destination
|
|
@@ -125,7 +123,6 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub, u32 found_lower,
|
|
|
{
|
|
|
struct tipc_name_seq seq;
|
|
|
|
|
|
- tipc_subscrp_get(sub);
|
|
|
tipc_subscrp_convert_seq(&sub->evt.s.seq, sub->swap, &seq);
|
|
|
if (!tipc_subscrp_check_overlap(&seq, found_lower, found_upper))
|
|
|
return;
|
|
@@ -135,7 +132,6 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub, u32 found_lower,
|
|
|
|
|
|
tipc_subscrp_send_event(sub, found_lower, found_upper, event, port_ref,
|
|
|
node);
|
|
|
- tipc_subscrp_put(sub);
|
|
|
}
|
|
|
|
|
|
static void tipc_subscrp_timeout(unsigned long data)
|
|
@@ -145,6 +141,7 @@ static void tipc_subscrp_timeout(unsigned long data)
|
|
|
|
|
|
spin_lock_bh(&subscriber->lock);
|
|
|
tipc_nametbl_unsubscribe(sub);
|
|
|
+ list_del(&sub->subscrp_list);
|
|
|
spin_unlock_bh(&subscriber->lock);
|
|
|
|
|
|
/* Notify subscriber of timeout */
|
|
@@ -177,20 +174,17 @@ static void tipc_subscrp_kref_release(struct kref *kref)
|
|
|
struct tipc_net *tn = net_generic(sub->net, tipc_net_id);
|
|
|
struct tipc_subscriber *subscriber = sub->subscriber;
|
|
|
|
|
|
- spin_lock_bh(&subscriber->lock);
|
|
|
- list_del(&sub->subscrp_list);
|
|
|
atomic_dec(&tn->subscription_count);
|
|
|
- spin_unlock_bh(&subscriber->lock);
|
|
|
kfree(sub);
|
|
|
tipc_subscrb_put(subscriber);
|
|
|
}
|
|
|
|
|
|
-static void tipc_subscrp_put(struct tipc_subscription *subscription)
|
|
|
+void tipc_subscrp_put(struct tipc_subscription *subscription)
|
|
|
{
|
|
|
kref_put(&subscription->kref, tipc_subscrp_kref_release);
|
|
|
}
|
|
|
|
|
|
-static void tipc_subscrp_get(struct tipc_subscription *subscription)
|
|
|
+void tipc_subscrp_get(struct tipc_subscription *subscription)
|
|
|
{
|
|
|
kref_get(&subscription->kref);
|
|
|
}
|
|
@@ -210,11 +204,8 @@ static void tipc_subscrb_subscrp_delete(struct tipc_subscriber *subscriber,
|
|
|
continue;
|
|
|
|
|
|
tipc_nametbl_unsubscribe(sub);
|
|
|
- tipc_subscrp_get(sub);
|
|
|
- spin_unlock_bh(&subscriber->lock);
|
|
|
+ list_del(&sub->subscrp_list);
|
|
|
tipc_subscrp_delete(sub);
|
|
|
- tipc_subscrp_put(sub);
|
|
|
- spin_lock_bh(&subscriber->lock);
|
|
|
|
|
|
if (s)
|
|
|
break;
|