]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/tipc/subscr.c
Merge branch 'linux-4.12' of git://github.com/skeggsb/linux into drm-next
[karo-tx-linux.git] / net / tipc / subscr.c
index 271cd66e4b3b66534d8686bec94132bc9737314e..0bf91cd3733cb37ecc8ba4ccf7ae5a26cb6e966d 100644 (file)
@@ -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;