xref: /OK3568_Linux_fs/external/rkscript/disk-helper (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun# Uncomment below to see more logs
4*4882a593Smuzhiyun# set -x
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunBUSYBOX_MOUNT_OPTS="loop (a|)sync (no|)atime (no|)diratime (no|)relatime (no|)dev (no|)exec (no|)suid (r|)shared (r|)slave (r|)private (un|)bindable (r|)bind move remount ro"
7*4882a593SmuzhiyunNTFS_3G_MOUNT_OPTS="ro uid=[0-9]* gid=[0-9]* umask=[0-9]* fmask=[0-9]* dmask=[0-9]*"
8*4882a593Smuzhiyun
9*4882a593Smuzhiyuncheck_tool()
10*4882a593Smuzhiyun{
11*4882a593Smuzhiyun	TOOL=$(echo $1 | grep -o "^[^ ]*")
12*4882a593Smuzhiyun	BR2_CONFIG=$2
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun	type $TOOL >/dev/null && return 0
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun	if grep -wq "ID=buildroot" /etc/os-release 2>/dev/null; then
17*4882a593Smuzhiyun		[ -n "$BR2_CONFIG" ] && \
18*4882a593Smuzhiyun			echo "You may need to enable $BR2_CONFIG"
19*4882a593Smuzhiyun	else
20*4882a593Smuzhiyun		echo "Missing tool: $TOOL"
21*4882a593Smuzhiyun	fi
22*4882a593Smuzhiyun	return 1
23*4882a593Smuzhiyun}
24*4882a593Smuzhiyun
25*4882a593Smuzhiyundevice_from_attr()
26*4882a593Smuzhiyun{
27*4882a593Smuzhiyun	# It's a block device
28*4882a593Smuzhiyun	if [ -b "$1" ]; then
29*4882a593Smuzhiyun		echo $1
30*4882a593Smuzhiyun		return
31*4882a593Smuzhiyun	fi
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun	# Parse from blkid
34*4882a593Smuzhiyun	blkid 2>/dev/null | grep -w "$1" | head -n 1 | \
35*4882a593Smuzhiyun		grep -o "^[^:]*" && return
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun	# Check mtdblock name
38*4882a593Smuzhiyun	for d in $(ls /dev/ | grep mtdblock); do
39*4882a593Smuzhiyun		if grep -q "^$1$" /sys/block/$d/device/name; then
40*4882a593Smuzhiyun			echo $d
41*4882a593Smuzhiyun			return
42*4882a593Smuzhiyun		fi
43*4882a593Smuzhiyun	done
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	# Fallback to /dev/block/by-name
46*4882a593Smuzhiyun	if [ -b /dev/block/by-name/$1 ]; then
47*4882a593Smuzhiyun		echo /dev/block/by-name/$1
48*4882a593Smuzhiyun		return
49*4882a593Smuzhiyun	fi
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun	echo $1
52*4882a593Smuzhiyun}
53*4882a593Smuzhiyun
54*4882a593Smuzhiyunprepare_ubi()
55*4882a593Smuzhiyun{
56*4882a593Smuzhiyun	# Only support ubi for mtd device
57*4882a593Smuzhiyun	if echo $DEV | grep -vq /dev/mtd; then
58*4882a593Smuzhiyun		echo "$DEV is not a mtd device!"
59*4882a593Smuzhiyun		return 1
60*4882a593Smuzhiyun	fi
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun	[ "$PART_NO" ] || { echo "No valid part number!" && return 1; }
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun	if [ "$FSGROUP" = ubifs ]; then
65*4882a593Smuzhiyun		DEV=/dev/ubi${PART_NO}_0
66*4882a593Smuzhiyun	else
67*4882a593Smuzhiyun		DEV=/dev/ubiblock${PART_NO}_0
68*4882a593Smuzhiyun	fi
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	MTDDEV=/dev/mtd${PART_NO}
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun	echo "Preparing $DEV from $MTDDEV"
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun	echo "Remove ubi block device"
75*4882a593Smuzhiyun	if echo $DEV | grep -q ubiblock; then
76*4882a593Smuzhiyun		check_tool ubiblock BR2_PACKAGE_MTD_UBIBLOCK || return 1
77*4882a593Smuzhiyun		ubiblock -r /dev/ubi${PART_NO}_0 &>/dev/null
78*4882a593Smuzhiyun	fi
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	echo "Detach ubi device"
81*4882a593Smuzhiyun	check_tool ubidetach BR2_PACKAGE_MTD_UBIDETACH || return 1
82*4882a593Smuzhiyun	ubidetach -p $MTDDEV &>/dev/null
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun	echo "Attach ubi device"
85*4882a593Smuzhiyun	check_tool ubiattach BR2_PACKAGE_MTD_UBIATTACH || return 1
86*4882a593Smuzhiyun	ubiattach /dev/ubi_ctrl -m $PART_NO -d $PART_NO || return 1
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun	echo "Check for valid volume"
89*4882a593Smuzhiyun	if [ ! -e /dev/ubi${PART_NO}_0 ]; then
90*4882a593Smuzhiyun		echo "No valid ubi volume"
91*4882a593Smuzhiyun		return 1
92*4882a593Smuzhiyun	fi
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun	echo "Create ubi block device"
95*4882a593Smuzhiyun	if echo $DEV | grep -q ubiblock; then
96*4882a593Smuzhiyun		check_tool ubiblock BR2_PACKAGE_MTD_UBIBLOCK || return 1
97*4882a593Smuzhiyun		ubiblock -c /dev/ubi${PART_NO}_0 || return 1
98*4882a593Smuzhiyun	fi
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun	return 0
101*4882a593Smuzhiyun}
102*4882a593Smuzhiyun
103*4882a593Smuzhiyunformat_ubifs()
104*4882a593Smuzhiyun{
105*4882a593Smuzhiyun	echo "Formatting $MTDDEV for $DEV"
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	echo "Remove ubi block device"
108*4882a593Smuzhiyun	if echo $DEV | grep -q ubiblock; then
109*4882a593Smuzhiyun		check_tool ubiblock BR2_PACKAGE_MTD_UBIBLOCK || return 1
110*4882a593Smuzhiyun		ubiblock -r /dev/ubi${PART_NO}_0 &>/dev/null
111*4882a593Smuzhiyun	fi
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	echo "Detach ubi device"
114*4882a593Smuzhiyun	check_tool ubidetach BR2_PACKAGE_MTD_UBIDETACH || return 1
115*4882a593Smuzhiyun	ubidetach -p $MTDDEV &>/dev/null
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun	echo "Format device"
118*4882a593Smuzhiyun	check_tool ubiformat BR2_PACKAGE_MTD_UBIFORMAT || return 1
119*4882a593Smuzhiyun	ubiformat -yq $MTDDEV || return 1
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	echo "Attach ubi device"
122*4882a593Smuzhiyun	ubiattach /dev/ubi_ctrl -m $PART_NO -d $PART_NO || return 1
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun	echo "Create ubi volume"
125*4882a593Smuzhiyun	check_tool ubimkvol BR2_PACKAGE_MTD_UBIMKVOL || return 1
126*4882a593Smuzhiyun	ubimkvol /dev/ubi$PART_NO -N $PART_NAME -m || return 1
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	echo "Create ubi block device"
129*4882a593Smuzhiyun	if echo $DEV | grep -q ubiblock; then
130*4882a593Smuzhiyun		check_tool ubiblock BR2_PACKAGE_MTD_UBIBLOCK || return 1
131*4882a593Smuzhiyun		ubiblock -c /dev/ubi${PART_NO}_0 || return 1
132*4882a593Smuzhiyun	fi
133*4882a593Smuzhiyun}
134*4882a593Smuzhiyun
135*4882a593Smuzhiyunis_rootfs()
136*4882a593Smuzhiyun{
137*4882a593Smuzhiyun	[ $MOUNT_POINT = "/" ]
138*4882a593Smuzhiyun}
139*4882a593Smuzhiyun
140*4882a593Smuzhiyunremount_part()
141*4882a593Smuzhiyun{
142*4882a593Smuzhiyun	mountpoint -q $MOUNT_POINT || return
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun	if touch $MOUNT_POINT &>/dev/null; then
145*4882a593Smuzhiyun		[ "$1" = ro ] && mount -o remount,ro $MOUNT_POINT
146*4882a593Smuzhiyun	else
147*4882a593Smuzhiyun		[ "$1" = rw ] && mount -o remount,rw $MOUNT_POINT
148*4882a593Smuzhiyun	fi
149*4882a593Smuzhiyun}
150*4882a593Smuzhiyun
151*4882a593Smuzhiyunformat_part()
152*4882a593Smuzhiyun{
153*4882a593Smuzhiyun	echo "Formatting $DEV($FSTYPE)"
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun	case $FSGROUP in
156*4882a593Smuzhiyun		ext2)
157*4882a593Smuzhiyun			# Set max-mount-counts to 0, and disable the time-dependent checking.
158*4882a593Smuzhiyun			check_tool mke2fs BR2_PACKAGE_E2FSPROGS && \
159*4882a593Smuzhiyun			mke2fs -F -L $PART_NAME $DEV && \
160*4882a593Smuzhiyun			tune2fs -c 0 -i 0 $DEV
161*4882a593Smuzhiyun			;;
162*4882a593Smuzhiyun		vfat)
163*4882a593Smuzhiyun			# Use fat32 by default
164*4882a593Smuzhiyun			check_tool mkfs.vfat BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT && \
165*4882a593Smuzhiyun			mkfs.vfat -I -F 32 -n $PART_NAME $DEV
166*4882a593Smuzhiyun			;;
167*4882a593Smuzhiyun		ntfs)
168*4882a593Smuzhiyun			# Enable compression
169*4882a593Smuzhiyun			check_tool mkntfs BR2_PACKAGE_NTFS_3G_NTFSPROGS && \
170*4882a593Smuzhiyun			mkntfs -FCQ -L $PART_NAME $DEV
171*4882a593Smuzhiyun			;;
172*4882a593Smuzhiyun		ubifs)
173*4882a593Smuzhiyun			format_ubifs
174*4882a593Smuzhiyun			;;
175*4882a593Smuzhiyun		jffs2)
176*4882a593Smuzhiyun			check_tool mkfs.jffs2 BR2_PACKAGE_MTD_MKFSJFFS2 && \
177*4882a593Smuzhiyun			mkfs.jffs2 -o $DEV 0x10000 --pad=0x400000 -s 0x1000 -n
178*4882a593Smuzhiyun			;;
179*4882a593Smuzhiyun		squashfs)
180*4882a593Smuzhiyun			# check_tool mksquashfs BR2_PACKAGE_SQUASHFS && \
181*4882a593Smuzhiyun			# mksquashfs $DEV
182*4882a593Smuzhiyun			echo "It's pointness to format a squashfs partition..."
183*4882a593Smuzhiyun			false
184*4882a593Smuzhiyun			;;
185*4882a593Smuzhiyun		auto)
186*4882a593Smuzhiyun			echo "Unable to format a auto partition..."
187*4882a593Smuzhiyun			false
188*4882a593Smuzhiyun			;;
189*4882a593Smuzhiyun		*)
190*4882a593Smuzhiyun			echo Unsupported file system $FSTYPE for $DEV
191*4882a593Smuzhiyun			false
192*4882a593Smuzhiyun			;;
193*4882a593Smuzhiyun	esac
194*4882a593Smuzhiyun}
195*4882a593Smuzhiyun
196*4882a593Smuzhiyunformat_resize()
197*4882a593Smuzhiyun{
198*4882a593Smuzhiyun	BACKUP=$1
199*4882a593Smuzhiyun	SRC=$(realpath $MOUNT_POINT)
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun	echo "Format-resizing $DEV($FSTYPE)"
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun	echo "Backup original data"
204*4882a593Smuzhiyun	cp -a "$SRC" "$BACKUP/" || return 1
205*4882a593Smuzhiyun	umount "$SRC" || return 1
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun	echo "Format and mount rw"
208*4882a593Smuzhiyun	format_part || return 1
209*4882a593Smuzhiyun	mount_part || return 1
210*4882a593Smuzhiyun	remount_part rw
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	echo "Restore backup data"
213*4882a593Smuzhiyun	cp -a "$BACKUP/$SRC" $(dirname "$SRC") || return 1
214*4882a593Smuzhiyun}
215*4882a593Smuzhiyun
216*4882a593Smuzhiyunresize_ext2()
217*4882a593Smuzhiyun{
218*4882a593Smuzhiyun	check_tool resize2fs BR2_PACKAGE_E2FSPROGS_RESIZE2FS || return 1
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	resize2fs $DEV
221*4882a593Smuzhiyun}
222*4882a593Smuzhiyun
223*4882a593Smuzhiyunresize_vfat()
224*4882a593Smuzhiyun{
225*4882a593Smuzhiyun	check_tool fatresize BR2_PACKAGE_FATRESIZE || return 1
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun	SIZE=$(fatresize -i $DEV | grep "Size:" | grep -o "[0-9]*$")
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun	# Somehow fatresize only works for 256M+ fat
230*4882a593Smuzhiyun	[ "$SIZE" -gt $((256 * 1024 * 1024)) ] && return 1
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun	MAX_SIZE=$(( $(cat $SYS_PATH/size) * 512))
233*4882a593Smuzhiyun	MIN_SIZE=$(($MAX_SIZE - 16 * 1024 * 1024))
234*4882a593Smuzhiyun	[ $MIN_SIZE -lt $SIZE ] && return 0 # Large enough!
235*4882a593Smuzhiyun	while [ $MAX_SIZE -gt $MIN_SIZE ];do
236*4882a593Smuzhiyun		# Somehow fatresize cannot resize to max size
237*4882a593Smuzhiyun		MAX_SIZE=$(($MAX_SIZE - 512 * 1024))
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun		# Try to resize with fatresize, not always work
240*4882a593Smuzhiyun		fatresize -s $MAX_SIZE $DEV && return
241*4882a593Smuzhiyun	done
242*4882a593Smuzhiyun	return 1
243*4882a593Smuzhiyun}
244*4882a593Smuzhiyun
245*4882a593Smuzhiyunresize_ntfs()
246*4882a593Smuzhiyun{
247*4882a593Smuzhiyun	check_tool ntfsresize BR2_PACKAGE_NTFS_3G_NTFSPROGS || return 1
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun	echo y | ntfsresize -f $DEV
250*4882a593Smuzhiyun}
251*4882a593Smuzhiyun
252*4882a593Smuzhiyunresize_part()
253*4882a593Smuzhiyun{
254*4882a593Smuzhiyun	# Fixed size or already resized
255*4882a593Smuzhiyun	[ -f $MOUNT_POINT/.fixed -o -f $MOUNT_POINT/.resized ] && return
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun	if [ -z "$FSRESIZE" ]; then
258*4882a593Smuzhiyun		echo "No resize for $FSTYPE"
259*4882a593Smuzhiyun		return
260*4882a593Smuzhiyun	fi
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun	echo "Resizing $DEV($FSTYPE)"
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun	# Online resize needs read-write
265*4882a593Smuzhiyun	remount_part rw
266*4882a593Smuzhiyun	if eval $FSRESIZE; then
267*4882a593Smuzhiyun		touch $MOUNT_POINT/.resized
268*4882a593Smuzhiyun		return
269*4882a593Smuzhiyun	fi
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun	echo "Done with rootfs"
272*4882a593Smuzhiyun	is_rootfs && return
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun	echo "Fallback to format resize"
275*4882a593Smuzhiyun	TEMP_BACKUP=$(mktemp -d)
276*4882a593Smuzhiyun	format_resize $TEMP_BACKUP && touch $MOUNT_POINT/.resized
277*4882a593Smuzhiyun	rm -rf $TEMP_BACKUP
278*4882a593Smuzhiyun}
279*4882a593Smuzhiyun
280*4882a593Smuzhiyunconvert_mount_opts()
281*4882a593Smuzhiyun{
282*4882a593Smuzhiyun	# Accept all opts by default for standard mount tool
283*4882a593Smuzhiyun	if [ -z "$@" ] && [ "$(readlink $(which mount))" != busybox ]; then
284*4882a593Smuzhiyun		echo $OPTS
285*4882a593Smuzhiyun		return
286*4882a593Smuzhiyun	fi
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun	# Filter out unsupported opts
289*4882a593Smuzhiyun	for opt in ${@:-$BUSYBOX_MOUNT_OPTS}; do
290*4882a593Smuzhiyun		echo ${OPTS//,/ } | xargs -n 1 | grep -oE "^$opt$"
291*4882a593Smuzhiyun	done | tr "\n" ","
292*4882a593Smuzhiyun}
293*4882a593Smuzhiyun
294*4882a593Smuzhiyunprepare_part()
295*4882a593Smuzhiyun{
296*4882a593Smuzhiyun	# Ignore external storages
297*4882a593Smuzhiyun	case "$MOUNT_POINT" in
298*4882a593Smuzhiyun		/mnt/* | /media/*) return 1 ;;
299*4882a593Smuzhiyun	esac
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun	# Find real dev for root dev
302*4882a593Smuzhiyun	if is_rootfs; then
303*4882a593Smuzhiyun		DEV_NO=$(mountpoint -d /)
304*4882a593Smuzhiyun		DEV_NAME=$(grep -l "^$DEV_NO$" /sys/class/block/*/dev | \
305*4882a593Smuzhiyun			cut -d'/' -f5)
306*4882a593Smuzhiyun		DEV=/dev/$DEV_NAME
307*4882a593Smuzhiyun	fi
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun	DEV=$(realpath $DEV 2>/dev/null)
310*4882a593Smuzhiyun	PART_NO=$(echo $DEV | grep -oE "[0-9]*$")
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun	# Only accept block device
313*4882a593Smuzhiyun	[ -b "$DEV" ] || return 1
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun	SYS_PATH=$(echo /sys/class/*/${DEV##*/})
316*4882a593Smuzhiyun	if [ -f "$SYS_PATH/name" ]; then
317*4882a593Smuzhiyun		PART_NAME=$(cat $SYS_PATH/name)
318*4882a593Smuzhiyun	else
319*4882a593Smuzhiyun		PART_NAME=$(grep PARTNAME ${SYS_PATH}/uevent | cut -d '=' -f 2)
320*4882a593Smuzhiyun	fi
321*4882a593Smuzhiyun	PART_NAME=${PART_NAME:-${DEV##*/}}
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun	case $FSTYPE in
324*4882a593Smuzhiyun		ext[234])
325*4882a593Smuzhiyun			FSGROUP=ext2
326*4882a593Smuzhiyun			FSCK="fsck.$FSTYPE -y"
327*4882a593Smuzhiyun			FSCK_CONFIG=BR2_PACKAGE_E2FSPROGS_FSCK
328*4882a593Smuzhiyun			FSRESIZE=resize_ext2
329*4882a593Smuzhiyun			;;
330*4882a593Smuzhiyun		msdos|fat|vfat)
331*4882a593Smuzhiyun			FSGROUP=vfat
332*4882a593Smuzhiyun			FSCK="fsck.vfat -y"
333*4882a593Smuzhiyun			FSCK_CONFIG=BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT
334*4882a593Smuzhiyun			FSRESIZE=resize_vfat
335*4882a593Smuzhiyun			;;
336*4882a593Smuzhiyun		ntfs)
337*4882a593Smuzhiyun			FSGROUP=ntfs
338*4882a593Smuzhiyun			FSCK=ntfsfix
339*4882a593Smuzhiyun			FSCK_CONFIG=BR2_PACKAGE_NTFS_3G_NTFSPROGS
340*4882a593Smuzhiyun			FSRESIZE=resize_ntfs
341*4882a593Smuzhiyun			;;
342*4882a593Smuzhiyun		ubi|ubifs)
343*4882a593Smuzhiyun			FSTYPE=ubifs
344*4882a593Smuzhiyun			FSGROUP=ubifs
345*4882a593Smuzhiyun			unset FSCK
346*4882a593Smuzhiyun			unset FSRESIZE
347*4882a593Smuzhiyun			;;
348*4882a593Smuzhiyun		squashfs)
349*4882a593Smuzhiyun			FSGROUP=squashfs
350*4882a593Smuzhiyun			unset FSCK
351*4882a593Smuzhiyun			unset FSRESIZE
352*4882a593Smuzhiyun			;;
353*4882a593Smuzhiyun		jffs2)
354*4882a593Smuzhiyun			FSGROUP=jffs2
355*4882a593Smuzhiyun			unset FSCK
356*4882a593Smuzhiyun			unset FSRESIZE
357*4882a593Smuzhiyun			;;
358*4882a593Smuzhiyun		auto)
359*4882a593Smuzhiyun			FSGROUP=auto
360*4882a593Smuzhiyun			echo "Running fsck on a random fs is dangerous"
361*4882a593Smuzhiyun			unset FSCK
362*4882a593Smuzhiyun			unset FSRESIZE
363*4882a593Smuzhiyun			;;
364*4882a593Smuzhiyun		*)
365*4882a593Smuzhiyun			echo "Unsupported file system $FSTYPE for $DEV"
366*4882a593Smuzhiyun			return
367*4882a593Smuzhiyun	esac
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun	# Setup mount tool and opts
370*4882a593Smuzhiyun	case $FSGROUP in
371*4882a593Smuzhiyun		ntfs)
372*4882a593Smuzhiyun			MOUNT=ntfs-3g
373*4882a593Smuzhiyun			check_tool ntfs-3g BR2_PACKAGE_NTFS_3G || return 1
374*4882a593Smuzhiyun			OPTS=$(convert_mount_opts "$NTFS_3G_MOUNT_OPTS")
375*4882a593Smuzhiyun			;;
376*4882a593Smuzhiyun		auto)
377*4882a593Smuzhiyun			MOUNT=mount
378*4882a593Smuzhiyun			OPTS=$(convert_mount_opts)
379*4882a593Smuzhiyun			;;
380*4882a593Smuzhiyun		*)
381*4882a593Smuzhiyun			MOUNT="mount -t $FSTYPE"
382*4882a593Smuzhiyun			OPTS=$(convert_mount_opts)
383*4882a593Smuzhiyun			;;
384*4882a593Smuzhiyun	esac
385*4882a593Smuzhiyun	MOUNT_OPTS=${OPTS:+" -o ${OPTS%,}"}
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun	# Prepare for UBI
388*4882a593Smuzhiyun	if [ "$FSGROUP" = ubifs ]; then
389*4882a593Smuzhiyun		if ! prepare_ubi; then
390*4882a593Smuzhiyun			echo "Failed to prepare ubi for $DEV"
391*4882a593Smuzhiyun			[ "$AUTO_MKFS" ] || return
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun			echo "Auto formatting"
394*4882a593Smuzhiyun			format_ubifs || return
395*4882a593Smuzhiyun		fi
396*4882a593Smuzhiyun	fi
397*4882a593Smuzhiyun}
398*4882a593Smuzhiyun
399*4882a593Smuzhiyuncheck_part()
400*4882a593Smuzhiyun{
401*4882a593Smuzhiyun	[ "$SKIP_FSCK" -o "$PASS" -eq 0 ] && return
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun	if [ -z "$FSCK" ]; then
404*4882a593Smuzhiyun		echo "No fsck for $FSTYPE"
405*4882a593Smuzhiyun		return
406*4882a593Smuzhiyun	fi
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun	echo "Checking $DEV($FSTYPE)"
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun	check_tool "$FSCK" $FSCK_CONFIG || return
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun	# Fsck needs read-only
413*4882a593Smuzhiyun	remount_part ro
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun	$FSCK $DEV
416*4882a593Smuzhiyun}
417*4882a593Smuzhiyun
418*4882a593Smuzhiyunmount_part()
419*4882a593Smuzhiyun{
420*4882a593Smuzhiyun	echo "Mounting $DEV($FSTYPE) on $MOUNT_POINT ${MOUNT_OPTS:+with$MOUNT_OPTS}"
421*4882a593Smuzhiyun	$MOUNT $DEV $MOUNT_POINT $MOUNT_OPTS && return
422*4882a593Smuzhiyun	[ "$AUTO_MKFS" ] || return
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun	echo "Failed to mount $DEV, try to format it"
425*4882a593Smuzhiyun	format_part && $MOUNT $DEV $MOUNT_POINT $MOUNT_OPTS
426*4882a593Smuzhiyun}
427