mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
New service that waits on zvol links to be created
The zfs-volume-wait.service scans existing zvols and waits for their links under /dev to be created. Any service that depends on zvol links to be there should add a dependency on zfs-volumes.target. By default, this target is not enabled. Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> Reviewed-by: Antonio Russo <antonio.e.russo@gmail.com> Reviewed-by: Richard Laager <rlaager@wiktel.com> Reviewed-by: loli10K <ezomori.nozomu@gmail.com> Reviewed-by: John Gallagher <john.gallagher@delphix.com> Reviewed-by: George Wilson <gwilson@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pavel Zakharov <pzakharov@delphix.com> Closes #8975
This commit is contained in:
committed by
Tony Hutter
parent
beb21db3c6
commit
38528476bf
@@ -0,0 +1 @@
|
||||
dist_bin_SCRIPTS = zvol_wait
|
||||
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/bin/sh
|
||||
|
||||
count_zvols() {
|
||||
if [ -z "$zvols" ]; then
|
||||
echo 0
|
||||
else
|
||||
echo "$zvols" | wc -l
|
||||
fi
|
||||
}
|
||||
|
||||
filter_out_zvols_with_links() {
|
||||
while read -r zvol; do
|
||||
if [ ! -L "/dev/zvol/$zvol" ]; then
|
||||
echo "$zvol"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
filter_out_deleted_zvols() {
|
||||
while read -r zvol; do
|
||||
if zfs list "$zvol" >/dev/null 2>&1; then
|
||||
echo "$zvol"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
list_zvols() {
|
||||
zfs list -t volume -H -o name,volmode | while read -r zvol_line; do
|
||||
name=$(echo "$zvol_line" | awk '{print $1}')
|
||||
volmode=$(echo "$zvol_line" | awk '{print $2}')
|
||||
# /dev links are not created for zvols with volmode = "none".
|
||||
[ "$volmode" = "none" ] || echo "$name"
|
||||
done
|
||||
}
|
||||
|
||||
zvols=$(list_zvols)
|
||||
zvols_count=$(count_zvols)
|
||||
if [ "$zvols_count" -eq 0 ]; then
|
||||
echo "No zvols found, nothing to do."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Testing $zvols_count zvol links"
|
||||
|
||||
outer_loop=0
|
||||
while [ "$outer_loop" -lt 20 ]; do
|
||||
outer_loop=$((outer_loop + 1))
|
||||
|
||||
old_zvols_count=$(count_zvols)
|
||||
|
||||
inner_loop=0
|
||||
while [ "$inner_loop" -lt 30 ]; do
|
||||
inner_loop=$((inner_loop + 1))
|
||||
|
||||
zvols="$(echo "$zvols" | filter_out_zvols_with_links)"
|
||||
|
||||
zvols_count=$(count_zvols)
|
||||
if [ "$zvols_count" -eq 0 ]; then
|
||||
echo "All zvol links are now present."
|
||||
exit 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "Still waiting on $zvols_count zvol links ..."
|
||||
#
|
||||
# Although zvols should normally not be deleted at boot time,
|
||||
# if that is the case then their links will be missing and
|
||||
# we would stall.
|
||||
#
|
||||
if [ "$old_zvols_count" -eq "$zvols_count" ]; then
|
||||
echo "No progress since last loop."
|
||||
echo "Checking if any zvols were deleted."
|
||||
|
||||
zvols=$(echo "$zvols" | filter_out_deleted_zvols)
|
||||
zvols_count=$(count_zvols)
|
||||
|
||||
if [ "$old_zvols_count" -ne "$zvols_count" ]; then
|
||||
echo "$((old_zvols_count - zvols_count)) zvol(s) deleted."
|
||||
fi
|
||||
|
||||
if [ "$zvols_count" -ne 0 ]; then
|
||||
echo "Remaining zvols:"
|
||||
echo "$zvols"
|
||||
else
|
||||
echo "All zvol links are now present."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Timed out waiting on zvol links"
|
||||
exit 1
|
||||
Reference in New Issue
Block a user