]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
blktap: Fix Reconnect demand by Frontend
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 9 Sep 2008 14:13:29 +0000 (15:13 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 9 Sep 2008 14:13:29 +0000 (15:13 +0100)
Signed-off-by: Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
drivers/xen/blktap/common.h
drivers/xen/blktap/interface.c
drivers/xen/blktap/xenbus.c

index 792d1280543650473016986ebe60446a65402391..81d1473e7cdc57cd22caf290a8f769a51bc1e921 100644 (file)
@@ -89,6 +89,7 @@ typedef struct blkif_st {
 
 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);
index 11f800197a1e7da64b223929759c3e7bbabcb604..9009ba62f2bad302b24e640b40f84a626097ab6c 100644 (file)
@@ -162,8 +162,15 @@ void tap_blkif_free(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);
 }
 
index 3b254a371edaed38c111f4ce2107afd7b13e7de8..64534726b3358d31568a1eb21f520ebc37797ac6 100644 (file)
@@ -182,6 +182,7 @@ static int blktap_remove(struct xenbus_device *dev)
                        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);
@@ -364,6 +365,7 @@ static void tap_frontend_changed(struct xenbus_device *dev,
                        kthread_stop(be->blkif->xenblkd);
                        be->blkif->xenblkd = NULL;
                }
+               tap_blkif_free(be->blkif);
                xenbus_switch_state(dev, XenbusStateClosing);
                break;