[pso] [tema3] Construirea unui bio pt CRC
Octavian Voicu
octavian.voicu at gmail.com
Sun May 17 16:02:57 EEST 2009
On Sun, May 17, 2009 at 3:27 PM, Bogdan Tenea <tenea.bogdan at gmail.com>wrote:
> bio_crc->bi_bdev = dev;
> bio_crc->bi_sector = start_sector;
> init_completion(event);
> bio_crc->bi_private = event;
> bio_crc->bi_end_io = my_complete;
> bio_crc->bi_rw = DIRECTION_READ;
> bio_crc->bi_vcnt = num_pages;
> bio_crc->bi_idx = 0;
>
> for(i=0; i<num_pages-1; i++)
> bio_add_page(bio_crc, alloc_page(GFP_NOIO), PAGE_SIZE, 0);
> bio_add_page(bio_crc, alloc_page(GFP_NOIO), sectors_in_last_page *
> MY_SECTOR_SIZE, 0);
>
Ce gresesti e ca nu setezi offset-ul cand apelezi bio_add_page (ultimul
parametru, pe care l-ai pus 0);
Incearca asa (i in loc de zero pentru ambele apleuri; la iesirea din for
i-ul o sa aiba valoarea potrivita):
for(i=0; i<num_pages-1; i++)
> bio_add_page(bio_crc, alloc_page(GFP_NOIO), PAGE_SIZE, *i*);
> bio_add_page(bio_crc, alloc_page(GFP_NOIO), sectors_in_last_page *
> MY_SECTOR_SIZE, *i*);
>
Mai e un bug de care e mai greu sa-ti dai seama. Daca te uiti in codul din
laborator, bi_vcnt era setat in structura *dupa* bio_add_page. Problema e ca
bio_add_page incrementeaza automat bi_vcnt cand adauga o pagina (studiaza
sursa din kernel). Daca il setezi inca o data dupa adaugarea paginilor (cum
e in lab) probabil nu se strica nimic, cu toate ca nu vad rostul. Dar daca
il setezi inainte la num_pages si apelezi bio_add_page de num_pages ori, la
sfarsit o sa aiba valoarea dubla fata de cea corecta. Cel mai bine e sa nu-l
setezi deloc (default e 0) sau sa-l setezi pe zero inainte de
bio_add_page-uri.
DIRECTION_READ nu l-am gasit in headere, presupun ca ti l-ai definit tu.
Poti sa folosesti define-urile READ si WRITE (care au valorile 0 respectiv
1).
--
Octavian Voicu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090517/fc27c5fc/attachment.htm>
More information about the pso
mailing list