Skip to content

Commit

Permalink
FreeBSD: add knlist_init_sx() for exclusive locks
Browse files Browse the repository at this point in the history
This will be used to implement kqfilter support for zvol cdevs.

Reviewed-by: Ryan Moeller <[email protected]>
Reviewed-by: Alexander Motin <[email protected]>
Signed-off-by: Rob Wing <[email protected]>
Closes openzfs#13773
  • Loading branch information
rob-wing authored and behlendorf committed Sep 6, 2022
1 parent 11df48a commit 9d08874
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 0 deletions.
37 changes: 37 additions & 0 deletions include/os/freebsd/zfs/sys/freebsd_event.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2022 Rob Wing
*
* 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 REGENTS 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 REGENTS 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.
*/

#ifndef _ZFS_FREEBSD_EVENT_H
#define _ZFS_FREEBSD_EVENT_H

#ifdef _KERNEL

void knlist_init_sx(struct knlist *knl, struct sx *lock);

#endif /* !_KERNEL */

#endif /* !_ZFS_FREEBSD_EVENT_H */
1 change: 1 addition & 0 deletions module/Makefile.bsd
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ SRCS+= abd_os.c \
arc_os.c \
crypto_os.c \
dmu_os.c \
event_os.c \
hkdf.c \
kmod_core.c \
spa_os.c \
Expand Down
65 changes: 65 additions & 0 deletions module/os/freebsd/zfs/event_os.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2022 Rob Wing
*
* 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 REGENTS 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 REGENTS 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.
*/

#include <sys/param.h>
#include <sys/lock.h>
#include <sys/sx.h>
#include <sys/event.h>

#include <sys/freebsd_event.h>

static void
knlist_sx_xlock(void *arg)
{

sx_xlock((struct sx *)arg);
}

static void
knlist_sx_xunlock(void *arg)
{

sx_xunlock((struct sx *)arg);
}

static void
knlist_sx_assert_lock(void *arg, int what)
{

if (what == LA_LOCKED)
sx_assert((struct sx *)arg, SX_LOCKED);
else
sx_assert((struct sx *)arg, SX_UNLOCKED);
}

void
knlist_init_sx(struct knlist *knl, struct sx *lock)
{

knlist_init(knl, lock, knlist_sx_xlock, knlist_sx_xunlock,
knlist_sx_assert_lock);
}

0 comments on commit 9d08874

Please sign in to comment.