[pso] bi_end_io
Matei Gruber
matei.gruber at gmail.com
Thu Apr 30 19:31:56 EEST 2009
Salut,
M-am prins care era treaba. Cererile pentru block I/O trec prin
buffer.c, si, by default la fiecare completare a unui bio se apeleaza
un end_bio_bh_io_sync inainte de put. Aici se decide daca a fost un
read/write sync/async, si se deblocheaza un buffer (al buffer.c). Daca
eu interceptez cu functia mea de completare, buffer.c asteapta in
continuare => nu pot sa fac rmmod.
Sper ca am inteles bine,
Matei
2009/4/30 Matei Gruber <matei.gruber at gmail.com>:
> Salut
>
> Am un modul simplu care îndeplinește funcția de proxy între /dev/ssr
> și /dev/hdb. Nu face altceva decât să paseze requesturile primite pe
> ssr către hdb.
>
> Interceptez bio-urile adresate /dev/ssr într-o make_request_fn. Acolo
> schimb bio->bi_dev = hdb si submit_bio. Totul merge OK.
>
> Dacă în schimb mai modific doar câmpul bio->bi_end_io și pun o funcție
> de-a mea, înainte să fac submit, doar ca să mai primesc o notificare
> la terminare, apare o mică problemă. Notificarea este primită, cu
> status = 0 (SUCCESS), și bi_flags = 9 adica BIO_UPTODATE si
> BIO_SEG_VALID. Modulul in schimb ramane agatat, in sensul ca nu mai
> pot sa fac rmmod pe el (fiind used by 1 - nu spune cine). In bi_end_io
> fac doar un bio_put si un printk.
>
> Am vazut ca handlerul default de bi_end_io face doar un bio_put().
>
> Any ideas?
>
> Matei
>
>
>
> ---bi_end_io
> static void bi_curious(struct bio *bio, int error)
> {
> printk(KERN_DEBUG "bi_curios %p %d\n", bio, error);
> /* TODO: Notify for completion. */
>
> /* NOTE: Check if we need to do a bio_put. No, since we didn't grab
> * it with bio_alloc() or bio_get(). */
> printk(KERN_DEBUG "bi_curious bi_bdev %s bi_private %p bi_end_io %p
> u bi_flags %lx\n", bio->bi_bdev->bd_disk->disk_name, bio->bi_private, bi
> d_io, bio->bi_rw, bio->bi_flags);
> bio_put(bio);
> }
>
More information about the pso
mailing list