xref: /illumos-gate/usr/src/cmd/growfs/growfs.sh (revision bbf21555)
19717555dSYuri Pankov#!/bin/sh
29717555dSYuri Pankov#
39717555dSYuri Pankov# CDDL HEADER START
49717555dSYuri Pankov#
59717555dSYuri Pankov# The contents of this file are subject to the terms of the
69717555dSYuri Pankov# Common Development and Distribution License, Version 1.0 only
79717555dSYuri Pankov# (the "License").  You may not use this file except in compliance
89717555dSYuri Pankov# with the License.
99717555dSYuri Pankov#
109717555dSYuri Pankov# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
119717555dSYuri Pankov# or http://www.opensolaris.org/os/licensing.
129717555dSYuri Pankov# See the License for the specific language governing permissions
139717555dSYuri Pankov# and limitations under the License.
149717555dSYuri Pankov#
159717555dSYuri Pankov# When distributing Covered Code, include this CDDL HEADER in each
169717555dSYuri Pankov# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
179717555dSYuri Pankov# If applicable, add the following below this CDDL HEADER, with the
189717555dSYuri Pankov# fields enclosed by brackets "[]" replaced with your own identifying
199717555dSYuri Pankov# information: Portions Copyright [yyyy] [name of copyright owner]
209717555dSYuri Pankov#
219717555dSYuri Pankov# CDDL HEADER END
229717555dSYuri Pankov#
239717555dSYuri Pankov
249717555dSYuri Pankov#
259717555dSYuri Pankov# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
269717555dSYuri Pankov# Use is subject to license terms.
279717555dSYuri Pankov#
289717555dSYuri Pankov
299717555dSYuri Pankov#exec newfs -G "$@"
309717555dSYuri Pankov
319717555dSYuri Pankovmyname=`basename $0`
329717555dSYuri PankovUSAGE="usage: $myname [ -M mount-point ] [ newfs-options ] raw-special-device"
339717555dSYuri Pankovif [ ! "$UFS_MKFS" ]; then
349717555dSYuri Pankov	UFS_MKFS="/usr/lib/fs/ufs/mkfs"
359717555dSYuri Pankovfi
369717555dSYuri Pankovverbose=""
379717555dSYuri Pankovmkfs_opts="-G"
389717555dSYuri Pankovmkfs_subopts=""
399717555dSYuri Pankovsize=""
409717555dSYuri Pankovnewsize=0
419717555dSYuri Pankovmount_pt=
429717555dSYuri PankovUFS_MKFS_NOTENOUGHSPACE=33
439717555dSYuri Pankov
449717555dSYuri Pankovadd_opt() {
459717555dSYuri Pankov	mkfs_opts="$mkfs_opts $1"
469717555dSYuri Pankov}
479717555dSYuri Pankov
489717555dSYuri Pankovadd_subopt() {
499717555dSYuri Pankov	if [ ! "$mkfs_subopts" ]; then
509717555dSYuri Pankov		mkfs_subopts="-o $1"
519717555dSYuri Pankov	else
529717555dSYuri Pankov		mkfs_subopts="$mkfs_subopts,$1"
539717555dSYuri Pankov	fi
549717555dSYuri Pankov}
559717555dSYuri Pankov
569717555dSYuri Pankovwhile getopts "GM:Nva:b:c:d:f:i:m:n:o:r:s:t:C:" c ; do
579717555dSYuri Pankov	save=$OPTIND
589717555dSYuri Pankov
599717555dSYuri Pankov	case $c in
609717555dSYuri Pankov	G)	;;
619717555dSYuri Pankov	M)	add_opt "-M $OPTARG"; mount_pt="$OPTARG" ;;
629717555dSYuri Pankov	N)	add_subopt "N" ;;
639717555dSYuri Pankov	v)	verbose="1" ;;
649717555dSYuri Pankov	a)	add_subopt "apc=$OPTARG" ;;
659717555dSYuri Pankov	b)	add_subopt "bsize=$OPTARG" ;;
669717555dSYuri Pankov	c)	add_subopt "cgsize=$OPTARG" ;;
679717555dSYuri Pankov	d)	add_subopt "gap=$OPTARG" ;;
689717555dSYuri Pankov	f)	add_subopt "fragsize=$OPTARG" ;;
699717555dSYuri Pankov	i)	add_subopt "nbpi=$OPTARG" ;;
709717555dSYuri Pankov	m)	add_subopt "free=$OPTARG" ;;
719717555dSYuri Pankov	n)	add_subopt "nrpos=$OPTARG" ;;
729717555dSYuri Pankov	o)	add_subopt "opt=$OPTARG" ;;
739717555dSYuri Pankov	r)	add_subopt "rps=`expr $OPTARG / 60`" ;;
749717555dSYuri Pankov	s)	size=$OPTARG ;;
759717555dSYuri Pankov	t)	add_subopt "ntrack=$OPTARG" ;;
769717555dSYuri Pankov	C)	add_subopt "maxcontig=$OPTARG" ;;
779717555dSYuri Pankov	\?)	echo $USAGE; exit 1 ;;
789717555dSYuri Pankov	esac
799717555dSYuri Pankov
809717555dSYuri Pankov	OPTIND=$save
819717555dSYuri Pankovdone
829717555dSYuri Pankov
839717555dSYuri Pankovshift `expr $OPTIND - 1`
849717555dSYuri Pankovif [ $# -ne 1 ]; then
859717555dSYuri Pankov	echo $USAGE
869717555dSYuri Pankov	exit 1
879717555dSYuri Pankovfi
889717555dSYuri Pankovraw_special=$1
899717555dSYuri Pankov
909717555dSYuri Pankovif [ ! "$size" ]; then
919717555dSYuri Pankov	size=`devinfo -p $raw_special | awk '{ print $5 }'`
929717555dSYuri Pankov	if [ $? -ne 0 -o ! "$size" ]; then
939717555dSYuri Pankov		echo "$myname: cannot get partition size"
949717555dSYuri Pankov		exit 2
959717555dSYuri Pankov	fi
969717555dSYuri Pankovfi
979717555dSYuri Pankov
989717555dSYuri Pankovcmd="$UFS_MKFS $mkfs_opts $mkfs_subopts $raw_special $size"
999717555dSYuri Pankovif [ -n "$verbose" ]; then
1009717555dSYuri Pankov	echo $cmd
1019717555dSYuri Pankovfi
1029717555dSYuri Pankov$cmd; retv=$?
1039717555dSYuri Pankov
1049717555dSYuri Pankovif [ $retv -eq $UFS_MKFS_NOTENOUGHSPACE ]; then
1059717555dSYuri Pankov	echo "Growing filesystem in increments due to limited available space."
1069717555dSYuri Pankov
1079717555dSYuri Pankov	while [ "$newsize" -lt "$size" ]; do
1089717555dSYuri Pankov		cmd="$UFS_MKFS $mkfs_opts $mkfs_subopts -P $raw_special $size"
1099717555dSYuri Pankov		if [ -n "$verbose" ]; then
1109717555dSYuri Pankov			echo $cmd
1119717555dSYuri Pankov		fi
1129717555dSYuri Pankov		newsize=`$cmd`; retv=$?
1139717555dSYuri Pankov		if [ 0 -ne $retv -o -z "$newsize" ]; then
1149717555dSYuri Pankov			echo "$myname: cannot probe the possible file system size"
1159717555dSYuri Pankov			exit 2
1169717555dSYuri Pankov		fi
1179717555dSYuri Pankov		if [ 0 -eq "$newsize" ]; then
1189717555dSYuri Pankov			echo "$myname: the file system is full and cannot be grown, please delete some files"
1199717555dSYuri Pankov			exit 2
1209717555dSYuri Pankov		fi
1219717555dSYuri Pankov
1229717555dSYuri Pankov		cmd="$UFS_MKFS $mkfs_opts $mkfs_subopts $raw_special $newsize"; retv=$?
1239717555dSYuri Pankov		if [ -n "$verbose" ]; then
1249717555dSYuri Pankov			echo $cmd
1259717555dSYuri Pankov		fi
1269717555dSYuri Pankov		$cmd; retv=$?
1279717555dSYuri Pankov		if [ 0 -ne $retv ]; then
1289717555dSYuri Pankov			echo "$myname: cannot grow file system to $newsize sectors"
1299717555dSYuri Pankov			exit  $retv
1309717555dSYuri Pankov		fi
1319717555dSYuri Pankov	done
1329717555dSYuri Pankov	echo \
1339717555dSYuri Pankov"\nThe incremental grow has successfully completed, but since the first growth \
134*bbf21555SRichard Loweattempt failed (see output from first mkfs(8) run), the filesystem is still \
135*bbf21555SRichard Lowelocked and needs to be checked with fsck(8).\n\
1369717555dSYuri PankovPlease run \`fsck -F ufs $raw_special' and then unlock the filesystem \
1379717555dSYuri Pankovwith \`lockfs -u $mount_pt'." | fmt;
1389717555dSYuri Pankov
1399717555dSYuri Pankovfi
1409717555dSYuri Pankov
1419717555dSYuri Pankovexit $retv
142