From owner-freebsd-bugs@FreeBSD.ORG Sat Apr 26 10:50:20 2003 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 67C9F37B401 for ; Sat, 26 Apr 2003 10:50:20 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id E068743F93 for ; Sat, 26 Apr 2003 10:50:19 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id h3QHoJUp082092 for ; Sat, 26 Apr 2003 10:50:19 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id h3QHoJ1V082089; Sat, 26 Apr 2003 10:50:19 -0700 (PDT) Date: Sat, 26 Apr 2003 10:50:19 -0700 (PDT) Message-Id: <200304261750.h3QHoJ1V082089@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Lukas Ertl Subject: Re: bin/51138: [PATCH] re-enable growfs(8) to work on vinum volumes in -CURRENT X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Lukas Ertl List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Apr 2003 17:50:20 -0000 The following reply was made to PR bin/51138; it has been noted by GNATS. From: Lukas Ertl To: freebsd-gnats-submit@FreeBSD.org, l.ertl@univie.ac.at, freebsd-bugs@FreeBSD.org Cc: Subject: Re: bin/51138: [PATCH] re-enable growfs(8) to work on vinum volumes in -CURRENT Date: Sat, 26 Apr 2003 19:45:04 +0200 (CEST) This is an updated patch that applies to rev. 1.14 of growfs.c. I'd really appreciate it if someone could take a look at it, because I think it should go into 5.1. --- growfs.c.diff begins here --- Index: sbin/growfs/growfs.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /u/cvs/cvs/src/sbin/growfs/growfs.c,v retrieving revision 1.14 diff -u -r1.14 growfs.c --- sbin/growfs/growfs.c=0926 Apr 2003 15:22:29 -0000=091.14 +++ sbin/growfs/growfs.c=0926 Apr 2003 17:40:30 -0000 @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -110,6 +111,7 @@ static ufs2_daddr_t =09inoblk;=09=09=09/* inode block address */ static char=09=09inobuf[MAXBSIZE];=09/* inode block */ static int=09=09maxino;=09=09=09/* last valid inode */ +static int=09=09unlabeled; /* unlabeled partition, e.g. vinum volume e= tc. */ /* * An array of elements of type struct gfs_bpp describes all blocks to @@ -148,6 +150,7 @@ static void=09updrefs(int, ino_t, struct gfs_bpp *, int, int, unsigned int= ); static void=09indirchk(ufs_lbn_t, ufs_lbn_t, ufs2_daddr_t, ufs_lbn_t, =09=09 struct gfs_bpp *, int, int, unsigned int); +static void=09get_dev_size(int, int *); /* ************************************************************ growfs ***= ** */ /* @@ -1880,6 +1883,28 @@ =09return columns; } +/* ****************************************************** get_dev_size ***= ** */ +/* + * Get the size of the partition if we can't figure it out from the diskla= bel, + * e.g. from vinum volumes. + */ +static void +get_dev_size(int fd, int *size) +{ + int sectorsize; + off_t mediasize; + + if (ioctl(fd, DIOCGSECTORSIZE, §orsize) =3D=3D -1) + err(1,"DIOCGSECTORSIZE"); + if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) =3D=3D -1) + err(1,"DIOCGMEDIASIZE"); + + if (sectorsize <=3D 0) + errx(1, "bogus sectorsize: %d", sectorsize); + + *size =3D mediasize / sectorsize; +} + /* ************************************************************** main ***= ** */ /* * growfs(8) is a utility which allows to increase the size of an existin= g @@ -1917,6 +1942,7 @@ =09struct disklabel=09*lp; =09struct partition=09*pp; =09int=09i,fsi,fso; + u_int32_t p_size; =09char=09reply[5]; #ifdef FSMAXSNAP =09int=09j; @@ -2016,25 +2042,30 @@ =09 */ =09cp=3Ddevice+strlen(device)-1; =09lp =3D get_disklabel(fsi); -=09if(lp->d_type =3D=3D DTYPE_VINUM) { -=09=09pp =3D &lp->d_partitions[0]; -=09} else if (isdigit(*cp)) { -=09=09pp =3D &lp->d_partitions[2]; -=09} else if (*cp>=3D'a' && *cp<=3D'h') { -=09=09pp =3D &lp->d_partitions[*cp - 'a']; -=09} else { -=09=09errx(1, "unknown device"); -=09} + if (lp !=3D NULL) { + if (isdigit(*cp)) { + pp =3D &lp->d_partitions[2]; + } else if (*cp>=3D'a' && *cp<=3D'h') { + pp =3D &lp->d_partitions[*cp - 'a']; + } else { + errx(1, "unknown device"); + } + p_size =3D pp->p_size; + } else { + get_dev_size(fsi, &p_size); + } =09/* =09 * Check if that partition is suitable for growing a file system. =09 */ -=09if (pp->p_size < 1) { +=09if (p_size < 1) { =09=09errx(1, "partition is unavailable"); =09} +/* =09if (pp->p_fstype !=3D FS_BSDFFS) { =09=09errx(1, "partition not 4.2BSD"); =09} +*/ =09/* =09 * Read the current superblock, and take a backup. @@ -2063,11 +2094,11 @@ =09 * Determine size to grow to. Default to the full size specified in =09 * the disk label. =09 */ -=09sblock.fs_size =3D dbtofsb(&osblock, pp->p_size); +=09sblock.fs_size =3D dbtofsb(&osblock, p_size); =09if (size !=3D 0) { -=09=09if (size > pp->p_size){ +=09=09if (size > p_size){ =09=09=09errx(1, "There is not enough space (%d < %d)", -=09=09=09 pp->p_size, size); +=09=09=09 p_size, size); =09=09} =09=09sblock.fs_size =3D dbtofsb(&osblock, size); =09} @@ -2117,7 +2148,7 @@ =09 * later on realize we have to abort our operation, on that block =09 * there should be no data, so we can't destroy something yet. =09 */ -=09wtfs((ufs2_daddr_t)pp->p_size-1, (size_t)DEV_BSIZE, (void *)&sblock, +=09wtfs((ufs2_daddr_t)p_size-1, (size_t)DEV_BSIZE, (void *)&sblock, =09 fso, Nflag); =09/* @@ -2178,12 +2209,14 @@ =09/* =09 * Update the disk label. =09 */ -=09pp->p_fsize =3D sblock.fs_fsize; -=09pp->p_frag =3D sblock.fs_frag; -=09pp->p_cpg =3D sblock.fs_fpg; - -=09return_disklabel(fso, lp, Nflag); -=09DBG_PRINT0("label rewritten\n"); + if (!unlabeled) { + pp->p_fsize =3D sblock.fs_fsize; + pp->p_frag =3D sblock.fs_frag; + pp->p_cpg =3D sblock.fs_fpg; + + return_disklabel(fso, lp, Nflag); + DBG_PRINT0("label rewritten\n"); + } =09close(fsi); =09if(fso>-1) close(fso); @@ -2247,15 +2280,16 @@ =09DBG_ENTER; =09lab=3D(struct disklabel *)malloc(sizeof(struct disklabel)); -=09if (!lab) { +=09if (!lab) =09=09errx(1, "malloc failed"); -=09} -=09if (ioctl(fd, DIOCGDINFO, (char *)lab) < 0) { -=09=09errx(1, "DIOCGDINFO failed"); -=09} + + if (!ioctl(fd, DIOCGDINFO, (char *)lab)) + return (lab); + + unlabeled++; =09DBG_LEAVE; -=09return (lab); +=09return (NULL); } --- growfs.c.diff ends here --- --=20 Lukas Ertl eMail: l.ertl@univie.ac.at UNIX-Systemadministrator Tel.: (+43 1) 4277-14073 Zentraler Informatikdienst (ZID) Fax.: (+43 1) 4277-9140 der Universit=E4t Wien http://mailbox.univie.ac.at/~le/