@@ -59,8 +59,6 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)
5959 release_sock (sk );
6060
6161 sock_orphan (sk );
62-
63- s -> local = NULL ;
6462 }
6563
6664 parent_sk = & parent -> sk ;
@@ -83,8 +81,6 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)
8381 release_sock (accept_sk );
8482
8583 sock_orphan (accept_sk );
86-
87- lsk -> local = NULL ;
8884 }
8985 }
9086
@@ -96,13 +92,39 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)
9692 release_sock (parent_sk );
9793
9894 sock_orphan (parent_sk );
99-
100- parent -> local = NULL ;
10195 }
10296
10397 mutex_unlock (& local -> socket_lock );
10498}
10599
100+ struct nfc_llcp_local * nfc_llcp_local_get (struct nfc_llcp_local * local )
101+ {
102+ kref_get (& local -> ref );
103+
104+ return local ;
105+ }
106+
107+ static void local_release (struct kref * ref )
108+ {
109+ struct nfc_llcp_local * local ;
110+
111+ local = container_of (ref , struct nfc_llcp_local , ref );
112+
113+ list_del (& local -> list );
114+ nfc_llcp_socket_release (local );
115+ del_timer_sync (& local -> link_timer );
116+ skb_queue_purge (& local -> tx_queue );
117+ destroy_workqueue (local -> tx_wq );
118+ destroy_workqueue (local -> rx_wq );
119+ kfree_skb (local -> rx_pending );
120+ kfree (local );
121+ }
122+
123+ int nfc_llcp_local_put (struct nfc_llcp_local * local )
124+ {
125+ return kref_put (& local -> ref , local_release );
126+ }
127+
106128static void nfc_llcp_clear_sdp (struct nfc_llcp_local * local )
107129{
108130 mutex_lock (& local -> sdp_lock );
@@ -612,7 +634,7 @@ static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
612634
613635 new_sock = nfc_llcp_sock (new_sk );
614636 new_sock -> dev = local -> dev ;
615- new_sock -> local = local ;
637+ new_sock -> local = nfc_llcp_local_get ( local ) ;
616638 new_sock -> nfc_protocol = sock -> nfc_protocol ;
617639 new_sock -> ssap = bound_sap ;
618640 new_sock -> dsap = ssap ;
@@ -943,6 +965,7 @@ int nfc_llcp_register_device(struct nfc_dev *ndev)
943965
944966 local -> dev = ndev ;
945967 INIT_LIST_HEAD (& local -> list );
968+ kref_init (& local -> ref );
946969 mutex_init (& local -> sdp_lock );
947970 mutex_init (& local -> socket_lock );
948971 init_timer (& local -> link_timer );
@@ -1015,14 +1038,7 @@ void nfc_llcp_unregister_device(struct nfc_dev *dev)
10151038 return ;
10161039 }
10171040
1018- list_del (& local -> list );
1019- nfc_llcp_socket_release (local );
1020- del_timer_sync (& local -> link_timer );
1021- skb_queue_purge (& local -> tx_queue );
1022- destroy_workqueue (local -> tx_wq );
1023- destroy_workqueue (local -> rx_wq );
1024- kfree_skb (local -> rx_pending );
1025- kfree (local );
1041+ nfc_llcp_local_put (local );
10261042}
10271043
10281044int __init nfc_llcp_init (void )
0 commit comments