22
22
#include <net/sock.h>
23
23
#include <linux/uaccess.h>
24
24
#include <linux/fcntl.h>
25
+ #include <linux/list.h>
25
26
#include <linux/mm.h>
26
27
#include <linux/interrupt.h>
27
28
#include <linux/init.h>
28
29
29
- ax25_dev * ax25_dev_list ;
30
+ static LIST_HEAD ( ax25_dev_list ) ;
30
31
DEFINE_SPINLOCK (ax25_dev_lock );
31
32
32
33
ax25_dev * ax25_addr_ax25dev (ax25_address * addr )
33
34
{
34
35
ax25_dev * ax25_dev , * res = NULL ;
35
36
36
37
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 )
38
39
if (ax25cmp (addr , (const ax25_address * )ax25_dev -> dev -> dev_addr ) == 0 ) {
39
40
res = ax25_dev ;
40
41
ax25_dev_hold (ax25_dev );
42
+ break ;
41
43
}
42
44
spin_unlock_bh (& ax25_dev_lock );
43
45
@@ -59,7 +61,6 @@ void ax25_dev_device_up(struct net_device *dev)
59
61
}
60
62
61
63
refcount_set (& ax25_dev -> refcount , 1 );
62
- dev -> ax25_ptr = ax25_dev ;
63
64
ax25_dev -> dev = dev ;
64
65
netdev_hold (dev , & ax25_dev -> dev_tracker , GFP_KERNEL );
65
66
ax25_dev -> forward = NULL ;
@@ -85,10 +86,9 @@ void ax25_dev_device_up(struct net_device *dev)
85
86
#endif
86
87
87
88
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 ;
90
91
spin_unlock_bh (& ax25_dev_lock );
91
- ax25_dev_hold (ax25_dev );
92
92
93
93
ax25_register_dev_sysctl (ax25_dev );
94
94
}
@@ -111,32 +111,19 @@ void ax25_dev_device_down(struct net_device *dev)
111
111
/*
112
112
* Remove any packet forwarding that points to this device.
113
113
*/
114
- for ( s = ax25_dev_list ; s != NULL ; s = s -> next )
114
+ list_for_each_entry ( s , & ax25_dev_list , list )
115
115
if (s -> forward == dev )
116
116
s -> forward = NULL ;
117
117
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 ;
127
122
}
128
-
129
- s = s -> next ;
130
123
}
131
- spin_unlock_bh (& ax25_dev_lock );
132
- dev -> ax25_ptr = NULL ;
133
- ax25_dev_put (ax25_dev );
134
- return ;
135
124
136
- unlock_put :
137
- spin_unlock_bh (& ax25_dev_lock );
138
- ax25_dev_put (ax25_dev );
139
125
dev -> ax25_ptr = NULL ;
126
+ spin_unlock_bh (& ax25_dev_lock );
140
127
netdev_put (dev , & ax25_dev -> dev_tracker );
141
128
ax25_dev_put (ax25_dev );
142
129
}
@@ -200,16 +187,13 @@ struct net_device *ax25_fwd_dev(struct net_device *dev)
200
187
*/
201
188
void __exit ax25_dev_free (void )
202
189
{
203
- ax25_dev * s , * ax25_dev ;
190
+ ax25_dev * s , * n ;
204
191
205
192
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 );
211
196
kfree (s );
212
197
}
213
- ax25_dev_list = NULL ;
214
198
spin_unlock_bh (& ax25_dev_lock );
215
199
}
0 commit comments