mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	 26b6047469
			
		
	
	
		26b6047469
		
	
	
	
	
		
			
			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
		
			
				
	
	
		
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |