diff options
author | rwatson <rwatson@FreeBSD.org> | 2009-06-22 10:23:54 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2009-06-22 10:23:54 +0000 |
commit | 5daa0c14237b29afdd8225eba0c34cc0c8238ca3 (patch) | |
tree | 8b6fd873a14e459bd3341eef4e3b417559fcfec3 /sys/netatalk/at_var.h | |
parent | 1a759a35f242325e2263831a412a94a6e90ca317 (diff) | |
download | FreeBSD-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.h | 8 |
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_ */ |