xref: /illumos-gate/usr/src/cmd/growfs/growfs.sh (revision f1cc607eb9fe881d3fa29a24921e6ba1b64eb7fb)
1#!/bin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License, Version 1.0 only
7# (the "License").  You may not use this file except in compliance
8# with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23
24#
25# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
26# Use is subject to license terms.
27#
28
29#exec newfs -G "$@"
30
31myname=`basename $0`
32USAGE="usage: $myname [ -M mount-point ] [ newfs-options ] raw-special-device"
33if [ ! "$UFS_MKFS" ]; then
34	UFS_MKFS="/usr/lib/fs/ufs/mkfs"
35fi
36verbose=""
37mkfs_opts="-G"
38mkfs_subopts=""
39size=""
40newsize=0
41mount_pt=
42UFS_MKFS_NOTENOUGHSPACE=33
43
44add_opt() {
45	mkfs_opts="$mkfs_opts $1"
46}
47
48add_subopt() {
49	if [ ! "$mkfs_subopts" ]; then
50		mkfs_subopts="-o $1"
51	else
52		mkfs_subopts="$mkfs_subopts,$1"
53	fi
54}
55
56while getopts "GM:Nva:b:c:d:f:i:m:n:o:r:s:t:C:" c ; do
57	save=$OPTIND
58
59	case $c in
60	G)	;;
61	M)	add_opt "-M $OPTARG"; mount_pt="$OPTARG" ;;
62	N)	add_subopt "N" ;;
63	v)	verbose="1" ;;
64	a)	add_subopt "apc=$OPTARG" ;;
65	b)	add_subopt "bsize=$OPTARG" ;;
66	c)	add_subopt "cgsize=$OPTARG" ;;
67	d)	add_subopt "gap=$OPTARG" ;;
68	f)	add_subopt "fragsize=$OPTARG" ;;
69	i)	add_subopt "nbpi=$OPTARG" ;;
70	m)	add_subopt "free=$OPTARG" ;;
71	n)	add_subopt "nrpos=$OPTARG" ;;
72	o)	add_subopt "opt=$OPTARG" ;;
73	r)	add_subopt "rps=`expr $OPTARG / 60`" ;;
74	s)	size=$OPTARG ;;
75	t)	add_subopt "ntrack=$OPTARG" ;;
76	C)	add_subopt "maxcontig=$OPTARG" ;;
77	\?)	echo $USAGE; exit 1 ;;
78	esac
79
80	OPTIND=$save
81done
82
83shift `expr $OPTIND - 1`
84if [ $# -ne 1 ]; then
85	echo $USAGE
86	exit 1
87fi
88raw_special=$1
89
90if [ ! "$size" ]; then
91	size=`devinfo -p $raw_special | awk '{ print $5 }'`
92	if [ $? -ne 0 -o ! "$size" ]; then
93		echo "$myname: cannot get partition size"
94		exit 2
95	fi
96fi
97
98cmd="$UFS_MKFS $mkfs_opts $mkfs_subopts $raw_special $size"
99if [ -n "$verbose" ]; then
100	echo $cmd
101fi
102$cmd; retv=$?
103
104if [ $retv -eq $UFS_MKFS_NOTENOUGHSPACE ]; then
105	echo "Growing filesystem in increments due to limited available space."
106
107	while [ "$newsize" -lt "$size" ]; do
108		cmd="$UFS_MKFS $mkfs_opts $mkfs_subopts -P $raw_special $size"
109		if [ -n "$verbose" ]; then
110			echo $cmd
111		fi
112		newsize=`$cmd`; retv=$?
113		if [ 0 -ne $retv -o -z "$newsize" ]; then
114			echo "$myname: cannot probe the possible file system size"
115			exit 2
116		fi
117		if [ 0 -eq "$newsize" ]; then
118			echo "$myname: the file system is full and cannot be grown, please delete some files"
119			exit 2
120		fi
121
122		cmd="$UFS_MKFS $mkfs_opts $mkfs_subopts $raw_special $newsize"; retv=$?
123		if [ -n "$verbose" ]; then
124			echo $cmd
125		fi
126		$cmd; retv=$?
127		if [ 0 -ne $retv ]; then
128			echo "$myname: cannot grow file system to $newsize sectors"
129			exit  $retv
130		fi
131	done
132	echo \
133"\nThe incremental grow has successfully completed, but since the first growth \
134attempt failed (see output from first mkfs(1M) run), the filesystem is still \
135locked and needs to be checked with fsck(1M).\n\
136Please run \`fsck -F ufs $raw_special' and then unlock the filesystem \
137with \`lockfs -u $mount_pt'." | fmt;
138
139fi
140
141exit $retv
142