X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fxen%2Fblktap%2Finterface.c;h=3dcc6246ca1438aa33ef13340f368a5afea4bfc1;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=19e0eda0a0438f52b571e0e7ffc4c6f13337045d;hpb=1db395853d4f30d6120458bd279ede1f882a8525;p=linux-2.6.git diff --git a/drivers/xen/blktap/interface.c b/drivers/xen/blktap/interface.c index 19e0eda0a..3dcc6246c 100644 --- a/drivers/xen/blktap/interface.c +++ b/drivers/xen/blktap/interface.c @@ -34,7 +34,7 @@ #include "common.h" #include -static kmem_cache_t *blkif_cachep; +static struct kmem_cache *blkif_cachep; blkif_t *tap_alloc_blkif(domid_t domid) { @@ -135,20 +135,25 @@ int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, return 0; } -void tap_blkif_free(blkif_t *blkif) +void tap_blkif_unmap(blkif_t *blkif) { - atomic_dec(&blkif->refcnt); - wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0); - - /* Already disconnected? */ - if (blkif->irq) + if (blkif->irq) { unbind_from_irqhandler(blkif->irq, blkif); - + blkif->irq = 0; + } if (blkif->blk_ring.sring) { unmap_frontend_page(blkif); free_vm_area(blkif->blk_ring_area); + blkif->blk_ring.sring = NULL; } +} + +void tap_blkif_free(blkif_t *blkif) +{ + atomic_dec(&blkif->refcnt); + wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0); + tap_blkif_unmap(blkif); kmem_cache_free(blkif_cachep, blkif); }