[linux-lvm] [PATCH 01/35] fsadm: Add "create" command

Lukas Czerner lczerner at redhat.com
Wed Sep 21 16:45:20 UTC 2011


Create command provides the functionality of creating a new logical
volumes including defined file system.

This commit also changes the way how are commands recognised an
executed. The new approach is more suitable for bigger number of
commands.

Signed-off-by: Lukas Czerner <lczerner at redhat.com>
---
 scripts/fsadm.sh |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 131 insertions(+), 9 deletions(-)

diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
index c8cc5e0..42c7da4 100755
--- a/scripts/fsadm.sh
+++ b/scripts/fsadm.sh
@@ -29,7 +29,7 @@
 #   2 break detected
 #   3 unsupported online filesystem check for given mounted fs
 
-TOOL=fsadm
+TOOL=$(basename $0)
 
 _SAVEPATH=$PATH
 PATH=/sbin:/usr/sbin:/bin:/usr/sbin:$PATH
@@ -76,6 +76,8 @@ REMOUNT=
 PROCMOUNTS="/proc/mounts"
 NULL="$DM_DEV_DIR/null"
 
+MAX_VGS=999
+
 IFS_OLD=$IFS
 # without bash $'\n'
 NL='
@@ -122,6 +124,14 @@ dry() {
 	fi
 	verbose "Executing $@"
 	$@
+	if [ $? -ne 0 ]; then
+		error "FAILED. Exitting!"
+	fi
+}
+
+is_natural() {
+	test "$1" -ge 0 &> /dev/null && return 1
+	return 0
 }
 
 cleanup() {
@@ -365,12 +375,42 @@ resize_xfs() {
 	fi
 }
 
+make_ext() {
+	device=$1
+	fstyp=$2
+	stripe=$3
+	stripesize=$4
+	bsize=4
+
+	if [ "$YES" ]; then
+		force="-F"
+	fi
+	stride=$(($stripesize/$bsize))
+	stripewidth=$(($stride*$stripe))
+
+	dry mkfs.$fstyp $force -b$(($bsize*1024)) -E stride=${stride},stripe-width=${stripewidth} $device
+}
+
+generic_make_fs() {
+	device=$1
+	fstyp=$2
+	bsize=4096
+
+	if [ "$YES" ]; then
+		force="-f"
+	fi
+
+	dry mkfs.$fstyp $force $device
+}
+
 ####################
 # Resize filesystem
 ####################
 resize() {
 	NEWSIZE=$2
 	detect_fs "$1"
+	is_natural $NEWSIZE
+	[ $? -ne 1 ] && error "$NEWSIZE is not valid number for file system size"
 	detect_device_size
 	verbose "Device \"$VOLUME\" size is $DEVSIZE bytes"
 	# if the size parameter is missing use device size
@@ -386,6 +426,89 @@ resize() {
 	cleanup 0
 }
 
+name_exists() {
+	cmd=$1
+	search=$2
+	$LVM $cmd --separator ' ' 2>&1 | tail -n-1 | cut -d' ' -f3 | grep $search 2>&1> /dev/null
+	if [ $? -eq 0 ]; then
+		return 1
+	fi
+	return 0
+}
+
+#############################
+# Create a new logical volume
+#############################
+create() {
+	size="-l 100%FREE"
+	devcount=0
+
+	for i in $@; do
+		if [ -b $i ]; then
+			devices="$devices $i"
+			devcount=$(($devcount+1))
+			continue
+		fi
+		case $i in
+			"stripesize"* | "chunksize"*) stripesize=${i##*=} ;;
+			"name"*) name="--name ${i##*=}" ;;
+			"fstyp"*) fstyp=${i##*=} ;;
+			"size"*) size="-L ${i##*=}" ;;
+			*) error "Wrong option $i. (see: $TOOL --help)"
+		esac
+	done
+
+	for i in $(seq -w $MAX_VGS); do
+		name_exists vgs vg${i}
+		if [ $? -eq 0 ]; then
+			vgname="vg${i}"
+			break;
+		fi
+	done
+
+	[ -z "$vgname" ] && error "No suitable name for volume group found."
+	[ $devcount -eq 0 ] && error "No suitable device specified."
+
+	if [ "$stripesize" ]; then
+		striped="-i $devcount -I $stripesize"
+	fi
+
+	if [ "$name" ]; then
+		lvname="--name $name"
+	else
+		for i in $(seq -w $MAX_VGS); do
+			name_exists "vgs $vgname" lvol${i}
+			if [ $? -eq 0 ]; then
+				name="lvol${i}"
+				lvname="--name $name"
+				break;
+			fi
+		done
+	fi
+
+	dry $LVM vgcreate $VERB $vgname $devices
+	dry $LVM lvcreate $VERB $lvname $size $striped $vgname
+	device="/dev/${vgname}/${name}"
+
+	guess=0
+	echo "$fstyp"
+	if [ -z $fstyp ]; then
+		fstyp=$(echo $TOOL | sed 's/^.*\.//g')
+		guess=1
+	fi
+
+	case $fstyp in
+		ext[234]) make_ext $device $fstyp $devcount $stripesize ;;
+		xfs|reiserfs) generic_make_fs $device $fstyp;;
+		*)	if [ $guess -eq 1 ]; then
+				return 0
+			else
+				error "Filesystem $fstyp is not supported"
+			fi
+			;;
+	esac
+}
+
 ####################################
 # Calclulate diff between two dates
 #  LANG=C input is expected the
@@ -477,18 +600,17 @@ do
 	  "-e"|"--ext-offline") EXTOFF=1 ;;
 	  "-y"|"--yes") YES="-y" ;;
 	  "-l"|"--lvresize") DO_LVRESIZE=1 ;;
-	  "check") CHECK="$2" ; shift ;;
-	  "resize") RESIZE="$2"; NEWSIZE="$3" ; shift 2 ;;
+	  "check") COMMAND=$1; shift; ARGS=$@; break ;;
+	  "resize") COMMAND=$1; shift; ARGS=$@; break ;;
+	  "create") COMMAND=$1; shift; ARGS=$@; break ;;
 	  *) error "Wrong argument \"$1\". (see: $TOOL --help)"
 	esac
 	shift
 done
 
-if [ -n "$CHECK" ]; then
-	check "$CHECK"
-elif [ -n "$RESIZE" ]; then
-	export FSADM_RUNNING="fsadm"
-	resize "$RESIZE" "$NEWSIZE"
-else
+if [ -z $COMMAND ]; then
 	error "Missing command. (see: $TOOL --help)"
 fi
+
+export FSADM_RUNNING="fsadm"
+$COMMAND $ARGS
-- 
1.7.4.4




More information about the linux-lvm mailing list