All of lore.kernel.org
 help / color / mirror / Atom feed
From: Manuel Bouyer <bouyer@netbsd.org>
To: xen-devel@lists.xenproject.org
Cc: Manuel Bouyer <bouyer@netbsd.org>
Subject: [PATCH 05/24] Introduce locking functions for block device setup on NetBSD
Date: Mon, 14 Dec 2020 17:36:04 +0100	[thread overview]
Message-ID: <20201214163623.2127-6-bouyer@netbsd.org> (raw)
In-Reply-To: <20201214163623.2127-1-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.28.0



  parent reply	other threads:[~2020-12-14 18:36 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-14 16:35 [PATCH 00/24] NetBSD fixes Manuel Bouyer
2020-12-14 16:36 ` [PATCH 01/24] Fix lock directory path for NetBSD Manuel Bouyer
2020-12-14 16:36 ` [PATCH 02/24] NetBSD doens't need xenbackendd with xl toolstack Manuel Bouyer
2020-12-29 11:17   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 03/24] Fix lock directory path for NetBSD Manuel Bouyer
2020-12-14 16:36 ` [PATCH 04/24] Make xg_main.c build on NetBSD Manuel Bouyer
2020-12-29 11:24   ` Roger Pau Monné
2020-12-14 16:36 ` Manuel Bouyer [this message]
2020-12-29 11:29   ` [PATCH 05/24] Introduce locking functions for block device setup " Roger Pau Monné
2021-01-04 10:20     ` Manuel Bouyer
2021-01-20 15:13       ` Ian Jackson
2021-01-20 15:59         ` Manuel Bouyer
2021-01-20 16:12           ` Ian Jackson
2021-01-20 16:59             ` Manuel Bouyer
2021-01-20 17:03               ` Ian Jackson
2021-01-20 17:19               ` Ian Jackson
2020-12-14 16:36 ` [PATCH 06/24] Handle the case where vifname is not present in xenstore Manuel Bouyer
2020-12-29 11:43   ` Roger Pau Monné
2021-01-04 10:22     ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 07/24] Remove NetBSD's system headers. We'll use the system-provided ones, which are up to date Manuel Bouyer
2020-12-29 11:46   ` Roger Pau Monné
2021-01-04 10:25     ` Manuel Bouyer
2021-01-04 17:09       ` Roger Pau Monné
2021-01-04 17:20         ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 08/24] Make libs/call build on NetBSD Manuel Bouyer
2020-12-29 11:49   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 09/24] Use xen/xenio.h " Manuel Bouyer
2020-12-14 16:36 ` [PATCH 10/24] Make libs/evtchn build " Manuel Bouyer
2020-12-29 11:52   ` Roger Pau Monné
2021-01-04 10:26     ` Manuel Bouyer
2021-01-04 17:15       ` Roger Pau Monné
2021-01-10 12:22         ` Manuel Bouyer
2021-01-11 17:22           ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 11/24] Implement foreignmemory " Manuel Bouyer
2020-12-29 12:46   ` Roger Pau Monné
2021-01-04 11:30     ` Manuel Bouyer
2021-01-04 18:24       ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 12/24] Implement gnttab " Manuel Bouyer
2020-12-29 11:16   ` Roger Pau Monné
2021-01-04 10:29     ` Manuel Bouyer
2021-01-04 17:24       ` Roger Pau Monné
2021-01-10 12:40         ` Manuel Bouyer
2021-01-11 17:04           ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 13/24] Don't assume tv_sec is a unsigned long (for NetBSD) Manuel Bouyer
2020-12-29 14:02   ` Roger Pau Monné
2021-01-04 10:31     ` Manuel Bouyer
2021-01-04 18:17       ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 14/24] Pass bridge name to qemu and set XEN_DOMAIN_ID Manuel Bouyer
2020-12-15  8:44   ` Manuel Bouyer
2020-12-29 15:19   ` Roger Pau Monné
2021-01-04 10:36     ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 15/24] Make libs/light build on NetBSD Manuel Bouyer
2020-12-29 14:15   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 16/24] Switch NetBSD to QEMU_XEN (!traditional) Manuel Bouyer
2020-12-29 14:19   ` Roger Pau Monné
2021-01-04 10:47     ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 17/24] Make libs/light build on NetBSD Manuel Bouyer
2020-12-29 14:28   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 18/24] xeneventchn_stubs.c doens't need xen/sys/evtchn.h (NetBSD fix) Manuel Bouyer
2020-12-29 14:30   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 19/24] errno may not be a gobal R/W variable, use a local variable instead (fix build on NetBSD) Manuel Bouyer
2020-12-29 14:38   ` Roger Pau Monné
2021-01-04 10:56     ` Manuel Bouyer
2021-01-04 13:30       ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 20/24] If FILENAME_MAX is defined, use it instead of arbitrary value (fix format-truncation errors with GCC >= 7) Manuel Bouyer
2020-12-29 14:51   ` Roger Pau Monné
2021-01-04 11:03     ` Manuel Bouyer
2020-12-14 16:36 ` [PATCH 21/24] Fix unused functions/variables error Manuel Bouyer
2020-12-14 16:36 ` [PATCH 22/24] If PTHREAD_STACK_MIN is not defined, use DEFAULT_THREAD_STACKSIZE Manuel Bouyer
2020-12-29 14:57   ` Roger Pau Monné
2020-12-14 16:36 ` [PATCH 23/24] Use xen/xenio.h on NetBSD Manuel Bouyer
2020-12-14 16:36 ` [PATCH 24/24] Fix error: array subscript has type 'char' [-Werror=char-subscripts] Manuel Bouyer
2020-12-29 15:23 ` [PATCH 00/24] NetBSD fixes Roger Pau Monné

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=20201214163623.2127-6-bouyer@netbsd.org \
    --to=bouyer@netbsd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.