Commit 4f494554 authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller

[NEIGH]: Combine neighbour cleanup and release

Introduces neigh_cleanup_and_release() to be used after a
neighbour has been removed from its neighbour table. Serves
as preparation to add event notifications.
Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e6e9342
...@@ -105,6 +105,14 @@ static int neigh_blackhole(struct sk_buff *skb) ...@@ -105,6 +105,14 @@ static int neigh_blackhole(struct sk_buff *skb)
return -ENETDOWN; return -ENETDOWN;
} }
static void neigh_cleanup_and_release(struct neighbour *neigh)
{
if (neigh->parms->neigh_cleanup)
neigh->parms->neigh_cleanup(neigh);
neigh_release(neigh);
}
/* /*
* It is random distribution in the interval (1/2)*base...(3/2)*base. * It is random distribution in the interval (1/2)*base...(3/2)*base.
* It corresponds to default IPv6 settings and is not overridable, * It corresponds to default IPv6 settings and is not overridable,
...@@ -141,9 +149,7 @@ static int neigh_forced_gc(struct neigh_table *tbl) ...@@ -141,9 +149,7 @@ static int neigh_forced_gc(struct neigh_table *tbl)
n->dead = 1; n->dead = 1;
shrunk = 1; shrunk = 1;
write_unlock(&n->lock); write_unlock(&n->lock);
if (n->parms->neigh_cleanup) neigh_cleanup_and_release(n);
n->parms->neigh_cleanup(n);
neigh_release(n);
continue; continue;
} }
write_unlock(&n->lock); write_unlock(&n->lock);
...@@ -214,9 +220,7 @@ static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev) ...@@ -214,9 +220,7 @@ static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
NEIGH_PRINTK2("neigh %p is stray.\n", n); NEIGH_PRINTK2("neigh %p is stray.\n", n);
} }
write_unlock(&n->lock); write_unlock(&n->lock);
if (n->parms->neigh_cleanup) neigh_cleanup_and_release(n);
n->parms->neigh_cleanup(n);
neigh_release(n);
} }
} }
} }
...@@ -677,9 +681,7 @@ static void neigh_periodic_timer(unsigned long arg) ...@@ -677,9 +681,7 @@ static void neigh_periodic_timer(unsigned long arg)
*np = n->next; *np = n->next;
n->dead = 1; n->dead = 1;
write_unlock(&n->lock); write_unlock(&n->lock);
if (n->parms->neigh_cleanup) neigh_cleanup_and_release(n);
n->parms->neigh_cleanup(n);
neigh_release(n);
continue; continue;
} }
write_unlock(&n->lock); write_unlock(&n->lock);
...@@ -2095,11 +2097,8 @@ void __neigh_for_each_release(struct neigh_table *tbl, ...@@ -2095,11 +2097,8 @@ void __neigh_for_each_release(struct neigh_table *tbl,
} else } else
np = &n->next; np = &n->next;
write_unlock(&n->lock); write_unlock(&n->lock);
if (release) { if (release)
if (n->parms->neigh_cleanup) neigh_cleanup_and_release(n);
n->parms->neigh_cleanup(n);
neigh_release(n);
}
} }
} }
} }
......
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