2222#include <net/sock.h>
2323#include <linux/uaccess.h>
2424#include <linux/fcntl.h>
25+ #include <linux/list.h>
2526#include <linux/mm.h>
2627#include <linux/interrupt.h>
2728#include <linux/init.h>
2829
29- ax25_dev * ax25_dev_list ;
30+ static LIST_HEAD ( ax25_dev_list ) ;
3031DEFINE_SPINLOCK (ax25_dev_lock );
3132
3233ax25_dev * ax25_addr_ax25dev (ax25_address * addr )
3334{
3435 ax25_dev * ax25_dev , * res = NULL ;
3536
3637 spin_lock_bh (& ax25_dev_lock );
37- for (ax25_dev = ax25_dev_list ; ax25_dev != NULL ; ax25_dev = ax25_dev -> next )
38+ list_for_each_entry (ax25_dev , & ax25_dev_list , list )
3839 if (ax25cmp (addr , (const ax25_address * )ax25_dev -> dev -> dev_addr ) == 0 ) {
3940 res = ax25_dev ;
4041 ax25_dev_hold (ax25_dev );
42+ break ;
4143 }
4244 spin_unlock_bh (& ax25_dev_lock );
4345
@@ -59,7 +61,6 @@ void ax25_dev_device_up(struct net_device *dev)
5961 }
6062
6163 refcount_set (& ax25_dev -> refcount , 1 );
62- dev -> ax25_ptr = ax25_dev ;
6364 ax25_dev -> dev = dev ;
6465 netdev_hold (dev , & ax25_dev -> dev_tracker , GFP_KERNEL );
6566 ax25_dev -> forward = NULL ;
@@ -85,10 +86,9 @@ void ax25_dev_device_up(struct net_device *dev)
8586#endif
8687
8788 spin_lock_bh (& ax25_dev_lock );
88- ax25_dev -> next = ax25_dev_list ;
89- ax25_dev_list = ax25_dev ;
89+ list_add ( & ax25_dev -> list , & ax25_dev_list ) ;
90+ dev -> ax25_ptr = ax25_dev ;
9091 spin_unlock_bh (& ax25_dev_lock );
91- ax25_dev_hold (ax25_dev );
9292
9393 ax25_register_dev_sysctl (ax25_dev );
9494}
@@ -111,32 +111,19 @@ void ax25_dev_device_down(struct net_device *dev)
111111 /*
112112 * Remove any packet forwarding that points to this device.
113113 */
114- for ( s = ax25_dev_list ; s != NULL ; s = s -> next )
114+ list_for_each_entry ( s , & ax25_dev_list , list )
115115 if (s -> forward == dev )
116116 s -> forward = NULL ;
117117
118- if ((s = ax25_dev_list ) == ax25_dev ) {
119- ax25_dev_list = s -> next ;
120- goto unlock_put ;
121- }
122-
123- while (s != NULL && s -> next != NULL ) {
124- if (s -> next == ax25_dev ) {
125- s -> next = ax25_dev -> next ;
126- goto unlock_put ;
118+ list_for_each_entry (s , & ax25_dev_list , list ) {
119+ if (s == ax25_dev ) {
120+ list_del (& s -> list );
121+ break ;
127122 }
128-
129- s = s -> next ;
130123 }
131- spin_unlock_bh (& ax25_dev_lock );
132- dev -> ax25_ptr = NULL ;
133- ax25_dev_put (ax25_dev );
134- return ;
135124
136- unlock_put :
137- spin_unlock_bh (& ax25_dev_lock );
138- ax25_dev_put (ax25_dev );
139125 dev -> ax25_ptr = NULL ;
126+ spin_unlock_bh (& ax25_dev_lock );
140127 netdev_put (dev , & ax25_dev -> dev_tracker );
141128 ax25_dev_put (ax25_dev );
142129}
@@ -200,16 +187,13 @@ struct net_device *ax25_fwd_dev(struct net_device *dev)
200187 */
201188void __exit ax25_dev_free (void )
202189{
203- ax25_dev * s , * ax25_dev ;
190+ ax25_dev * s , * n ;
204191
205192 spin_lock_bh (& ax25_dev_lock );
206- ax25_dev = ax25_dev_list ;
207- while (ax25_dev != NULL ) {
208- s = ax25_dev ;
209- netdev_put (ax25_dev -> dev , & ax25_dev -> dev_tracker );
210- ax25_dev = ax25_dev -> next ;
193+ list_for_each_entry_safe (s , n , & ax25_dev_list , list ) {
194+ netdev_put (s -> dev , & s -> dev_tracker );
195+ list_del (& s -> list );
211196 kfree (s );
212197 }
213- ax25_dev_list = NULL ;
214198 spin_unlock_bh (& ax25_dev_lock );
215199}
0 commit comments