From: Bill Nottingham airo creates /proc/driver/aironet/ 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 --- 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; } _