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