[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