This shows you the differences between two versions of the page.
so2:laboratoare:lab07 [2018/04/12 11:13] elena.sandulescu [Structura bio] |
so2:laboratoare:lab07 [2018/05/02 12:31] (current) theodor.stoican [Structura block_device_operations] |
||
---|---|---|---|
Line 253: | Line 253: | ||
} | } | ||
- | static int my_block_release(struct gendisk *gd, fmode_t mode) | + | static void my_block_release(struct gendisk *gd, fmode_t mode) |
{ | { | ||
//... | //... | ||
- | |||
- | return 0; | ||
} | } | ||
Line 384: | Line 382: | ||
Partea centrală a unui driver de tip bloc este metoda de tip [[http://lxr.free-electrons.com/source/include/linux/blkdev.h?v=4.9#L224 | request_fn_proc]]. În exemplele anterioare, funcția care satisfăcea acest rol era ''my_block_request''. După cum s-a precizat și în secțiunea [[#Crearea și ștergerea cozii de cereri | Crearea și ștergerea cozii de cereri]], această funcție este atașată driverului prin apelarea [[http://lxr.free-electrons.com/source/block/blk-core.c?v=4.9#L781 | blk_init_queue]]. | Partea centrală a unui driver de tip bloc este metoda de tip [[http://lxr.free-electrons.com/source/include/linux/blkdev.h?v=4.9#L224 | request_fn_proc]]. În exemplele anterioare, funcția care satisfăcea acest rol era ''my_block_request''. După cum s-a precizat și în secțiunea [[#Crearea și ștergerea cozii de cereri | Crearea și ștergerea cozii de cereri]], această funcție este atașată driverului prin apelarea [[http://lxr.free-electrons.com/source/block/blk-core.c?v=4.9#L781 | blk_init_queue]]. | ||
- | Această metodă este apelată atunci când kernel-ul consideră că driverul trebuie să proceseze cereri de I/O. Metoda trebuie să pornească procesarea cererilor din coada, dar nu este obligată să le și termine, cererile putând fi terminate din alte părți ale driverului. | + | Această metodă este apelată atunci când kernel-ul consideră că driverul trebuie să proceseze cereri de I/O. Metoda trebuie să pornească procesarea cererilor din coadă, dar nu este obligată să le și termine, cererile putând fi terminate din alte părți ale driverului. |
Parametrul ''lock'', transmis la crearea unei cozi de cereri, reprezintă un spinlock pe care kernel-ul îl deține atunci când execută metoda ''request''. Din acest motiv, metoda ''request'' rulează în context atomic și trebuie să respecte regulile pentru cod atomic (nu trebuie să apeleze funcții care pot duce la sleep etc.). Acest lock asigură și faptul că nu vor fi adăugate în coada alte cereri pentru device în timp ce se execută metoda request. | Parametrul ''lock'', transmis la crearea unei cozi de cereri, reprezintă un spinlock pe care kernel-ul îl deține atunci când execută metoda ''request''. Din acest motiv, metoda ''request'' rulează în context atomic și trebuie să respecte regulile pentru cod atomic (nu trebuie să apeleze funcții care pot duce la sleep etc.). Acest lock asigură și faptul că nu vor fi adăugate în coada alte cereri pentru device în timp ce se execută metoda request. | ||
Line 506: | Line 504: | ||
static int my_xfer_bio(struct my_block_dev *dev, struct bio *bio) | static int my_xfer_bio(struct my_block_dev *dev, struct bio *bio) | ||
{ | { | ||
- | int i; | ||
struct bio_vec bvec; | struct bio_vec bvec; | ||
struct bvec_iter i; | struct bvec_iter i; |