[so2] [SO2] [Tema3] [Linux] Nelămuriri - CRC, locking, checker

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun Apr 21 12:52:44 EEST 2013


Liviu Ioan <liviu.andrei.ioan at gmail.com> writes:
>> @Radu: Un bio conține o cerere care *începe* de la un anumit sector,
>> eu așa înțeleg - nu m-am exprimat corect. Într-un bio, există mai
>> multe segmente care alcătuiesc o zonă continuă pe disc, însă pot să
>> fie discontinue în memorie. În plus, fiecare segment corespunde unei
>> pagini; o singură pagină(plină) este mai mare decât un sector.
>
> Ehm, am o rugăminte: poate confirma cineva ce i-am răspuns lui Radu
> :)?

E corect.

> Am neclarități din cauza rezolvării pentru laboratorul 8.
>
> În rezolvare "zice"(funcția my_xfer_request din ram_disk.c):
>
> rq_for_each_segment(bvec, req, iter) {
> 		sector_t sector = iter.bio->bi_sector;
> 		char *buffer = __bio_kmap_atomic(iter.bio, iter.i, KM_USER0);
> 		my_block_transfer(dev, sector, bio_cur_bytes(iter.bio), buffer,
> bio_data_dir(iter.bio) == WRITE);
> 		__bio_kunmap_atomic(buffer, KM_USER0);
> 		nbytes += bio_cur_bytes(iter.bio);
> }
>
> rq_for_each segment este o iterație peste bio-urile din request +
> iterație peste segmentele din bio
> (__rq_for_each_bio + bio_for_each_segment)

Da.

> bio_cur_bytes se referă la dimensiunea segmentului curent

Da.

> Al doilea parametru trimis de my_block_transfer este un offset în
> cadrul "memoriei" dispozitivului.
>
> Ce nu înțeleg eu: de ce într-un bio toate segmentele sunt scrise în
> memoria dispozitivului la același offset?
> Eu am crezut că un bio conține o serie de segmente care încep la bi_sector.
> Concret: primul segment se referă la offset-ul bi_sector, al doilea
> segment are ca offset bi_sector + dimensiunea primului segment etc.

> Mai mult, în Linux Device Drivers, ch16.pdf, pag 25 din 33, există o
> funcție similară(sbull_xfer_bio):
> sector_t sector = bio->bi_sector;
> bio_for_each_segment(bvec, bio, i) {
>        char *buffer = __bio_kmap_atomic(bio, i, KM_USER0);
>         sbull_transfer(dev, sector, bio_cur_sectors(bio), buffer,
> bio_data_dir(bio) = = WRITE);
>         sector += bio_cur_sectors(bio);
>         __bio_kunmap_atomic(bio, KM_USER0);
> }
> Partea interesantă: sector += bio_cur_sectors(bio). Aici, fiecare
> segment corespunde unui deplasament diferit.

Ai dreptate. Este o scăpare. Trebuia adunat la variabila sector
offsetul. Probabil că sosesc doar bio-uri cu un singur segment și de
aceea merge. O să revin cu o corectare.

Răzvan


More information about the so2 mailing list