Spatna geometrie v sysinstallu pri fdisku

Dan Lukes dan at obluda.cz
Sat Jan 28 05:04:23 CET 2006


Rudolf Cejka wrote:
>>takze jsem ten pseudodisk chtel vyvorit jako "dangerously dedicated". A 
>>ejhle - navzdory manualu to soucasny sysinstall z 6-STABLE neumi - 
> 
> Klavesa F (napoveda na okolo 16. radku vpravo "F = `DD' mode")
> v /usr/sbin/sysinstall v FDISK Partition Editor nefunguje?

	Asi jo, ale ja nejprve pouzil 'F1' a nechal si poradit, ze to co chci 
udelat dela 'A' ([pise se to v ctvrtem odstavci) a jelikoz 'A' v menu je 
a ma relativne rozumnou popisku, dal jsem v menu nehledal.

> Jak se to vlasne delalo v 4.x? Co v manualu pisou?

	V manualu se pise, ze to dela 'A', ktere se zepta, jestli chci
kompatibilni nebo DD mod.

> Da se dohledat a aspon vyplnit PR, tohle by snad opravit mohli.

	No, priznam se, ze na to uz se vykaslu. Mam takovych zaslanych
otevrenych a nevyresenych PR docela dost. 4.x uz nikdo opravovat nebude 
a na 5/6 je spousta dlouhodobe neresenych daleko dulezitejsich problemu.

> v geom(4) v DIAGNOSTICS o tom pise, flag 0x10.

	Hm, to jsem prehledl.

	Mimochodem, koukal jsem do fdisku jak to dela - a on to dela jinak (ale 
tak by to z prikazove radky neslo). Pri te prilezitosti jsem si ovsem 
vsiml, ze se fdisk chova docela podezrele.

	Nejdriv si zjisti v ramci velikost sektoru pro dane medium (secsize). 
To se provadi ctenim dat o postupne vzrustajici delce, pricemz se pocita 
s tim, ze u blokoveho zarizeni nelze precist data o mensi delce nez blok 
(v okamziku, ktery nas zajima je sector=secsize=0):

=====================================
#define MIN_SEC_SIZE 512
#define MAX_SEC_SIZE 2048
...
lseek(fd, (sector * 512), 0);
if (secsize == 0)
    for (secsize = MIN_SEC_SIZE; secsize <= MAX_SEC_SIZE;
        secsize *= 2) {
        /* try the read */
        int size = read(fd, buf, secsize);
        if (size == secsize)
              /* it worked so return */
              return secsize;
    }
=======================================

	Trapi me v tom kusu kodu dve veci - zaprve je mi tam velmi podezrela 
konstanta "512" v prikazu seek. Jiste - v okamziku zjistovani velikosti 
sektoru je sector==0 a tak je jedno, cim se nasobi, nicmene, stejny kod 
se pozdeji pouziva pro cteni bloku - a me pripada, ze pri velikosti 
sektoru ruzne od 512 by cteni jineho sektoru nez 0 jaksi nefungovalo.

	Druha vec je, ze sama smycka detekce nefunguje. Vyzkousel jsem, ze 
jakmile ten READ jednou selze (protoze velikost je mensi nez velikost 
bloku a read vrati EINVAL) tak size==-1 && errno==EINVAL vrati i kazde 
dalsi volani read, uz bez ohledu na hodnotu secsize.

	Takze cela detekce funguje jen tehdy, pokud se trefi hned na prvni pokus.

	On je pozdeji podezrely i zapis:

pwrite(..., buf, secsize, sector*512)

	Pripada mi mirne schizofrenni (vyjma kdyz secsize==512 || sector==0).

	Ten kod je velice stary (1.12.1996) a rekl bych, ze tehdy fungoval. 
Odhaduji, ze proto, ze se nikdy nepouzil na jine pripady nez na 
sector==0 (takze blbe zadratovane konstanty nevadily) a zadruhe, tehdy 
se read() choval jinak a chyba pri jednom cteni nebranila ctenim dalsim.

	Prehledl jsem neco, nebo je ten kod skutecne tak blbe, jak si myslim ?

					Dan






More information about the Users-l mailing list