linux-l: defrag.c

Ralf Baerwaldt rade at rade2.bancos.com
Fr Mai 22 11:16:51 CEST 1998


> 
> > Ich will zum ersten Mal unter Linux ein Programm
> > uebersetzen und habe auch wenig Erfahrung mit C.
> > Nun komme ich an einer Fehlermeldung nicht weiter:
> > --------------------------
> > /tmp/defrag/defrag-0.6 > make
> > gcc -Wall -O2 -fomit-frame-pointer -DEXT2FS -c -o defrag.ext2.o defrag.c
> > defrag.c: In function `walk_inode':
> > defrag.c:396: warning: passing arg 1 of `walk_zone' from incompatible pointer type
> > defrag.c:397: warning: passing arg 1 of `walk_zone_ind' from incompatible pointer type
> > defrag.c:398: warning: passing arg 1 of `walk_zone_dind' from incompatible pointer type
> > defrag.c:400: warning: passing arg 1 of `walk_zone_tind' from incompatible pointer type
> 
> Die Warnings machen keine Probleme, es sind ja nur Warnings.
> Überprüfe aber dennoch mal Deine Pointer; Du übergibst wohl Argumente,
> deren Pointer-Typ nicht dem der aufgerufenen Funktion entsprechen.

es sind nicht "meine" Pointer. <defrag> ist ein Programm, das ich
auf meiner Unix-Distribution gefunden habe, aber leider nur als
c-Sourcen und nicht als lauffaehige Version.

> Mich wundert übrigens, daß Du sagst, daß Du keine große Ahnung von C hast,
> ackerst aber gleich zu Anfang schon auf Inodes rum :-)
> Filesystem-Spezie?

Nee, nur notgedrungen. Bei mir stuerzte ein "man <irgendwas>" immer
mit "Segmentation fault" ab. Ich habe dann die man-pages mit
tar gesichert und nach "man.segmentation_fault" gemoved. Danach
aus tar ein neues man-Verzeichnis kreiert. Und siehe da,
"man <irgendwas>" ging wieder !

Auf der Suche nach einem Disctester, der im lebenden System
nur begrenzte Blocks checkt habe ich dann defrag gefunden.
Mich wuerde mal interessieren, in wie weit die Platte inzwischen
defragmentiert ist.

> > defrag.c: In function `read_fixed_zones':
> > defrag.c:422: `EXT2_FIRST_INO' undeclared (first use this function)
> [...]
> 
> Dein EXT2_FIRST_INO ist unbekannt. Du solltest dafür sorgen,
> daß Du vorher definierst, was Du hinterher nutzt. :-)
> 
> [...]
> >    #define EXT2_FIRST_INO(s)       ((s)->u.ext2_sb.s_first_ino)
> [...]
> 
> Dies ist ein Makro. Es erwartet Argumente.
> 
> Vielleicht ist das das Problem?

Wahrscheinlich hast du recht, aber welche ??

> Tschüß,
>     Oliver
> 
> 
> 
> 
> From: Mathias Born <mborn at faphida.in-berlin.de>
> > 
> > defrag.c: In function `read_fixed_zones':
> > defrag.c:422: `EXT2_FIRST_INO' undeclared (first use this function)
> > defrag.c:422: (Each undeclared identifier is reported only once
> > defrag.c:422: for each function it appears in.)
> 
> Hi!
> Du hast uns ja jede Menge Infos gegeben, aber um die
> eigentlich wichtige Stelle, defrag.c:422, hast Du Dich
> erfolgreich gedrückt! Wie sieht denn die aus?

Hallo Mathias,
hier kommt, was du brauchst:
    415 #ifdef EXT2FS
    416     {
    417     /* Reserved blocks don't count as bad blocks */
    418     int tmp = badblocks;
    419
    420     int i;
    421     for (i=1; i < EXT2_FIRST_INO; i++) {
    422         if ((i == EXT2_ROOT_INO) ||  /* Allow optimization of root inode
 */
    423         (i == bad_block_inode))  /* Done with them already */
    424         continue;
    425         if (!inode_in_use (i))
    426         die ("Reserved inode is on the free list.");
    427         if (get_inode(i))
    428         die ("Can't read reserved inode.");
    429
    430         walk_inode(&inode_buffer, WZ_FIXED_BLOCKS);
    431     }
    432     badblocks = tmp;
    433     }
    434 #endif


rade
(e-mail: rade at bancos.com)





Mehr Informationen über die Mailingliste linux-l