summaryrefslogtreecommitdiffstats
path: root/sys/netatalk/at_var.h
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2009-06-22 10:23:54 +0000
committerrwatson <rwatson@FreeBSD.org>2009-06-22 10:23:54 +0000
commit5daa0c14237b29afdd8225eba0c34cc0c8238ca3 (patch)
tree8b6fd873a14e459bd3341eef4e3b417559fcfec3 /sys/netatalk/at_var.h
parent1a759a35f242325e2263831a412a94a6e90ca317 (diff)
downloadFreeBSD-src-5daa0c14237b29afdd8225eba0c34cc0c8238ca3.zip
FreeBSD-src-5daa0c14237b29afdd8225eba0c34cc0c8238ca3.tar.gz
Add a global rwlock, at_ifaddr_rw, to protect the global netatalk
address lists, at_ifaddr_list. Acquire the lock, and use ifaddr refcounts where necessary, to close most known address-related races in netatalk. Annotate one potential race in at_control() where we acquire an ifaddr reference, drop the global lock, and scrub the address from the ifnet before re-acquiring the global lock, which could allow for a writer-writer race. MFC after: 3 weeks
Diffstat (limited to 'sys/netatalk/at_var.h')
-rw-r--r--sys/netatalk/at_var.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/netatalk/at_var.h b/sys/netatalk/at_var.h
index 0ad1334..3ab73a2 100644
--- a/sys/netatalk/at_var.h
+++ b/sys/netatalk/at_var.h
@@ -61,7 +61,15 @@ struct at_aliasreq {
#define AFA_PHASE2 0x0004
#ifdef _KERNEL
+extern struct rwlock at_ifaddr_rw;
extern struct at_ifaddr *at_ifaddr_list;
+
+#define AT_IFADDR_LOCK_INIT() rw_init(&at_ifaddr_rw, "at_ifaddr_rw")
+#define AT_IFADDR_LOCK_ASSERT() rw_assert(&at_ifaddr_rw, RA_LOCKED)
+#define AT_IFADDR_RLOCK() rw_rlock(&at_ifaddr_rw)
+#define AT_IFADDR_RUNLOCK() rw_runlock(&at_ifaddr_rw)
+#define AT_IFADDR_WLOCK() rw_wlock(&at_ifaddr_rw)
+#define AT_IFADDR_WUNLOCK() rw_wunlock(&at_ifaddr_rw)
#endif
#endif /* _NETATALK_AT_VAR_H_ */
OpenPOWER on IntegriCloud