summaryrefslogtreecommitdiff
path: root/sys/src/9/ip/nullmedium.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-02-16 22:31:31 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-02-16 22:31:31 +0000
commit7289f371a0b113c12add274c4d4aa84d0c147dee (patch)
treecaaadea3c6dff299367b9079558141efc2f1ea65 /sys/src/9/ip/nullmedium.c
parent755880b19f365c3f98eac5c7de1d8b25f773ace3 (diff)
devip: dont hold ifc wlock during medium bind/unbind
Wlock()'ing the ifc causes a deadlock with Medium bind/unbind as the routine can walk /net, while ndb/dns or ndb/cs are currently blocked enumerating /net/ipifc/*. The fix is to have a fake medium, called "unbound", that is set temporarily during the call of Medium bind and unbind. That way, the interface rwlock can be released while bind/unbind is in progress. The ipifcunbind() routine will refuse to unbind a ifc that is currently assigned to the "unbound" medium, preventing any accidents.
Diffstat (limited to 'sys/src/9/ip/nullmedium.c')
-rw-r--r--sys/src/9/ip/nullmedium.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/src/9/ip/nullmedium.c b/sys/src/9/ip/nullmedium.c
index 094e103f6..3874da583 100644
--- a/sys/src/9/ip/nullmedium.c
+++ b/sys/src/9/ip/nullmedium.c
@@ -33,6 +33,15 @@ Medium nullmedium =
.bwrite= nullbwrite,
};
+/* used in ipifc to prevent unbind while bind is in progress */
+Medium unboundmedium =
+{
+.name= "unbound",
+.bind= nullbind,
+.unbind= nullunbind,
+.bwrite= nullbwrite,
+};
+
void
nullmediumlink(void)
{