]> git.hungrycats.org Git - linux/commitdiff
[PATCH] cli_sti in drivers_net_hamradio_bpqether.c
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 13 Jan 2003 12:12:38 +0000 (04:12 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Mon, 13 Jan 2003 12:12:38 +0000 (04:12 -0800)
From:  Chris Wilson <chris@qwirx.com>

  As part of the Linux Kernel Janitors project, I would like to submit my
  patch for bpqether.c.

  The document Documentation/cli-sti-removal.txt says that cli() should no
  longer be used to disable interrupts. This patch removes all references to
  cli() and {save,restore}_flags.

  - added a static spinlock to protect bpq_devices
  - changed cli/sti and {save,restore}_flags to taking the spinlock and
    disabling interrupts with spin_lock_irqsave
  - included my previous patch for proc_net_create, but as a separate hunk,
    so if you've already applied then just ignore the rejected hunk.

  I have verified that the patched driver compiles without warnings, but
  since I don't have the hardware I can't test it. Please treat with
  caution.

drivers/net/hamradio/bpqether.c

index 44013aaf56662b4e4cd1968bea3bd714bc9e3cc1..a39d714f0a9b7c49214b30447fcb6c397cc5fbe0 100644 (file)
@@ -159,6 +159,8 @@ static inline int dev_is_ethdev(struct net_device *dev)
        );
 }
 
+static spinlock_t bpq_lock = SPIN_LOCK_UNLOCKED;
+
 /*
  *     Sanity check: remove all devices that ceased to exists and
  *     return '1' if the given BPQ device was affected.
@@ -169,8 +171,7 @@ static int bpq_check_devices(struct net_device *dev)
        int result = 0;
        unsigned long flags;
 
-       save_flags(flags);
-       cli();
+       spin_lock_irqsave(&bpq_lock, flags);
 
        bpq_prev = NULL;
 
@@ -196,7 +197,7 @@ static int bpq_check_devices(struct net_device *dev)
                        bpq_prev = bpq;
        }
 
-       restore_flags(flags);
+       spin_unlock_irqrestore(&bpq_lock, flags);
 
        return result;
 }
@@ -446,8 +447,9 @@ static int bpq_get_info(char *buffer, char **start, off_t offset, int length)
        int len     = 0;
        off_t pos   = 0;
        off_t begin = 0;
+       unsigned long flags;
 
-       cli();
+       spin_lock_irqsave(&bpq_lock, flags);
 
        len += sprintf(buffer, "dev   ether      destination        accept from\n");
 
@@ -470,7 +472,7 @@ static int bpq_get_info(char *buffer, char **start, off_t offset, int length)
                        break;
        }
 
-       sti();
+       spin_unlock_irqrestore(&bpq_lock, flags);
 
        *start = buffer + (offset - begin);
        len   -= (offset - begin);
@@ -491,6 +493,7 @@ static int bpq_new_device(struct net_device *dev)
 {
        int k;
        struct bpqdev *bpq, *bpq2;
+       unsigned long flags;
 
        if ((bpq = kmalloc(sizeof(struct bpqdev), GFP_KERNEL)) == NULL)
                return -ENOMEM;
@@ -553,7 +556,7 @@ static int bpq_new_device(struct net_device *dev)
        dev->mtu             = AX25_DEF_PACLEN;
        dev->addr_len        = AX25_ADDR_LEN;
 
-       cli();
+       spin_lock_irqsave(&bpq_lock, flags);
 
        if (bpq_devices == NULL) {
                bpq_devices = bpq;
@@ -562,7 +565,7 @@ static int bpq_new_device(struct net_device *dev)
                bpq2->next = bpq;
        }
 
-       sti();
+       spin_unlock_irqrestore(&bpq_lock, flags);
 
        return 0;
 }
@@ -615,7 +618,13 @@ static int __init bpq_init_driver(void)
 
        printk(banner);
 
-       proc_net_create("bpqether", 0, bpq_get_info);
+       if (!proc_net_create("bpqether", 0, bpq_get_info)) {
+               printk(KERN_ERR
+                       "bpq: cannot create /proc/net/bpqether entry.\n");
+               unregister_netdevice_notifier(&bpq_dev_notifier);
+               dev_remove_pack(&bpq_packet_type);
+               return -ENOENT;
+       }
 
        read_lock_bh(&dev_base_lock);
        for (dev = dev_base; dev != NULL; dev = dev->next) {