Date: Mon, 21 Apr 2003 03:23:41 -0700 From: David Schultz <das@FreeBSD.org> To: Robert Watson <rwatson@FreeBSD.org> Cc: David O'Brien <obrien@FreeBSD.org> Subject: Re: HEADS UP: UFS2 now the default creation type on 5.0-CURRENT Message-ID: <20030421102341.GA3482@HAL9000.homeunix.com> In-Reply-To: <Pine.NEB.3.96L.1030420174551.16891t-100000@fledge.watson.org> References: <20030420192319.GB4963@HAL9000.homeunix.com> <Pine.NEB.3.96L.1030420174551.16891t-100000@fledge.watson.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Apr 20, 2003, Robert Watson wrote: > > On Sun, 20 Apr 2003, David Schultz wrote: > > > On Sun, Apr 20, 2003, David O'Brien wrote: > > > On Sun, Apr 20, 2003 at 11:31:21AM -0400, Robert Watson wrote: > > > > There were initially some size glitches because UFS2 required additional > > > > 64-bit operations in the boot record, and that exceeded the space at the > > > > front of the file system, but I believe that has now been resolved. > > > > > > s/resolved/hacked around/ > > [...] > > > revision 1.10 > > > date: 2003-02-24 04:57:01; author: mckusick; state: Exp; lines: +2 -0 > > > Revert to old (broken for over 1.5Tb filesystems) version of cgbase > > > so that boot loader once again will fit. > > > > It might be worth noting the size limit on the root filesystem somewhere > > for the unfortunate person who decides not to partition. > > Clarification question: is it only the size of the root file system that > is limited, or is it also the location of the root file system on the > disk? The cgbase hack should only limit the size of the filesystem, not the disk location. It occurs to me that with a little more hackery, we can avoid the limitation entirely. If we revert to the 64-bit cgbase() and un-inline it, boot2 goes from 19 bytes available to -9 bytes. Add a kludge to factor out a few 64-bit multiply-adds and we're back to 3 bytes available. (I'm sure there are cleaner ways to save 9 bytes.) An untested unpolished diff follows. Index: ufsread.c =================================================================== RCS file: /cvs/src/sys/boot/common/ufsread.c,v retrieving revision 1.11 diff -u -r1.11 ufsread.c --- ufsread.c 25 Feb 2003 00:10:20 -0000 1.11 +++ ufsread.c 21 Apr 2003 10:10:01 -0000 @@ -32,8 +32,20 @@ /* XXX: Revert to old (broken for over 1.5Tb filesystems) version of cgbase (see sys/ufs/ffs/fs.h rev 1.39) so that i386 boot loader (boot2) can support both UFS1 and UFS2 again. */ +ufs2_daddr_t +__cgbase(struct fs *fs, int32_t c) +{ + return cgbase(fs, c); +} #undef cgbase -#define cgbase(fs, c) ((ufs2_daddr_t)((fs)->fs_fpg * (c))) +#define cgbase __cgbase + +ufs2_daddr_t +ma(uint32_t a, uint32_t b, ufs2_daddr_t c) +{ + return ((ufs2_daddr_t)a * b) + c; +} + #endif /* @@ -47,11 +59,11 @@ #define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize >> VBLKSHIFT)) #define IPERVBLK(fs) (INOPB(fs) / ((fs)->fs_bsize >> VBLKSHIFT)) #define INO_TO_VBA(fs, ipervblk, x) \ - (fsbtodb(fs, cgimin(fs, ino_to_cg(fs, x))) + \ - (((x) % (fs)->fs_ipg) / (ipervblk) * DBPERVBLK)) + ma(((x) % (fs)->fs_ipg) / (ipervblk), DBPERVBLK, \ + fsbtodb(fs, cgimin(fs, ino_to_cg(fs, x)))) #define INO_TO_VBO(ipervblk, x) ((x) % ipervblk) -#define FS_TO_VBA(fs, fsb, off) (fsbtodb(fs, fsb) + \ - ((off) / VBLKSIZE) * DBPERVBLK) +#define FS_TO_VBA(fs, fsb, off) ma((off) / VBLKSIZE, DBPERVBLK, \ + fsbtodb((fs), (fsb))) #define FS_TO_VBO(fs, fsb, off) ((off) & VBLKMASK) /* Buffers that must not span a 64k boundary. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030421102341.GA3482>