Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Aug 1999 14:46:01 -0700 (PDT)
From:      Julian Elischer <julian@whistle.com>
To:        fs@freebsd.org
Subject:   BUG in 3.2 fsck! (fwd)
Message-ID:  <Pine.BSF.3.95.990819144407.13522H-100000@current1.whistle.com>

next in thread | raw e-mail | index | archive | help
FS types..

thoughts?

An ex collegue writes to me:

-------------------------------------------
I have created and am testing an fsck version which will make lost+found much
larger (until it fills the first indirect disk page) and which has the ability
to suppress output for errors fixed by preen (which is not exactly what I
proposed before but which achieves the same end with less code and less risk).

It isn't really time yet to discuss merging these features into freeBSD, but I
think that day will come.  What this mail is really about is a bug in fsck.  I
am not currently competent to submit the fix or to even be positive that the
bug is current.  I think this is a potentially serious bug in the current
sources.  Are you interested?

BUG IN FSCK:

When the 3.2 version of fsck has to create the lost+found directory, it may
fail to flag the appropriate inode busy!

Patch: mkdir lost+found in the root directory of all your file systems.

Discussion: fsck allocates only enough space to keep track of the first inodes
in each cylinder group.  This is clever and good - inode usage tends to occur
at the front of the cylinder group and this saves space.  Unfortunately, it
does not work out well when a directory is created which increases the highest
inode number for the cylinder group - the inode usage doesn't get recorded in
the right place and the inode will be flagged available during pass 5.

Fix: The code change causes fsck to check the cylinder group allocation when
adding an inode and expand the inode list for the cylinder group if necessary.

In inode.c::allocino (near line 605):
    for (ino = request; ino < maxino; ino++)
        if (inoinfo(ino)->ino_state == USTATE)
            break;
    if (ino == maxino)
        return (0);
    inoallocinfo (ino);   **** one new line of code.

In fsck.h, add the prototype for the new function inoallocinfo.
In utility.c (near line 138), replace the function inoinfo with the following:

static struct inostat unallocated = { USTATE, 0, 0 };
/*
 * Look up state information for an inode.
 */
struct inostat *
inoinfo(inum)
    ino_t inum;
{
    struct inostatlist *ilp;
    int iloff;

    if (inum > maxino)
        errx(EEXIT, "inoinfo: inumber %d out of range", inum);
    ilp = &inostathead[inum / sblock.fs_ipg];
    iloff = inum % sblock.fs_ipg;
    if (iloff >= ilp->il_numalloced)
        return (&unallocated);
    return (&ilp->il_stat[iloff]);
}

/*
 * Make it safe to allocate this inode!
 */
void
inoallocinfo (inum)
    ino_t inum;
{
    struct inostat *info;
    struct inostatlist *ilp;
    unsigned i, iloff;

    if (inum > maxino)
        errx(EEXIT, "inoinfo: inumber %d out of range", inum);
    ilp = &inostathead[inum / sblock.fs_ipg];
    iloff = inum % sblock.fs_ipg;
    if (iloff >= (unsigned)ilp->il_numalloced) {
        info = calloc (iloff +  1, sizeof *info);
        if (info == NULL)
            errx(EEXIT, "cannot alloc %u bytes for inoinfo\n",
                (unsigned)(sizeof *info * (iloff + 1)));
        memmove (info, ilp->il_stat, ilp->il_numalloced * sizeof *info);
        free(ilp->il_stat);
        ilp->il_stat = info;
        for (i = ilp->il_numalloced; i <= iloff;  ++i)
            memmove (info + i, &unallocated, sizeof unallocated);
        ilp->il_numalloced = iloff + 1;
    }
}



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?Pine.BSF.3.95.990819144407.13522H-100000>