| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | #!/bin/sh | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | count_zvols() { | 
					
						
							|  |  |  | 	if [ -z "$zvols" ]; then | 
					
						
							|  |  |  | 		echo 0 | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		echo "$zvols" | wc -l | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | filter_out_zvols_with_links() { | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 	echo "$zvols" | tr ' ' '+' | while read -r zvol; do | 
					
						
							|  |  |  | 		if ! [ -L "/dev/zvol/$zvol" ]; then | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | 			echo "$zvol" | 
					
						
							|  |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 	done | tr '+' ' ' | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | filter_out_deleted_zvols() { | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 	OIFS="$IFS" | 
					
						
							|  |  |  | 	IFS=" | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
											  
											
												Trim excess shellcheck annotations. Widen to all non-Korn scripts
Before, make shellcheck checked
  scripts/{commitcheck,make_gitrev,man-dates,paxcheck,zfs-helpers,zfs,
           zfs-tests,zimport,zloop}.sh
  cmd/zed/zed.d/{{all-debug,all-syslog,data-notify,generic-notify,
                 resilver_finish-start-scrub,scrub_finish-notify,
                 statechange-led,statechange-notify,trim_finish-notify,
                 zed-functions}.sh,history_event-zfs-list-cacher.sh.in}
  cmd/zpool/zpool.d/{dm-deps,iostat,lsblk,media,ses,smart,upath}
now it also checks
  contrib/dracut/{02zfsexpandknowledge/module-setup,
                  90zfs/{export-zfs,parse-zfs,zfs-needshutdown,
                         zfs-load-key,zfs-lib,module-setup,
                         mount-zfs,zfs-generator}}.sh.in
  cmd/zed/zed.d/{pool_import-led,vdev_attach-led,
                 resilver_finish-notify,vdev_clear-led}.sh
  contrib/initramfs/{zfsunlock,hooks/zfs.in,scripts/local-top/zfs}
  tests/zfs-tests/tests/perf/scripts/prefetch_io.sh
  scripts/common.sh.in
  contrib/bpftrace/zfs-trace.sh
  autogen.sh
Reviewed-by: John Kennedy <john.kennedy@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #12042
											
										 
											2021-05-14 15:02:11 +03:00
										 |  |  | 	# shellcheck disable=SC2086 | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 	zfs list -H -o name $zvols 2>/dev/null | 
					
						
							|  |  |  | 	IFS="$OIFS" | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | list_zvols() { | 
					
						
							| 
									
										
										
										
											2021-04-09 19:12:07 +03:00
										 |  |  | 	read -r default_volmode < /sys/module/zfs/parameters/zvol_volmode | 
					
						
							| 
									
										
										
										
											2019-11-06 21:51:19 +03:00
										 |  |  | 	zfs list -t volume -H -o \ | 
					
						
							| 
									
										
										
										
											2022-04-23 01:37:03 +03:00
										 |  |  | 	    name,volmode,receive_resume_token,redact_snaps,keystatus | | 
					
						
							|  |  |  | 	    while IFS="	" read -r name volmode token redacted keystatus; do # IFS=\t here! | 
					
						
							| 
									
										
										
										
											2021-04-09 19:12:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-23 01:37:03 +03:00
										 |  |  | 		# /dev links are not created for zvols with volmode = "none", | 
					
						
							|  |  |  | 		# redacted zvols, or encrypted zvols for which the key has not | 
					
						
							|  |  |  | 		# been loaded. | 
					
						
							| 
									
										
										
										
											2019-09-03 21:29:52 +03:00
										 |  |  | 		[ "$volmode" = "none" ] && continue | 
					
						
							| 
									
										
										
										
											2021-04-09 19:12:07 +03:00
										 |  |  | 		[ "$volmode" = "default" ] && [ "$default_volmode" = "3" ] && | 
					
						
							|  |  |  | 		    continue | 
					
						
							| 
									
										
										
										
											2019-11-06 21:51:19 +03:00
										 |  |  | 		[ "$redacted" = "-" ] || continue | 
					
						
							| 
									
										
										
										
											2022-04-23 01:37:03 +03:00
										 |  |  | 		[ "$keystatus" = "unavailable" ] && continue | 
					
						
							| 
									
										
										
										
											2021-04-09 19:12:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-03 04:38:53 +03:00
										 |  |  | 		# We also ignore partially received zvols if it is | 
					
						
							| 
									
										
										
										
											2019-09-03 21:29:52 +03:00
										 |  |  | 		# not an incremental receive, as those won't even have a block | 
					
						
							|  |  |  | 		# device minor node created yet. | 
					
						
							|  |  |  | 		if [ "$token" != "-" ]; then | 
					
						
							| 
									
										
										
										
											2021-04-09 19:12:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 21:29:52 +03:00
										 |  |  | 			# Incremental receives create an invisible clone that | 
					
						
							|  |  |  | 			# is not automatically displayed by zfs list. | 
					
						
							|  |  |  | 			if ! zfs list "$name/%recv" >/dev/null 2>&1; then | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			fi | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 		echo "$name" | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | 	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)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 		zvols="$(filter_out_zvols_with_links)" | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		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." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-07 18:37:55 +03:00
										 |  |  | 		zvols=$(filter_out_deleted_zvols) | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | 		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 | 
					
						
							| 
									
										
										
										
											2022-10-11 22:12:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# zvol_count made some progress - let's stay in this loop. | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	if [ "$old_zvols_count" -gt "$zvols_count" ]; then | 
					
						
							|  |  |  | 		outer_loop=$((outer_loop - 1)) | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2019-07-18 01:33:05 +03:00
										 |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | echo "Timed out waiting on zvol links" | 
					
						
							|  |  |  | exit 1 |