Re: fsck cannot alloc X bytes for inphead

From: Bernd Walter <ticso(at)cicely12.cicely.de>
Date: Tue, 6 May 2008 16:12:19 +0200

On Tue, May 06, 2008 at 01:19:49PM +0200, Oliver Fromme wrote:
> Till Toenges wrote:
> > [...]
> > /dev/ad2s1c.bde 143G 11T -11T 8850% /mnt
> > #
> > # umount /mnt
> > # fsck -t ffs -y /dev/ad2s1c.bde
> > ** /dev/ad2s1c.bde
> > cannot alloc 18446744067450876580 bytes for inphead
>
> Tja, da verwendet fsck wohl die kaputten Größen, die
> im Dateisystem hinterlegt sind, und es kommt zu einem
> Überlauf.
>
> Da Du alle Daten gesichert hast (das Dateisystem kann
> ja read-only gemountet werden), ist es wohl das Ein-
> fachste, es mit newfs neu anzulegen und die Daten zu
> restaurieren.
>
> > # uname -a
> > FreeBSD server.intern 5.3-RELEASE-p37
>
> 5.3 ist immerhin ca. 4 Jahre alt. Du könntest mal ein
> aktuelleres fsck verwenden, z.B. von 6.3 oder 7.0.
> Ich erinnere mich, dass gerade in den letzten Monaten
> ein paar Fixes in fsck eingeflossen sind.

Der ist auch schon vor Ewigkeiten gefixed worden.
Konkret am 02.12.2002 in Rev 1.42 der setup.c:
@@ -258,12 +258,8 @@
                    (unsigned)(sizeof(struct inostatlist) * (sblock.fs_ncg)));
                goto badsb;
        }
- numdirs = sblock.fs_cstotal.cs_ndir;
+ numdirs = MAX(sblock.fs_cstotal.cs_ndir, 128);
        dirhash = numdirs;
- if (numdirs == 0) {
- printf("numdirs is zero, try using an alternate superblock\n");
- goto badsb;
- }
        inplast = 0;
        listmax = numdirs + 10;
        inpsort = (struct inoinfo **)calloc((unsigned)listmax,

Das ist aber bereits in der 5.0 drin gewesen und mit der Änderung sehe
ich absolut keine Chance, dass derart viele Bytes allociert werden.
Nachfolgend steht nämlich:
1.1 (rgrimes 26-May-94): inphead = (struct inoinfo **)calloc((unsigned)numdirs,
1.1 (rgrimes 26-May-94): sizeof(struct inoinfo *));
1.1 (rgrimes 26-May-94): if (inpsort == NULL || inphead == NULL) {
1.35 (mux 31-Jul-02): printf("cannot alloc %ju bytes for inphead\n",
1.35 (mux 31-Jul-02): (uintmax_t)numdirs * sizeof(struct inoinfo *));
1.1 (rgrimes 26-May-94): goto badsb;
1.1 (rgrimes 26-May-94): }
Demnach hat die Begrenzung von numdirs die Begrenzung des Speicher-
bedarfs auf maximal 128 * 4, bzw. auf 64'bit 128 * 8 Bytes zur Folge.

Aber um dem ganzen noch mal nachzuhelfen.
Der kaputte Wert kommt aus dem Superblock - es hätte also auch geholfen
einfach mit einem alternative zu arbeiten.

-- 
B.Walter <bernd@bwct.de> http://www.bwct.de
Modbus/TCP Ethernet I/O Baugruppen, ARM basierte FreeBSD Rechner uvm.
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 06 May 2008 - 16:12:33 CEST

search this site