[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