From a26ee9422b3dd49a0146ab2eec3f21acf30e399c Mon Sep 17 00:00:00 2001 From: pjd Date: Mon, 9 Apr 2007 01:05:31 +0000 Subject: Instead of detecting if lock is already initialized based on standard 1 bit check, use more accurate 13 bits check. We had too many false-positives with the standard check. Reported by: mlaier --- sys/cddl/compat/opensolaris/sys/lock.h | 46 ++++++++++++++++++++++++++++++++ sys/cddl/compat/opensolaris/sys/mutex.h | 3 +++ sys/cddl/compat/opensolaris/sys/rwlock.h | 8 ++++-- sys/compat/opensolaris/sys/lock.h | 46 ++++++++++++++++++++++++++++++++ sys/compat/opensolaris/sys/mutex.h | 3 +++ sys/compat/opensolaris/sys/rwlock.h | 8 ++++-- 6 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 sys/cddl/compat/opensolaris/sys/lock.h create mode 100644 sys/compat/opensolaris/sys/lock.h (limited to 'sys') diff --git a/sys/cddl/compat/opensolaris/sys/lock.h b/sys/cddl/compat/opensolaris/sys/lock.h new file mode 100644 index 0000000..51fcd67 --- /dev/null +++ b/sys/cddl/compat/opensolaris/sys/lock.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2007 Pawel Jakub Dawidek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _OPENSOLARIS_SYS_LOCK_H_ +#define _OPENSOLARIS_SYS_LOCK_H_ + +#include_next + +#ifdef _KERNEL + +#define LO_ALLMASK (LO_INITIALIZED | LO_WITNESS | LO_QUIET | \ + LO_RECURSABLE | LO_SLEEPABLE | LO_UPGRADABLE | \ + LO_DUPOK | LO_ENROLLPEND | LO_CLASSMASK | \ + LO_NOPROFILE) +#define LO_EXPECTED (LO_INITIALIZED | LO_WITNESS | LO_RECURSABLE | \ + LO_SLEEPABLE | LO_UPGRADABLE | LO_DUPOK | \ + /* sx lock class */(2 << LO_CLASSSHIFT)) + +#endif /* defined(_KERNEL) */ + +#endif /* _OPENSOLARIS_SYS_LOCK_H_ */ diff --git a/sys/cddl/compat/opensolaris/sys/mutex.h b/sys/cddl/compat/opensolaris/sys/mutex.h index 14e69c4..dac7249 100644 --- a/sys/cddl/compat/opensolaris/sys/mutex.h +++ b/sys/cddl/compat/opensolaris/sys/mutex.h @@ -48,6 +48,9 @@ typedef struct sx kmutex_t; #define mutex_init(lock, desc, type, arg) do { \ ASSERT((type) == MUTEX_DEFAULT); \ + KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \ + LO_EXPECTED, ("lock %s already initialized", #lock)); \ + bzero((lock), sizeof(struct sx)); \ sx_init_flags((lock), "zfs:" #lock, SX_DUPOK); \ } while (0) #define mutex_destroy(lock) sx_destroy(lock) diff --git a/sys/cddl/compat/opensolaris/sys/rwlock.h b/sys/cddl/compat/opensolaris/sys/rwlock.h index 638ca84..6facd7a 100644 --- a/sys/cddl/compat/opensolaris/sys/rwlock.h +++ b/sys/cddl/compat/opensolaris/sys/rwlock.h @@ -53,8 +53,12 @@ typedef struct sx krwlock_t; #define RW_LOCK_HELD(x) (rw_lock_held((x))) #define RW_ISWRITER(x) (rw_iswriter(x)) -#define rw_init(lock, desc, type, arg) \ - sx_init_flags((lock), "zfs:" #lock, SX_DUPOK) +#define rw_init(lock, desc, type, arg) do { \ + KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \ + LO_EXPECTED, ("lock %s already initialized", #lock)); \ + bzero((lock), sizeof(struct sx)); \ + sx_init_flags((lock), "zfs:" #lock, SX_DUPOK); \ +} while (0) #define rw_destroy(lock) sx_destroy(lock) #define rw_enter(lock, how) do { \ if ((how) == RW_READER) \ diff --git a/sys/compat/opensolaris/sys/lock.h b/sys/compat/opensolaris/sys/lock.h new file mode 100644 index 0000000..51fcd67 --- /dev/null +++ b/sys/compat/opensolaris/sys/lock.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2007 Pawel Jakub Dawidek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _OPENSOLARIS_SYS_LOCK_H_ +#define _OPENSOLARIS_SYS_LOCK_H_ + +#include_next + +#ifdef _KERNEL + +#define LO_ALLMASK (LO_INITIALIZED | LO_WITNESS | LO_QUIET | \ + LO_RECURSABLE | LO_SLEEPABLE | LO_UPGRADABLE | \ + LO_DUPOK | LO_ENROLLPEND | LO_CLASSMASK | \ + LO_NOPROFILE) +#define LO_EXPECTED (LO_INITIALIZED | LO_WITNESS | LO_RECURSABLE | \ + LO_SLEEPABLE | LO_UPGRADABLE | LO_DUPOK | \ + /* sx lock class */(2 << LO_CLASSSHIFT)) + +#endif /* defined(_KERNEL) */ + +#endif /* _OPENSOLARIS_SYS_LOCK_H_ */ diff --git a/sys/compat/opensolaris/sys/mutex.h b/sys/compat/opensolaris/sys/mutex.h index 14e69c4..dac7249 100644 --- a/sys/compat/opensolaris/sys/mutex.h +++ b/sys/compat/opensolaris/sys/mutex.h @@ -48,6 +48,9 @@ typedef struct sx kmutex_t; #define mutex_init(lock, desc, type, arg) do { \ ASSERT((type) == MUTEX_DEFAULT); \ + KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \ + LO_EXPECTED, ("lock %s already initialized", #lock)); \ + bzero((lock), sizeof(struct sx)); \ sx_init_flags((lock), "zfs:" #lock, SX_DUPOK); \ } while (0) #define mutex_destroy(lock) sx_destroy(lock) diff --git a/sys/compat/opensolaris/sys/rwlock.h b/sys/compat/opensolaris/sys/rwlock.h index 638ca84..6facd7a 100644 --- a/sys/compat/opensolaris/sys/rwlock.h +++ b/sys/compat/opensolaris/sys/rwlock.h @@ -53,8 +53,12 @@ typedef struct sx krwlock_t; #define RW_LOCK_HELD(x) (rw_lock_held((x))) #define RW_ISWRITER(x) (rw_iswriter(x)) -#define rw_init(lock, desc, type, arg) \ - sx_init_flags((lock), "zfs:" #lock, SX_DUPOK) +#define rw_init(lock, desc, type, arg) do { \ + KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \ + LO_EXPECTED, ("lock %s already initialized", #lock)); \ + bzero((lock), sizeof(struct sx)); \ + sx_init_flags((lock), "zfs:" #lock, SX_DUPOK); \ +} while (0) #define rw_destroy(lock) sx_destroy(lock) #define rw_enter(lock, how) do { \ if ((how) == RW_READER) \ -- cgit v1.1