[pso] [Tema5][Linux]Neclaritati bio + flush

Razvan Deaconescu razvand at cs.pub.ro
Fri Jun 22 12:12:07 EEST 2007


sorin gsmcreation wrote:
> Salut,
> 
> Am citit ceva documentatie, insa am destule chestii
> neclare legate de tema 5.
> 
> Pentru o citire, de exemplu, din userspace, ssr 
> primeste cerere de citire a unui sector logic, sa 
> zicem sectorul 1.
> 
> Citirea acestui sector logic necesita citirea a doua 
> parti (in total: 512+4 bytes) care se afla in doua 
> sectoare fizice (in sectoarele 1 si 2 fizice in acest 
> caz). Aceste sectoare fizice trebuie citite de pe
> /dev/sdb1 (si similar pt /dev/sdb2). Trebuie
> construita
> deci o structura bio care trebuie trimisa catre
> driverul
> scsi, prin care sa-i precizam ca avem nevoie de 
> 512 bytes din sectorul 1 si 4 bytes din sectorul 2 de 
> pe /dev/sdb1.

De fapt trebuie sa construiesti doua structuri bio: una va fi transmisa 
driver-ului SCSI catre /dev/sdb1 si alta catre /dev/sdb2.

> Dupa ce am studiat ceva documentatie, tot nu-mi dau
> seama care campuri din bio trebuie completate astfel
> incat sa construiesc un bio catre scsi in care sa cer:
> - X bytes din sectorul i incepand de la un offset
> - Y bytes din sectorul i+1 incepand de la offset 0
> (unde X+Y = 516 bytes)
> - cei X+Y bytes sa fie copiati intr-un buffer pe care
> sa-l precizez eu, iar cu ajutorul acestui buffer sa
> construiesc raspunsul la cererea din userspace
> 
> M-am uitat si prin surse si pe lista de discutii, insa
> tot nu mi-am dat seama care e codul pe care il caut, 
> asa ca orice sugestie este binevenita.

Construiesti un bio in care precizezi:
* campul bi_bdev catre dispozitiv (obtinut cu open_bdev_excl)
* campul bi_sector cu primul sector fizic din care citesti informatiile

In cazul tau (exemplul dat de tine) bio-ul va contine 2 pagini si va 
trebui alocat corespunzator. De exemplu
         my_bio = bio_alloc (GFP_NOIO, 2);

In continuare folosesti bio_add_page pentru a adauga pagina cu 
informatiile utile la bio. Vei seta, in prealabil, campurile bi_vcnt si 
bi_idx ale bio-ului la 0.

> De asemenea, nu inteleg de ce avem nevoie de flush
> atata timp cat nu folosim un camp precum dev->data 
> ca in exemplu, ci fiecare operatie din userspace 
> genereaza doua bio-uri care asigura consistenta 
> datelor pe partitiile fizice.

Exista mai multe niveluri de caching intre transmiterea informatiei din 
user-space pana cand aceasta ajunge pe dispozitivul fizic.

O operatiei de write ajunge intai in page-cache apoi ajunge la modulul 
tau, acolo se formeaza bio-urile care sunt transmise catre dispozitivul 
fizic.

Exista de asemenea, un nivel de caching si la citire. Operatia de flush 
va invalida toate aceste cache-uri astfel incat informatia va fi citita 
_direct_ de pe dispozitiv, sau va fi scrisa _direct_ pe dispozitiv.

Razvan


More information about the pso mailing list