[pso] bi_end_io

Matei Gruber matei.gruber at gmail.com
Thu Apr 30 19:05:43 EEST 2009


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