aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2009-07-14 16:13:41 -0400
committerDavid S. Miller <davem@davemloft.net>2009-07-14 16:13:41 -0400
commit252aa9d94a04252046f3a382e6aca1b5c95921d8 (patch)
tree5b265e4ae8011bd99938b2d4da5abac411aa6fc7
parent8660c1240ec6016522b882c88751cb4ce40bf0e8 (diff)
Revert "NET: Fix locking issues in PPP, 6pack, mkiss and strip line disciplines."
This reverts commit adeab1afb7de89555c69aab5ca21300c14af6369. As Alan Cox explained, the TTY layer changes that went recently to get rid of the tty->low_latency stuff fixes this already, and even for -stable it's the ->low_latency changes that should go in to fix this, rather than this patch. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/hamradio/6pack.c10
-rw-r--r--drivers/net/hamradio/mkiss.c41
-rw-r--r--drivers/net/ppp_async.c11
-rw-r--r--drivers/net/ppp_synctty.c11
-rw-r--r--drivers/net/wireless/strip.c39
5 files changed, 44 insertions, 68 deletions
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
index 913a56406594..155160052c8b 100644
--- a/drivers/net/hamradio/6pack.c
+++ b/drivers/net/hamradio/6pack.c
@@ -398,14 +398,13 @@ static DEFINE_RWLOCK(disc_data_lock);
398 398
399static struct sixpack *sp_get(struct tty_struct *tty) 399static struct sixpack *sp_get(struct tty_struct *tty)
400{ 400{
401 unsigned long flags;
402 struct sixpack *sp; 401 struct sixpack *sp;
403 402
404 read_lock_irqsave(&disc_data_lock, flags); 403 read_lock(&disc_data_lock);
405 sp = tty->disc_data; 404 sp = tty->disc_data;
406 if (sp) 405 if (sp)
407 atomic_inc(&sp->refcnt); 406 atomic_inc(&sp->refcnt);
408 read_unlock_irqrestore(&disc_data_lock, flags); 407 read_unlock(&disc_data_lock);
409 408
410 return sp; 409 return sp;
411} 410}
@@ -689,13 +688,12 @@ out:
689 */ 688 */
690static void sixpack_close(struct tty_struct *tty) 689static void sixpack_close(struct tty_struct *tty)
691{ 690{
692 unsigned long flags;
693 struct sixpack *sp; 691 struct sixpack *sp;
694 692
695 write_lock_irqsave(&disc_data_lock, flags); 693 write_lock(&disc_data_lock);
696 sp = tty->disc_data; 694 sp = tty->disc_data;
697 tty->disc_data = NULL; 695 tty->disc_data = NULL;
698 write_unlock_irqrestore(&disc_data_lock, flags); 696 write_unlock(&disc_data_lock);
699 if (!sp) 697 if (!sp)
700 return; 698 return;
701 699
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
index a7286500c186..fda2fc83e9a1 100644
--- a/drivers/net/hamradio/mkiss.c
+++ b/drivers/net/hamradio/mkiss.c
@@ -244,16 +244,15 @@ static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
244/* Send one completely decapsulated AX.25 packet to the AX.25 layer. */ 244/* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
245static void ax_bump(struct mkiss *ax) 245static void ax_bump(struct mkiss *ax)
246{ 246{
247 unsigned long flags;
248 struct sk_buff *skb; 247 struct sk_buff *skb;
249 int count; 248 int count;
250 249
251 spin_lock_irqsave(&ax->buflock, flags); 250 spin_lock_bh(&ax->buflock);
252 if (ax->rbuff[0] > 0x0f) { 251 if (ax->rbuff[0] > 0x0f) {
253 if (ax->rbuff[0] & 0x80) { 252 if (ax->rbuff[0] & 0x80) {
254 if (check_crc_16(ax->rbuff, ax->rcount) < 0) { 253 if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
255 ax->dev->stats.rx_errors++; 254 ax->dev->stats.rx_errors++;
256 spin_unlock_irqrestore(&ax->buflock, flags); 255 spin_unlock_bh(&ax->buflock);
257 256
258 return; 257 return;
259 } 258 }
@@ -268,7 +267,7 @@ static void ax_bump(struct mkiss *ax)
268 } else if (ax->rbuff[0] & 0x20) { 267 } else if (ax->rbuff[0] & 0x20) {
269 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) { 268 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
270 ax->dev->stats.rx_errors++; 269 ax->dev->stats.rx_errors++;
271 spin_unlock_irqrestore(&ax->buflock, flags); 270 spin_unlock_bh(&ax->buflock);
272 return; 271 return;
273 } 272 }
274 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) { 273 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
@@ -295,7 +294,7 @@ static void ax_bump(struct mkiss *ax)
295 printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n", 294 printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
296 ax->dev->name); 295 ax->dev->name);
297 ax->dev->stats.rx_dropped++; 296 ax->dev->stats.rx_dropped++;
298 spin_unlock_irqrestore(&ax->buflock, flags); 297 spin_unlock_bh(&ax->buflock);
299 return; 298 return;
300 } 299 }
301 300
@@ -304,13 +303,11 @@ static void ax_bump(struct mkiss *ax)
304 netif_rx(skb); 303 netif_rx(skb);
305 ax->dev->stats.rx_packets++; 304 ax->dev->stats.rx_packets++;
306 ax->dev->stats.rx_bytes += count; 305 ax->dev->stats.rx_bytes += count;
307 spin_unlock_irqrestore(&ax->buflock, flags); 306 spin_unlock_bh(&ax->buflock);
308} 307}
309 308
310static void kiss_unesc(struct mkiss *ax, unsigned char s) 309static void kiss_unesc(struct mkiss *ax, unsigned char s)
311{ 310{
312 unsigned long flags;
313
314 switch (s) { 311 switch (s) {
315 case END: 312 case END:
316 /* drop keeptest bit = VSV */ 313 /* drop keeptest bit = VSV */
@@ -337,18 +334,18 @@ static void kiss_unesc(struct mkiss *ax, unsigned char s)
337 break; 334 break;
338 } 335 }
339 336
340 spin_lock_irqsave(&ax->buflock, flags); 337 spin_lock_bh(&ax->buflock);
341 if (!test_bit(AXF_ERROR, &ax->flags)) { 338 if (!test_bit(AXF_ERROR, &ax->flags)) {
342 if (ax->rcount < ax->buffsize) { 339 if (ax->rcount < ax->buffsize) {
343 ax->rbuff[ax->rcount++] = s; 340 ax->rbuff[ax->rcount++] = s;
344 spin_unlock_irqrestore(&ax->buflock, flags); 341 spin_unlock_bh(&ax->buflock);
345 return; 342 return;
346 } 343 }
347 344
348 ax->dev->stats.rx_over_errors++; 345 ax->dev->stats.rx_over_errors++;
349 set_bit(AXF_ERROR, &ax->flags); 346 set_bit(AXF_ERROR, &ax->flags);
350 } 347 }
351 spin_unlock_irqrestore(&ax->buflock, flags); 348 spin_unlock_bh(&ax->buflock);
352} 349}
353 350
354static int ax_set_mac_address(struct net_device *dev, void *addr) 351static int ax_set_mac_address(struct net_device *dev, void *addr)
@@ -370,7 +367,6 @@ static void ax_changedmtu(struct mkiss *ax)
370{ 367{
371 struct net_device *dev = ax->dev; 368 struct net_device *dev = ax->dev;
372 unsigned char *xbuff, *rbuff, *oxbuff, *orbuff; 369 unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
373 unsigned long flags;
374 int len; 370 int len;
375 371
376 len = dev->mtu * 2; 372 len = dev->mtu * 2;
@@ -396,7 +392,7 @@ static void ax_changedmtu(struct mkiss *ax)
396 return; 392 return;
397 } 393 }
398 394
399 spin_lock_irqsave(&ax->buflock, flags); 395 spin_lock_bh(&ax->buflock);
400 396
401 oxbuff = ax->xbuff; 397 oxbuff = ax->xbuff;
402 ax->xbuff = xbuff; 398 ax->xbuff = xbuff;
@@ -427,7 +423,7 @@ static void ax_changedmtu(struct mkiss *ax)
427 ax->mtu = dev->mtu + 73; 423 ax->mtu = dev->mtu + 73;
428 ax->buffsize = len; 424 ax->buffsize = len;
429 425
430 spin_unlock_irqrestore(&ax->buflock, flags); 426 spin_unlock_bh(&ax->buflock);
431 427
432 kfree(oxbuff); 428 kfree(oxbuff);
433 kfree(orbuff); 429 kfree(orbuff);
@@ -437,7 +433,6 @@ static void ax_changedmtu(struct mkiss *ax)
437static void ax_encaps(struct net_device *dev, unsigned char *icp, int len) 433static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
438{ 434{
439 struct mkiss *ax = netdev_priv(dev); 435 struct mkiss *ax = netdev_priv(dev);
440 unsigned long flags;
441 unsigned char *p; 436 unsigned char *p;
442 int actual, count; 437 int actual, count;
443 438
@@ -454,7 +449,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
454 449
455 p = icp; 450 p = icp;
456 451
457 spin_lock_irqsave(&ax->buflock, flags); 452 spin_lock_bh(&ax->buflock);
458 if ((*p & 0x0f) != 0) { 453 if ((*p & 0x0f) != 0) {
459 /* Configuration Command (kissparms(1). 454 /* Configuration Command (kissparms(1).
460 * Protocol spec says: never append CRC. 455 * Protocol spec says: never append CRC.
@@ -484,7 +479,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
484 ax->crcauto = (cmd ? 0 : 1); 479 ax->crcauto = (cmd ? 0 : 1);
485 printk(KERN_INFO "mkiss: %s: crc mode %s %d\n", ax->dev->name, (len) ? "set to" : "is", cmd); 480 printk(KERN_INFO "mkiss: %s: crc mode %s %d\n", ax->dev->name, (len) ? "set to" : "is", cmd);
486 } 481 }
487 spin_unlock_irqrestore(&ax->buflock, flags); 482 spin_unlock_bh(&ax->buflock);
488 netif_start_queue(dev); 483 netif_start_queue(dev);
489 484
490 return; 485 return;
@@ -517,7 +512,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
517 count = kiss_esc(p, (unsigned char *)ax->xbuff, len); 512 count = kiss_esc(p, (unsigned char *)ax->xbuff, len);
518 } 513 }
519 } 514 }
520 spin_unlock_irqrestore(&ax->buflock, flags); 515 spin_unlock_bh(&ax->buflock);
521 516
522 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags); 517 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
523 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count); 518 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
@@ -709,14 +704,13 @@ static DEFINE_RWLOCK(disc_data_lock);
709 704
710static struct mkiss *mkiss_get(struct tty_struct *tty) 705static struct mkiss *mkiss_get(struct tty_struct *tty)
711{ 706{
712 unsigned long flags;
713 struct mkiss *ax; 707 struct mkiss *ax;
714 708
715 read_lock_irqsave(&disc_data_lock, flags); 709 read_lock(&disc_data_lock);
716 ax = tty->disc_data; 710 ax = tty->disc_data;
717 if (ax) 711 if (ax)
718 atomic_inc(&ax->refcnt); 712 atomic_inc(&ax->refcnt);
719 read_unlock_irqrestore(&disc_data_lock, flags); 713 read_unlock(&disc_data_lock);
720 714
721 return ax; 715 return ax;
722} 716}
@@ -815,13 +809,12 @@ out:
815 809
816static void mkiss_close(struct tty_struct *tty) 810static void mkiss_close(struct tty_struct *tty)
817{ 811{
818 unsigned long flags;
819 struct mkiss *ax; 812 struct mkiss *ax;
820 813
821 write_lock_irqsave(&disc_data_lock, flags); 814 write_lock(&disc_data_lock);
822 ax = tty->disc_data; 815 ax = tty->disc_data;
823 tty->disc_data = NULL; 816 tty->disc_data = NULL;
824 write_unlock_irqrestore(&disc_data_lock, flags); 817 write_unlock(&disc_data_lock);
825 818
826 if (!ax) 819 if (!ax)
827 return; 820 return;
diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c
index 1fd319bf758e..17c116bb332c 100644
--- a/drivers/net/ppp_async.c
+++ b/drivers/net/ppp_async.c
@@ -132,15 +132,13 @@ static DEFINE_RWLOCK(disc_data_lock);
132 132
133static struct asyncppp *ap_get(struct tty_struct *tty) 133static struct asyncppp *ap_get(struct tty_struct *tty)
134{ 134{
135 unsigned long flags;
136 struct asyncppp *ap; 135 struct asyncppp *ap;
137 136
138 read_lock_irqsave(&disc_data_lock, flags); 137 read_lock(&disc_data_lock);
139 ap = tty->disc_data; 138 ap = tty->disc_data;
140 if (ap != NULL) 139 if (ap != NULL)
141 atomic_inc(&ap->refcnt); 140 atomic_inc(&ap->refcnt);
142 read_unlock_irqrestore(&disc_data_lock, flags); 141 read_unlock(&disc_data_lock);
143
144 return ap; 142 return ap;
145} 143}
146 144
@@ -217,13 +215,12 @@ ppp_asynctty_open(struct tty_struct *tty)
217static void 215static void
218ppp_asynctty_close(struct tty_struct *tty) 216ppp_asynctty_close(struct tty_struct *tty)
219{ 217{
220 unsigned long flags;
221 struct asyncppp *ap; 218 struct asyncppp *ap;
222 219
223 write_lock_irqsave(&disc_data_lock, flags); 220 write_lock_irq(&disc_data_lock);
224 ap = tty->disc_data; 221 ap = tty->disc_data;
225 tty->disc_data = NULL; 222 tty->disc_data = NULL;
226 write_unlock_irqrestore(&disc_data_lock, flags); 223 write_unlock_irq(&disc_data_lock);
227 if (!ap) 224 if (!ap)
228 return; 225 return;
229 226
diff --git a/drivers/net/ppp_synctty.c b/drivers/net/ppp_synctty.c
index 1b3f75febee1..aa3d39f38e22 100644
--- a/drivers/net/ppp_synctty.c
+++ b/drivers/net/ppp_synctty.c
@@ -182,15 +182,13 @@ static DEFINE_RWLOCK(disc_data_lock);
182 182
183static struct syncppp *sp_get(struct tty_struct *tty) 183static struct syncppp *sp_get(struct tty_struct *tty)
184{ 184{
185 unsigned long flags;
186 struct syncppp *ap; 185 struct syncppp *ap;
187 186
188 read_lock_irqsave(&disc_data_lock, flags); 187 read_lock(&disc_data_lock);
189 ap = tty->disc_data; 188 ap = tty->disc_data;
190 if (ap != NULL) 189 if (ap != NULL)
191 atomic_inc(&ap->refcnt); 190 atomic_inc(&ap->refcnt);
192 read_unlock_irqrestore(&disc_data_lock, flags); 191 read_unlock(&disc_data_lock);
193
194 return ap; 192 return ap;
195} 193}
196 194
@@ -264,13 +262,12 @@ ppp_sync_open(struct tty_struct *tty)
264static void 262static void
265ppp_sync_close(struct tty_struct *tty) 263ppp_sync_close(struct tty_struct *tty)
266{ 264{
267 unsigned long flags;
268 struct syncppp *ap; 265 struct syncppp *ap;
269 266
270 write_lock_irqsave(&disc_data_lock, flags); 267 write_lock_irq(&disc_data_lock);
271 ap = tty->disc_data; 268 ap = tty->disc_data;
272 tty->disc_data = NULL; 269 tty->disc_data = NULL;
273 write_unlock_irqrestore(&disc_data_lock, flags); 270 write_unlock_irq(&disc_data_lock);
274 if (!ap) 271 if (!ap)
275 return; 272 return;
276 273
diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c
index 3d39f6587eb9..38366a56b71f 100644
--- a/drivers/net/wireless/strip.c
+++ b/drivers/net/wireless/strip.c
@@ -856,7 +856,6 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
856 unsigned char *orbuff = strip_info->rx_buff; 856 unsigned char *orbuff = strip_info->rx_buff;
857 unsigned char *osbuff = strip_info->sx_buff; 857 unsigned char *osbuff = strip_info->sx_buff;
858 unsigned char *otbuff = strip_info->tx_buff; 858 unsigned char *otbuff = strip_info->tx_buff;
859 unsigned long flags;
860 859
861 if (new_mtu > MAX_SEND_MTU) { 860 if (new_mtu > MAX_SEND_MTU) {
862 printk(KERN_ERR 861 printk(KERN_ERR
@@ -865,11 +864,11 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
865 return -EINVAL; 864 return -EINVAL;
866 } 865 }
867 866
868 spin_lock_irqsave(&strip_lock, flags); 867 spin_lock_bh(&strip_lock);
869 if (!allocate_buffers(strip_info, new_mtu)) { 868 if (!allocate_buffers(strip_info, new_mtu)) {
870 printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n", 869 printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n",
871 strip_info->dev->name); 870 strip_info->dev->name);
872 spin_unlock_irqrestore(&strip_lock, flags); 871 spin_unlock_bh(&strip_lock);
873 return -ENOMEM; 872 return -ENOMEM;
874 } 873 }
875 874
@@ -893,7 +892,7 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
893 } 892 }
894 } 893 }
895 strip_info->tx_head = strip_info->tx_buff; 894 strip_info->tx_head = strip_info->tx_buff;
896 spin_unlock_irqrestore(&strip_lock, flags); 895 spin_unlock_bh(&strip_lock);
897 896
898 printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n", 897 printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n",
899 strip_info->dev->name, old_mtu, strip_info->mtu); 898 strip_info->dev->name, old_mtu, strip_info->mtu);
@@ -984,13 +983,10 @@ static void strip_seq_neighbours(struct seq_file *seq,
984 const MetricomNodeTable * table, 983 const MetricomNodeTable * table,
985 const char *title) 984 const char *title)
986{ 985{
987 unsigned long flags; 986 /* We wrap this in a do/while loop, so if the table changes */
987 /* while we're reading it, we just go around and try again. */
988 struct timeval t; 988 struct timeval t;
989 989
990 /*
991 * We wrap this in a do/while loop, so if the table changes
992 * while we're reading it, we just go around and try again.
993 */
994 do { 990 do {
995 int i; 991 int i;
996 t = table->timestamp; 992 t = table->timestamp;
@@ -999,9 +995,9 @@ static void strip_seq_neighbours(struct seq_file *seq,
999 for (i = 0; i < table->num_nodes; i++) { 995 for (i = 0; i < table->num_nodes; i++) {
1000 MetricomNode node; 996 MetricomNode node;
1001 997
1002 spin_lock_irqsave(&strip_lock, flags); 998 spin_lock_bh(&strip_lock);
1003 node = table->node[i]; 999 node = table->node[i];
1004 spin_unlock_irqrestore(&strip_lock, flags); 1000 spin_unlock_bh(&strip_lock);
1005 seq_printf(seq, " %s\n", node.c); 1001 seq_printf(seq, " %s\n", node.c);
1006 } 1002 }
1007 } while (table->timestamp.tv_sec != t.tv_sec 1003 } while (table->timestamp.tv_sec != t.tv_sec
@@ -1540,7 +1536,6 @@ static void strip_send(struct strip *strip_info, struct sk_buff *skb)
1540static int strip_xmit(struct sk_buff *skb, struct net_device *dev) 1536static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
1541{ 1537{
1542 struct strip *strip_info = netdev_priv(dev); 1538 struct strip *strip_info = netdev_priv(dev);
1543 unsigned long flags;
1544 1539
1545 if (!netif_running(dev)) { 1540 if (!netif_running(dev)) {
1546 printk(KERN_ERR "%s: xmit call when iface is down\n", 1541 printk(KERN_ERR "%s: xmit call when iface is down\n",
@@ -1579,11 +1574,11 @@ static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
1579 strip_info->dev->name, sx_pps_count / 8); 1574 strip_info->dev->name, sx_pps_count / 8);
1580 } 1575 }
1581 1576
1582 spin_lock_irqsave(&strip_lock, flags); 1577 spin_lock_bh(&strip_lock);
1583 1578
1584 strip_send(strip_info, skb); 1579 strip_send(strip_info, skb);
1585 1580
1586 spin_unlock_irqrestore(&strip_lock, flags); 1581 spin_unlock_bh(&strip_lock);
1587 1582
1588 if (skb) 1583 if (skb)
1589 dev_kfree_skb(skb); 1584 dev_kfree_skb(skb);
@@ -2268,13 +2263,12 @@ static void strip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
2268{ 2263{
2269 struct strip *strip_info = tty->disc_data; 2264 struct strip *strip_info = tty->disc_data;
2270 const unsigned char *end = cp + count; 2265 const unsigned char *end = cp + count;
2271 unsigned long flags;
2272 2266
2273 if (!strip_info || strip_info->magic != STRIP_MAGIC 2267 if (!strip_info || strip_info->magic != STRIP_MAGIC
2274 || !netif_running(strip_info->dev)) 2268 || !netif_running(strip_info->dev))
2275 return; 2269 return;
2276 2270
2277 spin_lock_irqsave(&strip_lock, flags); 2271 spin_lock_bh(&strip_lock);
2278#if 0 2272#if 0
2279 { 2273 {
2280 struct timeval tv; 2274 struct timeval tv;
@@ -2341,7 +2335,7 @@ static void strip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
2341 } 2335 }
2342 cp++; 2336 cp++;
2343 } 2337 }
2344 spin_unlock_irqrestore(&strip_lock, flags); 2338 spin_unlock_bh(&strip_lock);
2345} 2339}
2346 2340
2347 2341
@@ -2529,11 +2523,9 @@ static void strip_dev_setup(struct net_device *dev)
2529 2523
2530static void strip_free(struct strip *strip_info) 2524static void strip_free(struct strip *strip_info)
2531{ 2525{
2532 unsigned long flags; 2526 spin_lock_bh(&strip_lock);
2533
2534 spin_lock_irqsave(&strip_lock, flags);
2535 list_del_rcu(&strip_info->list); 2527 list_del_rcu(&strip_info->list);
2536 spin_unlock_irqrestore(&strip_lock, flags); 2528 spin_unlock_bh(&strip_lock);
2537 2529
2538 strip_info->magic = 0; 2530 strip_info->magic = 0;
2539 2531
@@ -2547,7 +2539,6 @@ static void strip_free(struct strip *strip_info)
2547static struct strip *strip_alloc(void) 2539static struct strip *strip_alloc(void)
2548{ 2540{
2549 struct list_head *n; 2541 struct list_head *n;
2550 unsigned long flags;
2551 struct net_device *dev; 2542 struct net_device *dev;
2552 struct strip *strip_info; 2543 struct strip *strip_info;
2553 2544
@@ -2571,7 +2562,7 @@ static struct strip *strip_alloc(void)
2571 strip_info->idle_timer.function = strip_IdleTask; 2562 strip_info->idle_timer.function = strip_IdleTask;
2572 2563
2573 2564
2574 spin_lock_irqsave(&strip_lock, flags); 2565 spin_lock_bh(&strip_lock);
2575 rescan: 2566 rescan:
2576 /* 2567 /*
2577 * Search the list to find where to put our new entry 2568 * Search the list to find where to put our new entry
@@ -2590,7 +2581,7 @@ static struct strip *strip_alloc(void)
2590 sprintf(dev->name, "st%ld", dev->base_addr); 2581 sprintf(dev->name, "st%ld", dev->base_addr);
2591 2582
2592 list_add_tail_rcu(&strip_info->list, &strip_list); 2583 list_add_tail_rcu(&strip_info->list, &strip_list);
2593 spin_unlock_irqrestore(&strip_lock, flags); 2584 spin_unlock_bh(&strip_lock);
2594 2585
2595 return strip_info; 2586 return strip_info;
2596} 2587}