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