===== include/linux/inetdevice.h 1.14 vs edited ===== --- 1.14/include/linux/inetdevice.h 2004-08-14 07:43:21 +10:00 +++ edited/include/linux/inetdevice.h 2004-08-14 07:48:59 +10:00 @@ -163,16 +163,10 @@ extern void in_dev_finish_destroy(struct in_device *idev); -static inline void in_dev_rcu_destroy(struct rcu_head *head) -{ - struct in_device *idev = container_of(head, struct in_device, rcu_head); - in_dev_finish_destroy(idev); -} - static inline void in_dev_put(struct in_device *idev) { if (atomic_dec_and_test(&idev->refcnt)) - call_rcu(&idev->rcu_head, in_dev_rcu_destroy); + in_dev_finish_destroy(idev); } #define __in_dev_put(idev) atomic_dec(&(idev)->refcnt) ===== net/ipv4/devinet.c 1.33 vs edited ===== --- 1.33/net/ipv4/devinet.c 2004-08-14 07:43:21 +10:00 +++ edited/net/ipv4/devinet.c 2004-08-14 07:49:51 +10:00 @@ -177,6 +177,12 @@ goto out; } +static void in_dev_rcu_put(struct rcu_head *head) +{ + struct in_device *idev = container_of(head, struct in_device, rcu_head); + in_dev_put(idev); +} + static void inetdev_destroy(struct in_device *in_dev) { struct in_ifaddr *ifa; @@ -204,7 +210,7 @@ neigh_sysctl_unregister(in_dev->arp_parms); #endif neigh_parms_release(&arp_tbl, in_dev->arp_parms); - in_dev_put(in_dev); + call_rcu(&idev->rcu_head, in_dev_rcu_put); } int inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b)