X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fxen%2Fblktap%2Finterface.c;fp=drivers%2Fxen%2Fblktap%2Finterface.c;h=b0eccf4225747f3607677b75a44268b07ab62737;hb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;hp=19e0eda0a0438f52b571e0e7ffc4c6f13337045d;hpb=4e76c8a9fa413ccc09d3f7f664183dcce3555d57;p=linux-2.6.git diff --git a/drivers/xen/blktap/interface.c b/drivers/xen/blktap/interface.c index 19e0eda0a..b0eccf422 100644 --- a/drivers/xen/blktap/interface.c +++ b/drivers/xen/blktap/interface.c @@ -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); }