1 #!/bin/sh 2 # 3 # $NetBSD: swap1,v 1.14 2022/04/16 18:15:20 andvar Exp $ 4 # 5 6 # PROVIDE: localswap 7 # REQUIRE: DISKS root 8 # KEYWORD: shutdown 9 10 $_rc_subr_loaded . /etc/rc.subr 11 12 name="swap1" 13 start_cmd="swap1_start" 14 stop_cmd="swap1_stop" 15 16 dev_free_tmpfs() 17 { 18 # Generate a list of tmpfs filesystems that contain no device nodes, 19 # which can presumably be unmounted safely at shutdown time. 20 # Filenames are quoted and the list contains no unquoted newlines, 21 # so that the output can be reparsed as a single argument list. 22 mount -t tmpfs | while read -r line 23 do 24 fs=${line#tmpfs on } 25 fs=${fs% type tmpfs*} 26 find -x "${fs}" \( -type b -or -type c \) -exit 1 && 27 echo -n "'${fs}' " 28 done 29 } 30 31 umount_vm_consumers() 32 { 33 case ${swapoff_umount} in 34 auto) 35 swapoff_umount_fs="$(dev_free_tmpfs)" 36 ;; 37 manual) 38 # swapoff_umount_fs set manually 39 ;; 40 esac 41 # eval so that quotes within $swapoff_umount_fs are parsed properly 42 eval set -- "${swapoff_umount_fs}" 43 for fs in "$@" 44 do 45 echo "Forcibly unmounting ${fs}" 46 umount -ft tmpfs "${fs}" 47 done 48 } 49 50 # Add all block-type swap devices; these might be necessary 51 # during disk checks. 52 # 53 swap1_start() 54 { 55 # Treat exit status 2 from swapctl(8) as successful; it means 56 # "no error, but no suitable swap devices were configured". 57 # 58 if ! checkyesno no_swap; then 59 swapctl -A -t blk || [ $? = 2 ] 60 fi 61 } 62 63 # Remove all block-type swap devices 64 # 65 swap1_stop() 66 { 67 if checkyesno swapoff || [ -n "$rc_force" ]; then 68 umount_vm_consumers 69 echo "Removing block-type swap devices" 70 swapctl -U -t blk || [ $? = 2 ] 71 fi 72 } 73 74 load_rc_config swap 75 run_rc_command "$1" 76