[pso] [tema4][lin] __bread

Octavian Voicu octavian.voicu at gmail.com
Sun May 31 08:55:12 EEST 2009


2009/5/31 Octavian Voicu <octavian.voicu at gmail.com>

> 2009/5/27 Razvan Deaconescu <razvan.deaconescu at cs.pub.ro>
>
>> On Wed, 2009-05-27 at 18:54 +0300, Sandu Popa Marius wrote:
>> > Eu fac momentan fac asa si pare sa mearga. Nu am implementat toate
>> > functionalitatile, asa ca nu sunt chiar sigur :P.
>> > O alta metoda ar fi sa folosesti sb_set_blocksize pt a seta la
>> > dimensiunea dorita.
>>
>> __bread is OK
>>
>
> Se intampla ceva foarte dubios cand citesc cu __bread 2 blockuri pentru
> fisierul bash_completion din imaginea data.
> Cu toate ca __bread-ul cu size=2*blocksize=1024 returneaza buffer_head
> valid, doar primul block are date ok, al doilea are date random (uneori 0,
> alteori -12337). Mentionez ca citesc 2 blocuri doar pentru inode-urile care
> chiar se afla pe doua blocuri.
>
> Ce cred eu ca se intampla, el are in cache bufferhead-ul care incepe la
> blocul respectiv, dar are size=blocksize. Nu face verificarea daca
> intr-adevar si blocul urmator este in cache si imi returneaza acel buffer.
> Nu prea e normal acest comportament, eu zic ca e un bug in kernel.
>
> Am rezolvat cu un sb_breadahead(sb, block + 1) dupa un __bread() cu
> size=2*blocksize. Bufferul fiind asociat unei pagini, blocul urmator se pare
> ca este tot in acea pagina si pot accesa si al doilea bloc prin buffer-ul
> returnat de __bread, chiar daca breadahead-ul face citirea lui propriu-zisa.
>


Am mai testat si am ajuns la concluzia ca nu are cum sa mearga cu __bread
decat accidental.
Din ce observ eu, doua buffere trebuie sa fie identice (acelasi offset/size)
sau disjuncte
(sa nu aiba niciun byte in comun), altfel apar rezultate imprevizibile.

Daca citesc un block cu size=blocksize si apoi incerc sa citesc de la
acelasi offset doua blocuri
adica size=2*blocksize, __bread o sa-mi returneze buffer-ul citit prima
oara, cel cu size=blocksize.

Chiar daca folosesc alte functii pt a genera citirea blocului urmator, in
cazul in care blocul initial
era ultimul din pagina, blocul urmator va fi alocat intr-o pagina noua, cel
mai probabil necontigua cu
pagina primului.

Singura solutie ramane citirea cu 2 x sb_bread, asa merge fara probleme
(doar ca e mult mai urat).


-- 
Octavian Voicu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090531/0b56a9c6/attachment.htm>


More information about the pso mailing list