[pso] [tema4][lin] __bread

Octavian Voicu octavian.voicu at gmail.com
Sun May 31 02:20:21 EEST 2009


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.


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


More information about the pso mailing list