18a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#!/bin/sh
28a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#
38a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# Copyright (c) 2015 Fujitsu Ltd.
48a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
58a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#
68a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# This program is free software; you can redistribute it and/or modify
78a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# it under the terms of the GNU General Public License as published by
88a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# the Free Software Foundation; either version 2 of the License, or
98a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# (at your option) any later version.
108a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#
118a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# This program is distributed in the hope that it will be useful,
128a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# but WITHOUT ANY WARRANTY; without even the implied warranty of
138a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
148a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# the GNU General Public License for more details.
158a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#
168a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng# Test mkfs command with some basic options.
178a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng#
188a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
19353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_CNT=5
20353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_SETUP=setup
21353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_TESTFUNC=test
22353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_OPTS="f:"
23353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_USAGE=usage
24353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_PARSE_ARGS=parse_args
25353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_NEEDS_ROOT=1
26353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_NEEDS_TMPDIR=1
27353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_NEEDS_DEVICE=1
28353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisTST_NEEDS_CMDS="blkid df"
29353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis. tst_test.sh
308a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
31353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubisusage()
328a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
33353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis	cat << EOF
34353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubisusage: $0 [-f <ext2|ext3|ext4|vfat|...>]
358a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
36353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisOPTIONS
37353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis-f	Specify the type of filesystem to be built.  If not
38353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis	specified, the default filesystem type (currently ext2)
39353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis	is used.
40353597d789ed6573d04459c23946b9a4289e4bc7Cyril HrubisEOF
41353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis}
428a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
43353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubisparse_args()
44353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis{
45353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis	FS_TYPE="$2"
46353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis}
47353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis
48353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubissetup()
49353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis{
508a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -n "$FS_TYPE" ]; then
518a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		tst_check_cmds mkfs.${FS_TYPE}
528a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
538a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
548a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	ROD_SILENT mkdir -p mntpoint
558a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
568a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
578a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengmkfs_mount()
588a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
598a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mount ${TST_DEVICE} mntpoint
608a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local ret=$?
618a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ $ret -eq 32 ]; then
62353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis		tst_brk TCONF "Cannot mount ${FS_TYPE}, missing driver?"
638a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
648a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
658a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ $ret -ne 0 ]; then
66353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis		tst_brk TBROK "Failed to mount device: mount exit = $ret"
678a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
688a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
698a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
708a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengmkfs_verify_type()
718a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
728a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -z "$1" ]; then
738a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		blkid $2 -t TYPE="ext2" >/dev/null
748a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	else
758a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ "$1" = "msdos" ]; then
766be6bb56f02d662952860ebcbfc2f1a2355e8705Rock Lee			blkid $2 -t TYPE="vfat" >/dev/null
778a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		else
788a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			blkid $2 -t TYPE="$1" >/dev/null
798a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
808a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
818a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
828a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
838a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengmkfs_verify_size()
848a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
858a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_mount
86c6ef4403f944e6df5610ec3f845ce056106be6acStanislav Kholmanskikh	local blocknum=`df -P -B 1k mntpoint | tail -n1 | awk '{print $2}'`
87c615f1127383eec550e86785ed7cb20b61eb8268Cyril Hrubis	tst_umount "$TST_DEVICE"
888a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
898a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ $blocknum -gt "$2" ]; then
908a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		return 1
918a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
928a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
938a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	# Size argument in mkfs.ntfs denotes number-of-sectors which is 512bytes,
948a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	# 1k-block size should be devided by this argument for ntfs verification.
958a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ "$1" = "ntfs" ]; then
968a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		local rate=1024/512
9702efa0309e3754a092c03d4e645e81275771f75eLucas Magasweran		if [ $blocknum -lt "$(($2/$rate*9/10))" ]; then
988a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return 1
998a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1008a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	else
1018a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ $blocknum -lt "$(($2*9/10))" ]; then
1028a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return 1
1038a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1048a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1058a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1068a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	return 0
1078a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1088a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1098a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengmkfs_test()
1108a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1118a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local mkfs_op=$1
1128a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local fs_type=$2
1138a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local fs_op=$3
1148a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local device=$4
1158a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local size=$5
1168a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1178a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -n "$fs_type" ]; then
1188a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		mkfs_op="-t $fs_type"
1198a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1208a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1218a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
1228a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fs_op="$fs_op -f"
1238a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1248a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1258a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	local mkfs_cmd="mkfs $mkfs_op $fs_op $device $size"
1268a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1278a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	echo ${fs_op} | grep -q "\-c"
1288a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ $? -eq 0 ] && [ "$fs_type" = "ntfs" ]; then
129353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis		tst_res TCONF "'${mkfs_cmd}' not supported."
1308a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		return
1318a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1328a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1338a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -n "$size" ]; then
1348a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
135353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis			tst_res TCONF "'${mkfs_cmd}' not supported."
1368a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return
1378a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1388a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1398a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1408a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	${mkfs_cmd} >temp 2>&1
1418a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ $? -ne 0 ]; then
1428a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		grep -q -E "unknown option | invalid option" temp
1438a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ $? -eq 0 ]; then
144353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis			tst_res TCONF "'${mkfs_cmd}' not supported."
1458a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return
1468a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		else
147353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis			tst_res TFAIL "'${mkfs_cmd}' failed."
1488a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			cat temp
1498a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return
1508a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1518a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1528a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1538a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -n "$device" ]; then
1548a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		mkfs_verify_type "$fs_type" "$device"
1558a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ $? -ne 0 ]; then
156353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis			tst_res TFAIL "'${mkfs_cmd}' failed, not expected."
1578a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return
1588a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1598a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1608a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1618a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	if [ -n "$size" ]; then
1628a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		mkfs_verify_size "$fs_type" "$size"
1638a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		if [ $? -ne 0 ]; then
164353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis			tst_res TFAIL "'${mkfs_cmd}' failed, not expected."
1658a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng			return
1668a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng		fi
1678a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	fi
1688a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
169353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubis	tst_res TPASS "'${mkfs_cmd}' passed."
1708a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1718a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1728a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengtest1()
1738a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1748a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_test "" "$FS_TYPE" "" "$TST_DEVICE"
1758a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1768a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1778a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengtest2()
1788a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1798a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_test "" "$FS_TYPE" "" "$TST_DEVICE" "16000"
1808a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1818a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1828a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengtest3()
1838a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1848a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_test "" "$FS_TYPE" "-c" "$TST_DEVICE"
1858a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1868a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1878a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengtest4()
1888a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1898a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_test "-V"
1908a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1918a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
1928a95b719259f489bf50e1642498ecbda99662f90Guangwen Fengtest5()
1938a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng{
1948a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng	mkfs_test "-h"
1958a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng}
1968a95b719259f489bf50e1642498ecbda99662f90Guangwen Feng
197353597d789ed6573d04459c23946b9a4289e4bc7Cyril Hrubistst_run
198