]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/pc-sysinstall/backend/functions-unmount.sh
MFV r329313: 8857 zio_remove_child() panic due to already destroyed parent zio
[FreeBSD/FreeBSD.git] / usr.sbin / pc-sysinstall / backend / functions-unmount.sh
1 #!/bin/sh
2 #-
3 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 #
5 # Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 #    notice, this list of conditions and the following disclaimer in the
14 #    documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 # SUCH DAMAGE.
27 #
28 # $FreeBSD$
29
30 # Functions which unmount all mounted disk filesystems
31
32 # Unmount all mounted partitions under specified dir
33 umount_all_dir()
34 {
35   _udir="$1"
36   _umntdirs=`mount | sort -r | grep "on $_udir" | cut -d ' ' -f 3`
37   for _ud in $_umntdirs
38   do
39     umount -f ${_ud} 
40   done
41 }
42
43 # Script that adds our gmirror devices for syncing
44 start_gmirror_sync()
45 {
46
47   cd ${MIRRORCFGDIR}
48   for DISK in `ls ${MIRRORCFGDIR}`
49   do
50     MIRRORDISK="`cat ${DISK} | cut -d ':' -f 1`"
51     MIRRORBAL="`cat ${DISK} | cut -d ':' -f 2`"
52     MIRRORNAME="`cat ${DISK} | cut -d ':' -f 3`"
53    
54     # Start the mirroring service
55     rc_nohalt "gmirror forget ${MIRRORNAME}"
56     rc_halt "gmirror insert ${MIRRORNAME} ${MIRRORDISK}"
57
58   done
59
60 };
61
62 # Unmounts all our mounted file-systems
63 unmount_all_filesystems()
64 {
65   # Copy the logfile to disk before we unmount
66   cp ${LOGOUT} ${FSMNT}/root/pc-sysinstall.log
67   cd /
68
69   # Start by unmounting any ZFS partitions
70   zfs_cleanup_unmount
71
72   # Lets read our partition list, and unmount each
73   ##################################################################
74   for PART in `ls ${PARTDIR}`
75   do
76     PARTDEV=`echo $PART | sed 's|-|/|g'`    
77     PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`"
78     PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`"
79     PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`"
80     PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d '#' -f 4`"
81
82     if [ "${PARTENC}" = "ON" ]
83     then
84       EXT=".eli"
85     else
86       EXT=""
87     fi
88
89     if [ "${PARTFS}" = "SWAP" ]
90     then
91       rc_nohalt "swapoff ${PARTDEV}${EXT}"
92     fi
93
94     # Check if we've found "/", and unmount that last
95     if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ]
96     then
97       rc_halt "umount -f ${PARTDEV}${EXT}"
98
99       # Re-check if we are missing a label for this device and create it again if so
100       if [ ! -e "/dev/label/${PARTLABEL}" ]
101       then
102         case ${PARTFS} in
103           UFS) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;;
104           UFS+S) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;;
105           UFS+SUJ) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;;
106           UFS+J) glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal ;;
107           *) ;;
108         esac 
109       fi
110     fi
111
112     # Check if we've found "/" and make sure the label exists
113     if [ "$PARTMNT" = "/" -a "${PARTFS}" != "ZFS" ]
114     then
115       if [ ! -e "/dev/label/${PARTLABEL}" ]
116       then
117         case ${PARTFS} in
118           UFS) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;;
119           UFS+S) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;;
120           UFS+SUJ) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;;
121           UFS+J) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal" ;;
122           *) ;;
123         esac 
124       fi
125     fi
126   done
127
128   # Last lets the /mnt partition
129   #########################################################
130   rc_nohalt "umount -f ${FSMNT}"
131
132    # If are using a ZFS on "/" set it to legacy
133   if [ ! -z "${FOUNDZFSROOT}" ]
134   then
135     rc_halt "zfs set mountpoint=legacy ${FOUNDZFSROOT}"
136   fi
137
138   # If we need to relabel "/" do it now
139   if [ ! -z "${ROOTRELABEL}" ]
140   then
141     ${ROOTRELABEL}
142   fi
143
144   # Unmount our CDMNT
145   rc_nohalt "umount -f ${CDMNT}" >/dev/null 2>/dev/null
146
147   # Check if we need to run any gmirror syncing
148   ls ${MIRRORCFGDIR}/* >/dev/null 2>/dev/null
149   if [ $? -eq 0 ]
150   then
151     # Lets start syncing now
152     start_gmirror_sync
153   fi
154
155 };
156
157 # Unmounts any filesystems after a failure
158 unmount_all_filesystems_failure()
159 {
160   cd /
161
162   # if we did a fresh install, start unmounting
163   if [ "${INSTALLMODE}" = "fresh" ]
164   then
165
166     # Lets read our partition list, and unmount each
167     ##################################################################
168     if [ -d "${PARTDIR}" ]
169     then
170     for PART in `ls ${PARTDIR}`
171     do
172       PARTDEV=`echo $PART | sed 's|-|/|g'` 
173       PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`"
174       PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`"
175       PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`"
176
177       if [ "${PARTFS}" = "SWAP" ]
178       then
179         if [ "${PARTENC}" = "ON" ]
180         then
181           swapoff ${PARTDEV}.eli >/dev/null 2>/dev/null
182         else
183           swapoff ${PARTDEV} >/dev/null 2>/dev/null
184         fi
185       fi
186
187       # Check if we've found "/" again, don't need to mount it twice
188       if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ]
189       then
190         umount -f ${PARTDEV} >/dev/null 2>/dev/null
191         umount -f ${FSMNT}${PARTMNT} >/dev/null 2>/dev/null
192       fi
193     done
194
195     # Last lets the /mnt partition
196     #########################################################
197     umount -f ${FSMNT} >/dev/null 2>/dev/null
198
199    fi
200   else
201     # We are doing a upgrade, try unmounting any of these filesystems
202     chroot ${FSMNT} /sbin/umount -a >/dev/null 2>/dev/null
203     umount -f ${FSMNT}/usr >/dev/null 2>/dev/null
204     umount -f ${FSMNT}/dev >/dev/null 2>/dev/null
205     umount -f ${FSMNT} >/dev/null 2>/dev/null 
206     sh ${TMPDIR}/.upgrade-unmount >/dev/null 2>/dev/null
207   fi
208    
209   # Unmount our CDMNT
210   umount ${CDMNT} >/dev/null 2>/dev/null
211
212 };