static void if_recalc_preferred(struct iface *i);
+static void ifa_delete_locked(struct ifa *a);
+
static void ifa_dump_locked(struct ifa *);
static void if_dump_locked(struct iface *);
{
WALK_LIST_DELSAFE(a, b, i->addrs)
if (!(a->flags & IA_UPDATED))
- ifa_delete(a);
+ ifa_delete_locked(a);
if_end_partial_update_locked(i);
}
}
IFACE_UNLOCK;
return b;
}
- ifa_delete(b);
+ ifa_delete_locked(b);
break;
}
void
ifa_delete(struct ifa *a)
{
+ IFACE_LOCK;
+ ifa_delete_locked(a);
+ IFACE_UNLOCK;
+}
+
+static void
+ifa_delete_locked(struct ifa *a)
+{
+ IFACE_ASSERT_LOCKED;
+
struct iface *i = a->iface;
struct ifa *b;
- IFACE_LOCK;
-
WALK_LIST(b, i->addrs)
if (ifa_same(b, a))
{
ifa_notify_change(IF_CHANGE_DOWN, b);
ifa_unlink(b);
- IFACE_UNLOCK;
return;
}
-
- IFACE_UNLOCK;
}
u32