Fdisk prints wrong partition table on non distribution kernels - gdzie jest problem

Bartek Szady bszx w bszxdomain.EDU.eu.org
Pią, 14 Gru 2001, 11:53:30 CET


On Fri, 14 Dec 2001, Arek wrote:

> Witam
> 
> Troszke dalem sie zmylic ;)
> Problem z fdiskiem nie nie lezy w patchach nakladanych na niego lecz
> na kernel, a dokladnie
> /usr/src/linux/include/linux/hdreg.h
> 
> Fdisk budowny w otoczniu naglowków dystrybucyjnych uzywany na systemie
> z wlasnym kernelem dziala zle.
> 
> Fdisk budowny w otoczniu naglowków czystego kernela uzywany na
> systemie z wlasnym kernelem dziala dobrze.
> 
> Wystarczy podmienic ww.  hdreg.h na oryginalny z kernela i jest OK.
> Takze modyfikacja hdreg.h  psuje interes - troszke roznic miedzy nimi
> jest. Dzis juz nie mam sily badac tego doklanie.

Pamietam ze kiedys mialem podobny problem gdy uzywalem dystrybucyjnego
fdiska na kernelu bez patcha na IDE

Wedlug mnie problem powstawal w nastepujacym fragmecie getgeometry z
fdisk.c:

--------------

        res1 = ioctl(fd, BLKGETSIZE, &longsectors);
#ifdef HDIO_REQ
        res2 = ioctl(fd, HDIO_REQ, &geometry);
#else
#ifdef HDIO_GETGEO_BIG
        res2 = ioctl(fd, HDIO_GETGEO_BIG, &geometry);
#else
        res2 = ioctl(fd, HDIO_GETGEO, &geometry);
#endif
#endif

        /* never use geometry.cylinders - it is truncated */
        heads = cylinders = sectors = 0;
        sector_offset = 1;
        if (res2 == 0) {
                heads = geometry.heads;
                sectors = geometry.sectors;
                if (heads * sectors == 0)
                        res2 = -1;
                else if (dos_compatible_flag)
                        sector_offset = sectors;
        }
        if (res1 == 0 && res2 == 0) {   /* normal case */
                cylinders = longsectors / (heads * sectors);
                cylinders /= sec_fac;   /* do not round up */
        } else if (res1 == 0) {         /* size but no geometry */
                heads = cylinders = 1;
                sectors = longsectors / sec_fac;
        }

--------

Kernel bez patcha na ide nie rozumial ioctl'a z HDIO_GETGEO_BIG wiec res2
bylo rozne od 0 i ilosc glowic i cylindrow ustawiala sie na 1 a ilosc
sektorow wyliczala sie na podstawie pojemnosci dysku.

Probowalem to poprawic dodajac sprawdzenie res2 i gdy !=0 wywolanie
ioctl(fd, HDIO_GETGEO, &geometry) ale nie testowalem tego. 

Patch na IDE zaczal byc mi potrzebny i stracilem zainteresowanie fdiskiem.


-- 
Pozdrawiam
	Bartek Szady




Więcej informacji o liście dyskusyjnej pld-devel-pl