@@ -93,11 +93,11 @@ static int __must_check rose_add_node(struct rose_route_struct *rose_route,
9393 rose_neigh -> ax25 = NULL ;
9494 rose_neigh -> dev = dev ;
9595 rose_neigh -> count = 0 ;
96- rose_neigh -> use = 0 ;
9796 rose_neigh -> dce_mode = 0 ;
9897 rose_neigh -> loopback = 0 ;
9998 rose_neigh -> number = rose_neigh_no ++ ;
10099 rose_neigh -> restarted = 0 ;
100+ refcount_set (& rose_neigh -> use , 1 );
101101
102102 skb_queue_head_init (& rose_neigh -> queue );
103103
@@ -255,10 +255,10 @@ static void rose_remove_route(struct rose_route *rose_route)
255255 struct rose_route * s ;
256256
257257 if (rose_route -> neigh1 != NULL )
258- rose_route -> neigh1 -> use -- ;
258+ rose_neigh_put ( rose_route -> neigh1 ) ;
259259
260260 if (rose_route -> neigh2 != NULL )
261- rose_route -> neigh2 -> use -- ;
261+ rose_neigh_put ( rose_route -> neigh2 ) ;
262262
263263 if ((s = rose_route_list ) == rose_route ) {
264264 rose_route_list = rose_route -> next ;
@@ -323,7 +323,7 @@ static int rose_del_node(struct rose_route_struct *rose_route,
323323 if (rose_node -> neighbour [i ] == rose_neigh ) {
324324 rose_neigh -> count -- ;
325325
326- if (rose_neigh -> count == 0 && rose_neigh -> use == 0 ) {
326+ if (rose_neigh -> count == 0 ) {
327327 rose_remove_neigh (rose_neigh );
328328 rose_neigh_put (rose_neigh );
329329 }
@@ -375,11 +375,11 @@ void rose_add_loopback_neigh(void)
375375 sn -> ax25 = NULL ;
376376 sn -> dev = NULL ;
377377 sn -> count = 0 ;
378- sn -> use = 0 ;
379378 sn -> dce_mode = 1 ;
380379 sn -> loopback = 1 ;
381380 sn -> number = rose_neigh_no ++ ;
382381 sn -> restarted = 1 ;
382+ refcount_set (& sn -> use , 1 );
383383
384384 skb_queue_head_init (& sn -> queue );
385385
@@ -561,8 +561,7 @@ static int rose_clear_routes(void)
561561 s = rose_neigh ;
562562 rose_neigh = rose_neigh -> next ;
563563
564- if (s -> use == 0 && !s -> loopback ) {
565- s -> count = 0 ;
564+ if (!s -> loopback ) {
566565 rose_remove_neigh (s );
567566 rose_neigh_put (s );
568567 }
@@ -680,6 +679,7 @@ struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
680679 for (i = 0 ; i < node -> count ; i ++ ) {
681680 if (node -> neighbour [i ]-> restarted ) {
682681 res = node -> neighbour [i ];
682+ rose_neigh_hold (node -> neighbour [i ]);
683683 goto out ;
684684 }
685685 }
@@ -691,6 +691,7 @@ struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
691691 for (i = 0 ; i < node -> count ; i ++ ) {
692692 if (!rose_ftimer_running (node -> neighbour [i ])) {
693693 res = node -> neighbour [i ];
694+ rose_neigh_hold (node -> neighbour [i ]);
694695 goto out ;
695696 }
696697 failed = 1 ;
@@ -780,13 +781,13 @@ static void rose_del_route_by_neigh(struct rose_neigh *rose_neigh)
780781 }
781782
782783 if (rose_route -> neigh1 == rose_neigh ) {
783- rose_route -> neigh1 -> use -- ;
784+ rose_neigh_put ( rose_route -> neigh1 ) ;
784785 rose_route -> neigh1 = NULL ;
785786 rose_transmit_clear_request (rose_route -> neigh2 , rose_route -> lci2 , ROSE_OUT_OF_ORDER , 0 );
786787 }
787788
788789 if (rose_route -> neigh2 == rose_neigh ) {
789- rose_route -> neigh2 -> use -- ;
790+ rose_neigh_put ( rose_route -> neigh2 ) ;
790791 rose_route -> neigh2 = NULL ;
791792 rose_transmit_clear_request (rose_route -> neigh1 , rose_route -> lci1 , ROSE_OUT_OF_ORDER , 0 );
792793 }
@@ -915,7 +916,7 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
915916 rose_clear_queues (sk );
916917 rose -> cause = ROSE_NETWORK_CONGESTION ;
917918 rose -> diagnostic = 0 ;
918- rose -> neighbour -> use -- ;
919+ rose_neigh_put ( rose -> neighbour ) ;
919920 rose -> neighbour = NULL ;
920921 rose -> lci = 0 ;
921922 rose -> state = ROSE_STATE_0 ;
@@ -1040,12 +1041,12 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
10401041
10411042 if ((new_lci = rose_new_lci (new_neigh )) == 0 ) {
10421043 rose_transmit_clear_request (rose_neigh , lci , ROSE_NETWORK_CONGESTION , 71 );
1043- goto out ;
1044+ goto put_neigh ;
10441045 }
10451046
10461047 if ((rose_route = kmalloc (sizeof (* rose_route ), GFP_ATOMIC )) == NULL ) {
10471048 rose_transmit_clear_request (rose_neigh , lci , ROSE_NETWORK_CONGESTION , 120 );
1048- goto out ;
1049+ goto put_neigh ;
10491050 }
10501051
10511052 rose_route -> lci1 = lci ;
@@ -1058,8 +1059,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
10581059 rose_route -> lci2 = new_lci ;
10591060 rose_route -> neigh2 = new_neigh ;
10601061
1061- rose_route -> neigh1 -> use ++ ;
1062- rose_route -> neigh2 -> use ++ ;
1062+ rose_neigh_hold ( rose_route -> neigh1 ) ;
1063+ rose_neigh_hold ( rose_route -> neigh2 ) ;
10631064
10641065 rose_route -> next = rose_route_list ;
10651066 rose_route_list = rose_route ;
@@ -1071,6 +1072,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
10711072 rose_transmit_link (skb , rose_route -> neigh2 );
10721073 res = 1 ;
10731074
1075+ put_neigh :
1076+ rose_neigh_put (new_neigh );
10741077out :
10751078 spin_unlock_bh (& rose_route_list_lock );
10761079 spin_unlock_bh (& rose_neigh_list_lock );
@@ -1186,7 +1189,7 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
11861189 (rose_neigh -> loopback ) ? "RSLOOP-0" : ax2asc (buf , & rose_neigh -> callsign ),
11871190 rose_neigh -> dev ? rose_neigh -> dev -> name : "???" ,
11881191 rose_neigh -> count ,
1189- rose_neigh -> use ,
1192+ refcount_read ( & rose_neigh -> use ) - 1 ,
11901193 (rose_neigh -> dce_mode ) ? "DCE" : "DTE" ,
11911194 (rose_neigh -> restarted ) ? "yes" : "no" ,
11921195 ax25_display_timer (& rose_neigh -> t0timer ) / HZ ,
0 commit comments