patch-2.4.23 linux-2.4.23/net/ipv6/icmp.c
Next file: linux-2.4.23/net/ipv6/ipv6_syms.c
Previous file: linux-2.4.23/net/ipv6/af_inet6.c
Back to the patch index
Back to the overall index
- Lines: 42
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/net/ipv6/icmp.c
- Orig date:
2003-06-13 07:51:39.000000000 -0700
diff -urN linux-2.4.22/net/ipv6/icmp.c linux-2.4.23/net/ipv6/icmp.c
@@ -97,11 +97,18 @@
};
-static void icmpv6_xmit_lock(void)
+static int icmpv6_xmit_lock(void)
{
local_bh_disable();
- if (unlikely(!spin_trylock(&icmpv6_socket->sk->lock.slock)))
- BUG();
+ if (unlikely(!spin_trylock(&icmpv6_socket->sk->lock.slock))) {
+ /* This can happen if the output path (f.e. SIT or
+ * ip6ip6 tunnel) signals dst_link_failure() for an
+ * outgoing ICMP6 packet.
+ */
+ local_bh_enable();
+ return 1;
+ }
+ return 0;
}
static void icmpv6_xmit_unlock(void)
@@ -325,7 +332,8 @@
fl.uli_u.icmpt.type = type;
fl.uli_u.icmpt.code = code;
- icmpv6_xmit_lock();
+ if (icmpv6_xmit_lock())
+ return;
if (!icmpv6_xrlim_allow(sk, type, &fl))
goto out;
@@ -399,7 +407,8 @@
fl.uli_u.icmpt.type = ICMPV6_ECHO_REPLY;
fl.uli_u.icmpt.code = 0;
- icmpv6_xmit_lock();
+ if (icmpv6_xmit_lock())
+ return;
ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, msg.len, NULL, -1,
MSG_DONTWAIT);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)