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