From: Manuel Bouyer <bouyer@antioche.eu.org>
To: xen-devel@lists.xenproject.org
Cc: Manuel Bouyer <bouyer@netbsd.org>,
Ian Jackson <iwj@xenproject.org>, Wei Liu <wl@xen.org>
Subject: [PATCH] NetBSD hotplug: Introduce locking functions
Date: Tue, 12 Jan 2021 19:12:23 +0100 [thread overview]
Message-ID: <20210112181242.1570-3-bouyer@antioche.eu.org> (raw)
In-Reply-To: <20210112181242.1570-1-bouyer@antioche.eu.org>
From: Manuel Bouyer <bouyer@netbsd.org>
On NetBSD, some block device configuration requires serialisation.
Introcuce locking functions, and use them in the block script where
appropriate.
Signed-off-by: Manuel Bouyer <bouyer@netbsd.org>
---
tools/hotplug/NetBSD/Makefile | 1 +
tools/hotplug/NetBSD/block | 5 ++-
tools/hotplug/NetBSD/locking.sh | 72 +++++++++++++++++++++++++++++++++
3 files changed, 77 insertions(+), 1 deletion(-)
create mode 100644 tools/hotplug/NetBSD/locking.sh
diff --git a/tools/hotplug/NetBSD/Makefile b/tools/hotplug/NetBSD/Makefile
index 6926885ab8..114b223207 100644
--- a/tools/hotplug/NetBSD/Makefile
+++ b/tools/hotplug/NetBSD/Makefile
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
# Xen script dir and scripts to go there.
XEN_SCRIPTS =
+XEN_SCRIPTS += locking.sh
XEN_SCRIPTS += block
XEN_SCRIPTS += vif-bridge
XEN_SCRIPTS += vif-ip
diff --git a/tools/hotplug/NetBSD/block b/tools/hotplug/NetBSD/block
index 32c20b6c89..23c8e38ebf 100644
--- a/tools/hotplug/NetBSD/block
+++ b/tools/hotplug/NetBSD/block
@@ -6,6 +6,7 @@
DIR=$(dirname "$0")
. "${DIR}/hotplugpath.sh"
+. "${DIR}/locking.sh"
PATH=${bindir}:${sbindir}:${LIBEXEC_BIN}:/bin:/usr/bin:/sbin:/usr/sbin
export PATH
@@ -62,6 +63,7 @@ case $xstatus in
available_disks="$available_disks $disk"
eval $disk=free
done
+ claim_lock block
# Mark the used vnd(4) devices as ``used''.
for disk in `sysctl hw.disknames`; do
case $disk in
@@ -77,6 +79,7 @@ case $xstatus in
break
fi
done
+ release_lock block
if [ x$device = x ] ; then
error "no available vnd device"
fi
@@ -86,7 +89,7 @@ case $xstatus in
device=$xparams
;;
esac
- physical_device=$(stat -f '%r' "$device")
+ physical_device=$(stat -L -f '%r' "$device")
xenstore-write $xpath/physical-device $physical_device
xenstore-write $xpath/hotplug-status connected
exit 0
diff --git a/tools/hotplug/NetBSD/locking.sh b/tools/hotplug/NetBSD/locking.sh
new file mode 100644
index 0000000000..88257f62b7
--- /dev/null
+++ b/tools/hotplug/NetBSD/locking.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# Copyright (c) 2016, Christoph Badura. 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 AUTHOR(S) ``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 AUTHOR(S) 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.
+#
+
+LOCK_BASEDIR="$XEN_LOCK_DIR/xen-hotplug"
+
+_lockfd=9
+_have_lock=0 # lock not taken yet.
+
+SHLOCK="shlock ${_shlock_debug-}"
+
+_lock_set_vars() {
+ _lockfile="$LOCK_BASEDIR/$1.lock"
+ _lockfifo="$LOCK_BASEDIR/$1.fifo"
+}
+
+_lock_init() {
+ mkdir -p "$LOCK_BASEDIR" 2>/dev/null || true
+ mkfifo $_lockfifo 2>/dev/null || true
+}
+
+#
+# use a named pipe as condition variable
+# opening for read-only blocks when there's no writer.
+# opening for read-write never blocks but unblocks any waiting readers.
+#
+_lock_wait_cv() {
+ eval "exec $_lockfd< $_lockfifo ; exec $_lockfd<&-"
+}
+_lock_signal_cv() {
+ eval "exec $_lockfd<> $_lockfifo ; exec $_lockfd<&-"
+}
+
+claim_lock() {
+ _lock_set_vars $1
+ _lock_init
+ until $SHLOCK -f $_lockfile -p $$; do
+ _lock_wait_cv
+ done
+ _have_lock=1
+ # be sure to release the lock when the shell exits
+ trap "release_lock $1" 0 1 2 15
+}
+
+release_lock() {
+ _lock_set_vars $1
+ [ "$_have_lock" != 0 -a -f $_lockfile ] && rm $_lockfile
+ _have_lock=0
+ _lock_signal_cv;
+}
--
2.29.2
next prev parent reply other threads:[~2021-01-12 18:13 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-12 18:12 [PATCH] Fix error: array subscript has type 'char' Manuel Bouyer
2021-01-12 18:12 ` [PATCH] NetBSD: Fix lock directory path Manuel Bouyer
2021-01-15 15:09 ` Roger Pau Monné
2021-01-15 15:13 ` Manuel Bouyer
2021-01-15 15:30 ` Andrew Cooper
2021-01-12 18:12 ` Manuel Bouyer [this message]
2021-01-27 15:57 ` [PATCH] NetBSD hotplug: Introduce locking functions Ian Jackson
2021-01-27 19:29 ` Manuel Bouyer
2021-01-28 14:05 ` Ian Jackson
2021-01-12 18:12 ` [PATCH] NetBSD hotplug: fix block unconfigure on destroy Manuel Bouyer
2021-01-15 15:27 ` Roger Pau Monné
2021-01-26 16:47 ` Manuel Bouyer
2021-01-27 9:40 ` Roger Pau Monné
2021-01-27 9:47 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] NetBSD hotplug: handle case where vifname is not present Manuel Bouyer
2021-01-15 16:06 ` Roger Pau Monné
2021-01-26 16:49 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] NetBSD: remove xenbackendd Manuel Bouyer
2021-01-15 15:31 ` Roger Pau Monné
2021-01-18 18:31 ` Andrew Cooper
2021-01-18 18:41 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] NetBSD: use system-provided headers Manuel Bouyer
2021-01-15 16:01 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] gdbsx: use right path for privcmd Manuel Bouyer
2021-01-18 18:03 ` Roger Pau Monné
2021-01-18 18:45 ` Andrew Cooper
2021-01-18 19:05 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] libs/call: fix build on NetBSD Manuel Bouyer
2021-01-18 18:00 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/evtchn: " Manuel Bouyer
2021-01-18 18:01 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/foreignmemory: Implement " Manuel Bouyer
2021-01-18 17:49 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/gnttab: implement " Manuel Bouyer
2021-01-18 17:54 ` Roger Pau Monné
2021-01-26 17:05 ` Manuel Bouyer
2021-01-27 9:31 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/light: Switch NetBSD to QEMU_XEN Manuel Bouyer
2021-01-18 17:28 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/light: fix tv_sec printf format Manuel Bouyer
2021-01-18 18:19 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/light: fix uuid on NetBSD Manuel Bouyer
2021-01-15 17:27 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] libs/light: make it build without setresuid() Manuel Bouyer
2021-01-18 18:16 ` Roger Pau Monné
2021-01-20 14:52 ` Ian Jackson
2021-01-20 15:13 ` Manuel Bouyer
2021-01-20 15:32 ` Ian Jackson
2021-01-20 16:56 ` Manuel Bouyer
2021-01-20 17:10 ` Ian Jackson
2021-01-20 17:20 ` Manuel Bouyer
2021-01-20 17:29 ` Ian Jackson
2021-01-27 16:03 ` Ian Jackson
2021-01-27 19:34 ` Manuel Bouyer
2021-01-28 11:39 ` Ian Jackson
2021-01-30 11:57 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] libs/light: pass some infos to qemu Manuel Bouyer
2021-01-16 10:16 ` Roger Pau Monné
2021-01-16 11:25 ` Manuel Bouyer
2021-01-18 8:36 ` Roger Pau Monné
2021-01-18 8:52 ` Manuel Bouyer
2021-01-18 9:07 ` Roger Pau Monné
2021-01-18 9:24 ` Manuel Bouyer
2021-01-26 22:42 ` Manuel Bouyer
2021-01-27 9:06 ` Roger Pau Monné
2021-01-27 9:49 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] libs/store: make build without PTHREAD_STACK_MIN Manuel Bouyer
2021-01-18 18:18 ` Roger Pau Monné
2021-01-18 18:56 ` Andrew Cooper
2021-01-18 19:05 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] ocaml/libs/eventchn: drop unneeded evtchn.h Manuel Bouyer
2021-01-13 9:22 ` Christian Lindig
2021-01-13 9:40 ` Manuel Bouyer
2021-01-12 18:12 ` [PATCH] xenpaging.c: include errno.h Manuel Bouyer
2021-01-15 16:08 ` Roger Pau Monné
2021-01-12 18:12 ` [PATCH] xenpmd.c: use dynamic allocation Manuel Bouyer
2021-01-27 15:57 ` Ian Jackson
2021-01-12 18:12 ` [PATCH] xenstat_netbsd: remove usused code Manuel Bouyer
2021-01-18 18:06 ` Roger Pau Monné
2021-01-14 10:53 ` [PATCH] Fix error: array subscript has type 'char' Jan Beulich
2021-01-14 12:29 ` Manuel Bouyer
2021-01-14 13:25 ` Jan Beulich
2021-01-14 14:16 ` Manuel Bouyer
2021-01-26 17:44 ` Manuel Bouyer
2021-01-26 17:59 ` Ian Jackson
2021-01-27 8:31 ` Jan Beulich
2021-01-27 8:37 ` Jan Beulich
2021-01-27 13:53 ` [PATCH] Fix error: array subscript has type 'char' [and 1 more messages] Ian Jackson
2021-01-27 14:33 ` Jan Beulich
2021-01-27 16:21 ` Ian Jackson
2021-01-27 16:32 ` Jan Beulich
2021-01-27 16:52 ` George Dunlap
2021-01-27 17:00 ` Jan Beulich
2021-01-27 17:00 ` Ian Jackson
2021-01-18 19:08 ` NetBSD patches Andrew Cooper
2021-01-18 19:11 ` Manuel Bouyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210112181242.1570-3-bouyer@antioche.eu.org \
--to=bouyer@antioche.eu.org \
--cc=bouyer@netbsd.org \
--cc=iwj@xenproject.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).