[so2] [Tema 3] setare logical block size

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Fri Apr 22 11:56:46 EEST 2016


Georgiana Diana <geodiana93 at gmail.com> writes:
> 2016-04-17 19:32 GMT+03:00 Oana Stroie via so2 <so2 at cursuri.cs.pub.ro>:
>> On 17 Apr 2016 19:30, "Razvan Deaconescu via so2" <so2 at cursuri.cs.pub.ro> wrote:
>>> Oana Stroie via so2 <so2 at cursuri.cs.pub.ro> writes:
>>> > Buna ziua,
>>> >
>>> > Am dificultati la setarea dimensiunii sectorului
>>> > dispozitivului. Desi setez conform laboratorului, exemplu:
>>> >
>>> > blk_queue_make_request(dev->queue, process_bio);
>>> > blk_queue_logical_block_size(dev->queue, KERNEL_SECTOR_SIZE);
>>> >
>>> > Atunci cand primesc o cerere, la parcurgerea unui bio pe sergemente si
>>> > afisari ale campurilor observ ca dimensiunea sectorului este considerata
>>> > 4096.
>>> >
>>> > Spre exemplu la testul 10 (unde este scris un sector)  bvec->bv_len are
>>> > valoarea 4096 (si bio_cur_bytes(bio)).
>>> >
>>> > Ce gresesc? Nu gasesc informatii ajutatoare pe internet,
>>>
>>> Hello, Oana.
>>>
>>> Scuze de răspunsul tardiv.
>>>
>>> Nu înțeleg problema. Așa se întâmplă; block IO layer-ul citește
>>> informații la nivel de bloc/pagină. Dacă îi spui să scrie/citească un
>>> sector va citi 8 sectoare (8 * 512 octeți = 4096 = o pagină/un bloc). Nu
>>> este nici un fel de problemă.
>>
>> Buna,
>>
>> Am inteles si rezolvat intre timp.
>> Mersi de raspuns:)
>
> Din cate inteleg din ce scrie mai sus, un bio va scrie/citi mereu 8
> sectoare pe discul fizic.

Nu mereu. _De obicei_ (adică _nu_ obligatoriu mereu, dar foarte probabil)
cererile venite din _user space_ (_nu_ kernel space) vor fi translatate
în bio-uri care ocupă un bloc, adică 8 sectoare.

În kernel space, la fel, în general bio-urile le vei crea cu multiplu de
pagini (folosind, de exemplu bio_alloc) rezultând în 8 sectoare.

> In 8 sectoare, se pot retine maxim/eficient 1000 de CRC-uri aferente a
> 1000 de sectoare de date. Deci fiecare request bio de scriere va
> suprascrie mereu CRC-urile a 1000 de sectoare de date ?

Practic da, operațiile de scriere vor suprascrie atât de multe
CRC-uri. Dacă vrei să modici _un_ CRC vei face un bio de citire a unei
întregi pagini, adică 8 sectoare, adică în jur de 1000 de bio-uri. Vei
modifica doar CRC-uril necesare și vei resubmite bio-ul ca un bio de
scriere.

> Pe de alta parte, daca cel putin 8 sectoare de date sunt mereu
> citite/scrise, ar avea sens sa retin doar 8 CRC-uri per sector din
> zona CRC. Dar pentru un bio care opereaza in zona CRC, asta ar insemna
> ca mereu va scrie si in alte 7 sectoare adiacente ? Adica ar afecta
> alte 56 de CRC-uri ?

Da, vei afecta mai multe CRC-uri. Citești zona cu CRC-ul/CRC-urile pe
care vrei să le modifici, suprascrii în memorie CRC-ul/CRC-urile
necesare și faci un bio de write. Într-adevăr, bio-ul de write va ajunge
să suprascrie foarte multe CRC-uri pe disc, dar multe vor fi suprascrise
cu aceeași valoare, că nu ai cum altfel: le citești și le scrii tot pe
acelea la loc ca să modifici doar o mică parte din CRC-uri.

> Setarea campului bio_vec->bv_len la KERNEL_SECTOR_SIZE are vreun efect
> ?

Nu lucra cu bio_vec-uri, lucrează doar cu bio.

Răzvan


More information about the so2 mailing list