aboutsummaryrefslogtreecommitdiff
path: root/sys/gnu
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2007-03-31 23:23:42 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2007-03-31 23:23:42 +0000
commit4e7f640dfbe1f666c3857534899ee168776fbe67 (patch)
tree6f71182be4d218a6130d92f4c3455591243f0019 /sys/gnu
parent511cecafd6f81e86fe43552c72dae3f6e584e71d (diff)
Notes
Diffstat (limited to 'sys/gnu')
-rw-r--r--sys/gnu/fs/xfs/FreeBSD/support/mrlock.c51
-rw-r--r--sys/gnu/fs/xfs/FreeBSD/support/mrlock.h48
2 files changed, 20 insertions, 79 deletions
diff --git a/sys/gnu/fs/xfs/FreeBSD/support/mrlock.c b/sys/gnu/fs/xfs/FreeBSD/support/mrlock.c
index 950303938a07..7c3f8bfdfb55 100644
--- a/sys/gnu/fs/xfs/FreeBSD/support/mrlock.c
+++ b/sys/gnu/fs/xfs/FreeBSD/support/mrlock.c
@@ -1,49 +1,14 @@
#include <sys/param.h>
+#include <machine/pcpu.h>
+#include <support/debug.h>
#include <support/mrlock.h>
-void
-_sx_xfs_destroy(struct sx *sx)
-{
- if (sx->sx_cnt == -1)
- sx_xunlock(sx);
- sx_destroy(sx);
-}
-
-void
-_sx_xfs_lock(struct sx *sx, int type, const char *file, int line)
-{
- if (type == MR_ACCESS)
- _sx_slock(sx, file, line);
- else if (type == MR_UPDATE)
- _sx_sunlock(sx, file, line);
- else
- panic("Invalid lock type passed");
-}
-
-
-void
-_sx_xfs_unlock(struct sx *sx, const char *file, int line)
-{
- if (_sx_xfs_xowned(sx))
- _sx_xunlock(sx, file, line);
- else if (_sx_xfs_sowned(sx))
- _sx_sunlock(sx, file, line);
- else
- panic("lock is not locked");
-}
-
int
ismrlocked(mrlock_t *mrp, int type)
-{
- if (type == MR_ACCESS)
- return _sx_xfs_sowned(mrp); /* Read lock */
- else if (type == MR_UPDATE)
- return _sx_xfs_xowned(mrp); /* Write lock */
- else if (type == (MR_UPDATE | MR_ACCESS))
- return _sx_xfs_sowned(mrp) ||
- _sx_xfs_xowned(mrp); /* Any type of lock held */
- return (mrp->sx_shrd_wcnt > 0 || mrp->sx_excl_wcnt > 0);
-}
-
-
+{
+ sx_assert(mrp, SX_LOCKED);
+ if (type == MR_UPDATE)
+ return sx_xlocked(mrp);
+ return 1;
+}
diff --git a/sys/gnu/fs/xfs/FreeBSD/support/mrlock.h b/sys/gnu/fs/xfs/FreeBSD/support/mrlock.h
index 4e82d4199118..b41efc57dc4c 100644
--- a/sys/gnu/fs/xfs/FreeBSD/support/mrlock.h
+++ b/sys/gnu/fs/xfs/FreeBSD/support/mrlock.h
@@ -4,62 +4,38 @@
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/lock.h>
-#include <sys/mutex.h>
#include <sys/sx.h>
-#include <support/debug.h>
-
/*
* Implement mrlocks on FreeBSD that work for XFS.
- * Use FreeBSD sx lock and add necessary functions
- * if additional functionality is requested
+ * Map mrlock functions to corresponding equivalents in
+ * sx.
*/
typedef struct sx mrlock_t;
#define MR_ACCESS 1
#define MR_UPDATE 2
-/*
+/*
* Compatibility defines, not really used
*/
#define MRLOCK_BARRIER 0x1
#define MRLOCK_ALLOW_EQUAL_PRI 0x8
-/*
- * mraccessf/mrupdatef take flags to be passed in while sleeping;
- * only PLTWAIT is currently supported.
- */
-#define mrinit(lock, name) sx_init(lock, name)
#define mrlock_init(lock, type, name, seq) sx_init(lock, name)
-#define mrfree(lock) _sx_xfs_destroy(lock)
-#define mraccessf(lock, f) sx_slock(lock)
-#define mrupdatef(lock, f) sx_xlock(lock)
-#define mraccunlock(lock) sx_sunlock(lock)
#define mrtryaccess(lock) sx_try_slock(lock)
#define mrtryupdate(lock) sx_try_xlock(lock)
-#define mraccess(mrp) mraccessf(mrp, 0)
-#define mrupdate(mrp) mrupdatef(mrp, 0)
-#define mrislocked_access(lock) _sx_xfs_xowned(lock)
-#define mrislocked_update(lock) _sx_xfs_sowned(lock)
-#define mrtrypromote(lock) sx_try_upgrade(lock)
+#define mraccess(lock) sx_slock(lock)
+#define mrupdate(lock) sx_xlock(lock)
#define mrdemote(lock) sx_downgrade(lock)
+#define mrunlock(lock) sx_unlock(lock)
-int ismrlocked(mrlock_t *, int);
-void _sx_xfs_lock(struct sx *sx, int type, const char *file, int line);
-void _sx_xfs_unlock(struct sx *sx, const char *file, int line);
-void _sx_xfs_destroy(struct sx *sx);
-#define _sx_xfs_xowned(lock) ((lock)->sx_cnt < 0)
-#define _sx_xfs_sowned(lock) ((lock)->sx_cnt > 0)
-
-/*
- * Functions, not implemented in FreeBSD
- */
-#define mrunlock(lock) \
- _sx_xfs_unlock(lock, __FILE__, __LINE__)
-
-#define mrlock(lock, type, flags) \
- _sx_xfs_lock(lock, type, __FILE__, __LINE__)
-
+#define mrfree(lock) do { \
+ if (sx_xlocked(lock)) \
+ sx_xunlock(lock); \
+ sx_destroy(lock); \
+} while (0)
+int ismrlocked(mrlock_t *mrp, int type);
#endif /* __XFS_SUPPORT_MRLOCK_H__ */