Date: Wed, 18 Dec 2002 15:12:14 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: Kirk McKusick <mckusick@beastie.mckusick.com> Cc: Julian Elischer <julian@elischer.org>, Kris Kennaway <kris@obsecurity.org>, Robert Watson <rwatson@tislabs.com>, <fs@FreeBSD.ORG> Subject: Re:panic: ffs_vfree: range: dev = ad4s1c, ino = -1690809896, fs = /mnt2 Message-ID: <20021218145929.S23372-100000@gamplex.bde.org> In-Reply-To: <200212180055.gBI0tB59018624@beastie.mckusick.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> Now that the 6.0 trunk has defrosted, I have made your suggested change.
Thanks. Is the original problem now understood?
Bruce
> Date: Fri, 6 Dec 2002 20:53:55 +1100 (EST)
> From: Bruce Evans <bde@zeta.org.au>
> To: Julian Elischer <julian@elischer.org>
> cc: Kirk McKusick <mckusick@beastie.mckusick.com>,
> Kris Kennaway <kris@obsecurity.org>, Robert Watson <rwatson@tislabs.com>,
> <fs@FreeBSD.ORG>
> Subject: Re: panic: ffs_vfree: range: dev = ad4s1c, ino = -1690809896, fs =
> /mnt2
> In-Reply-To: <Pine.BSF.4.21.0212052133000.38887-100000@InterJet.elischer.org>
> X-ASK-Info: Whitelist match
>
> On Thu, 5 Dec 2002, Julian Elischer wrote:
>
> > This is one of the reasons that I think such fields should all be
> > defined as unsigned to start with..
>
> This is actually an example of why naive conversion to use unsigned is
> usually wrong. The bug seems to have nothing to do with signedness,
> except for a bug in the debugging message.
>
> > > Well it is not at all clear how the dirpref routine came up with
> > > such an out of whack inode preference (2604157400 when the filesystem
> > > has only 3538944 inodes), but the following fix should catch it and
> > > make it harmless. I have submitted the patch to release engineering.
> > >
> > > Kirk McKusick
> > >
> > > =-=-=-=-=
> > >
> > > Index: ffs_alloc.c
> > > ===================================================================
> > > RCS file: /usr/ncvs/src/sys/ufs/ffs/ffs_alloc.c,v
> > > retrieving revision 1.102
> > > diff -c -r1.102 ffs_alloc.c
> > > *** ffs_alloc.c 2002/09/19 03:55:30 1.102
> > > --- ffs_alloc.c 2002/12/06 01:15:50
> > > ***************
> > > *** 841,847 ****
> > > ipref = ffs_dirpref(pip);
> > > else
> > > ipref = pip->i_number;
> > > ! if (ipref >= fs->fs_ncg * fs->fs_ipg)
> > > ipref = 0;
> > > cg = ino_to_cg(fs, ipref);
> > > /*
> > > --- 841,847 ----
> > > ipref = ffs_dirpref(pip);
> > > else
> > > ipref = pip->i_number;
> > > ! if ((unsigned)ipref >= fs->fs_ncg * fs->fs_ipg)
> > > ipref = 0;
> > > cg = ino_to_cg(fs, ipref);
> > > /*
> > >
>
> This change has no effect on any supported system, since `ipref' is
> already an unsigned type (ino_t == uint32_t), which is in fact identical
> with unsigned on all supported systems.
>
> The analysis is slightly more complicated on exotic systems. Many
> things are broken on systems with ints smaller than 32 bits, and the
> change increases the breakage by clipping the LHS (if the filesystem
> has more than UINT_MAX inodes). The change causes at most slightly
> different signed-versus unsigned comparision warnings on systems with
> ints larger than 32 bits. The RHS multiplies 2 int32_t's and the
> multiplication may in theory overflow, but newfs presumably won't
> create filesystems for which it overflows (ones with more than 2^31-1
> inodes), so there should be no signedness problems in practice.
>
> Related cosmetic bugs:
> (1) `unsigned' is not correctly misspelled u_int.
> (2) the original panic message has a wrong function name and a wrong printf
> format for printing ino_t's.
>
> Te following patch fixes (2) and a nearby non-misspelling of `unsigned'
> (the only other one in ffs_alloc.c).
>
> %%%
> Index: ffs_alloc.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_alloc.c,v
> retrieving revision 1.103
> diff -u -2 -r1.103 ffs_alloc.c
> --- ffs_alloc.c 6 Dec 2002 02:08:46 -0000 1.103
> +++ ffs_alloc.c 6 Dec 2002 09:13:26 -0000
> @@ -1649,5 +1683,5 @@
> */
> static int
> -ffs_isfreeblock(struct fs *fs, unsigned char *cp, ufs1_daddr_t h)
> +ffs_isfreeblock(struct fs *fs, u_char *cp, ufs1_daddr_t h)
> {
>
> @@ -1897,6 +1931,6 @@
> }
> if ((u_int)ino >= fs->fs_ipg * fs->fs_ncg)
> - panic("ffs_vfree: range: dev = %s, ino = %d, fs = %s",
> - devtoname(dev), ino, fs->fs_fsmnt);
> + panic("ffs_freefile: range: dev = %s, ino = %lu, fs = %s",
> + devtoname(dev), (u_long)ino, fs->fs_fsmnt);
> if ((error = bread(devvp, cgbno, (int)fs->fs_cgsize, NOCRED, &bp))) {
> brelse(bp);
> @@ -1916,5 +1950,5 @@
> (u_long)ino + cg * fs->fs_ipg, fs->fs_fsmnt);
> if (fs->fs_ronly == 0)
> - panic("ffs_vfree: freeing free inode");
> + panic("ffs_freefile: freeing free inode");
> }
> clrbit(inosused, ino);
> %%%
>
> Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021218145929.S23372-100000>
