
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: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/net/wireless/airo.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff -puN drivers/net/wireless/airo.c~fix-airo-oops-on-removal drivers/net/wireless/airo.c
--- 25/drivers/net/wireless/airo.c~fix-airo-oops-on-removal	2004-07-09 02:30:35.103820928 -0700
+++ 25-akpm/drivers/net/wireless/airo.c	2004-07-09 02:30:35.112819560 -0700
@@ -1210,6 +1210,7 @@ struct airo_info {
 	APListRid		*APList;
 #define	PCI_SHARED_LEN		2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE
 	u32			pci_state[16];
+	char			proc_name[IFNAMSIZ];
 };
 
 static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen,
@@ -4368,7 +4369,8 @@ static int setup_proc_entry( struct net_
 			     struct airo_info *apriv ) {
 	struct proc_dir_entry *entry;
 	/* 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,
 					      airo_entry);
         apriv->proc_entry->uid = proc_uid;
@@ -4469,7 +4471,7 @@ static int takedown_proc_entry( struct n
 	remove_proc_entry("APList",apriv->proc_entry);
 	remove_proc_entry("BSSList",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;
 }
 
_
