Commit a4c553ed authored by Andrew Morton's avatar Andrew Morton Committed by Jeff Garzik

[PATCH] fix airo oops-on-removal

From: Bill Nottingham <notting@redhat.com>

airo creates /proc/driver/aironet/<device name> on device activation.
However, the device can be renamed - then on teardown it tries to remove
the wrong directory.  The removal of /proc/driver/aironet then runs afoul
of the BUG_ON() in remove_proc_entry.

This fixes it by keeping a copy of the name of the directory it created.

(It doesn't actually solve the problem of the stats directory still being
/proc/driver/aironet/eth0 when you rename the device to, say, 'joe'.  But
that patch would be a little less trivial.)
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
parent 94730894
...@@ -1210,6 +1210,7 @@ struct airo_info { ...@@ -1210,6 +1210,7 @@ struct airo_info {
APListRid *APList; APListRid *APList;
#define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE #define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE
u32 pci_state[16]; u32 pci_state[16];
char proc_name[IFNAMSIZ];
}; };
static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen, static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen,
...@@ -4369,7 +4370,8 @@ static int setup_proc_entry( struct net_device *dev, ...@@ -4369,7 +4370,8 @@ static int setup_proc_entry( struct net_device *dev,
struct airo_info *apriv ) { struct airo_info *apriv ) {
struct proc_dir_entry *entry; struct proc_dir_entry *entry;
/* First setup the device directory */ /* First setup the device directory */
apriv->proc_entry = create_proc_entry(dev->name, strcpy(apriv->proc_name,dev->name);
apriv->proc_entry = create_proc_entry(apriv->proc_name,
S_IFDIR|airo_perm, S_IFDIR|airo_perm,
airo_entry); airo_entry);
apriv->proc_entry->uid = proc_uid; apriv->proc_entry->uid = proc_uid;
...@@ -4470,7 +4472,7 @@ static int takedown_proc_entry( struct net_device *dev, ...@@ -4470,7 +4472,7 @@ static int takedown_proc_entry( struct net_device *dev,
remove_proc_entry("APList",apriv->proc_entry); remove_proc_entry("APList",apriv->proc_entry);
remove_proc_entry("BSSList",apriv->proc_entry); remove_proc_entry("BSSList",apriv->proc_entry);
remove_proc_entry("WepKey",apriv->proc_entry); remove_proc_entry("WepKey",apriv->proc_entry);
remove_proc_entry(dev->name,airo_entry); remove_proc_entry(apriv->proc_name,airo_entry);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment