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>
