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

Liviu Ioan liviu.andrei.ioan at gmail.com
Sun Apr 21 00:58:10 EEST 2013


> @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 :)?
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)
bio_cur_bytes se referă la dimensiunea segmentului curent

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.

Unde greșesc?
Mulțumesc.

Liviu


More information about the so2 mailing list