blkif_t *tap_alloc_blkif(domid_t domid);
void tap_blkif_free(blkif_t *blkif);
+void tap_blkif_kmem_cache_free(blkif_t *blkif);
int tap_blkif_map(blkif_t *blkif, unsigned long shared_page,
unsigned int evtchn);
void tap_blkif_unmap(blkif_t *blkif);
{
atomic_dec(&blkif->refcnt);
wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0);
+ atomic_inc(&blkif->refcnt);
tap_blkif_unmap(blkif);
+}
+
+void tap_blkif_kmem_cache_free(blkif_t *blkif)
+{
+ if (!atomic_dec_and_test(&blkif->refcnt))
+ BUG();
kmem_cache_free(blkif_cachep, blkif);
}
kthread_stop(be->blkif->xenblkd);
signal_tapdisk(be->blkif->dev_num);
tap_blkif_free(be->blkif);
+ tap_blkif_kmem_cache_free(be->blkif);
be->blkif = NULL;
}
kfree(be);
kthread_stop(be->blkif->xenblkd);
be->blkif->xenblkd = NULL;
}
+ tap_blkif_free(be->blkif);
xenbus_switch_state(dev, XenbusStateClosing);
break;