From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=49119 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pt6SF-00065E-Ml for qemu-devel@nongnu.org; Fri, 25 Feb 2011 17:48:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pt6S4-0004jh-GJ for qemu-devel@nongnu.org; Fri, 25 Feb 2011 17:48:07 -0500 Received: from e3.ny.us.ibm.com ([32.97.182.143]:54730) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pt6S4-0004jK-Dn for qemu-devel@nongnu.org; Fri, 25 Feb 2011 17:47:56 -0500 Received: from d01dlp01.pok.ibm.com (d01dlp01.pok.ibm.com [9.56.224.56]) by e3.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p1PMS0gw025576 for ; Fri, 25 Feb 2011 17:28:00 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 8A07D38C8036 for ; Fri, 25 Feb 2011 17:47:55 -0500 (EST) Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p1PMltpW266378 for ; Fri, 25 Feb 2011 17:47:55 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p1PMltVZ020962 for ; Fri, 25 Feb 2011 19:47:55 -0300 From: Chunqiang Tang Date: Fri, 25 Feb 2011 17:38:01 -0500 Message-Id: <1298673486-3573-21-git-send-email-ctang@us.ibm.com> In-Reply-To: <1298673486-3573-1-git-send-email-ctang@us.ibm.com> References: <1298673486-3573-1-git-send-email-ctang@us.ibm.com> Subject: [Qemu-devel] [PATCH 21/26] FVD: add impl of interface bdrv_close() List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Chunqiang Tang This patch is part of the Fast Virtual Disk (FVD) proposal. See http://wiki.qemu.org/Features/FVD. This patch adds FVD's implementation of the bdrv_close() interface. Signed-off-by: Chunqiang Tang --- block/fvd-misc.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 78 insertions(+), 0 deletions(-) diff --git a/block/fvd-misc.c b/block/fvd-misc.c index c515d74..63ed168 100644 --- a/block/fvd-misc.c +++ b/block/fvd-misc.c @@ -81,6 +81,84 @@ static void fvd_aio_cancel(BlockDriverAIOCB * blockacb) static void fvd_close(BlockDriverState * bs) { + BDRVFvdState *s = bs->opaque; + FvdAIOCB *acb; + int i; + + if (s->prefetch_state == PREFETCH_STATE_RUNNING) { + s->prefetch_state = PREFETCH_STATE_DISABLED; + } + if (s->prefetch_timer) { + qemu_del_timer(s->prefetch_timer); + qemu_free_timer(s->prefetch_timer); + s->prefetch_timer = NULL; + } + + if (s->prefetch_acb) { + /* Clean up prefetch operations. */ + for (i = 0; i < s->num_prefetch_slots; i++) { + if (s->prefetch_acb[i] != NULL) { + fvd_aio_cancel_copy(s->prefetch_acb[i]); + s->prefetch_acb[i] = NULL; + } + } + my_qemu_free(s->prefetch_acb); + s->prefetch_acb = NULL; + } + + if (s->use_bjnl) { + /* Clean up buffered journal update. */ + bjnl_sync_flush(bs); + if (s->bjnl.timer_scheduled) { + qemu_del_timer(s->bjnl.clean_buf_timer); + } + qemu_free_timer(s->bjnl.clean_buf_timer); + } + + /* Clean up unfinished copy_on_read operations. */ + QLIST_FOREACH(acb, &s->copy_locks, copy_lock.next) { + fvd_aio_cancel_copy(acb); + } + + flush_metadata_to_disk_on_exit(bs); + + if (s->stale_bitmap) { + my_qemu_vfree(s->stale_bitmap); + if (s->fresh_bitmap != s->stale_bitmap) { + my_qemu_vfree(s->fresh_bitmap); + } + s->stale_bitmap = NULL; + s->fresh_bitmap = NULL; + } + + if (s->table) { + my_qemu_vfree(s->table); + s->table = NULL; + } + + if (s->fvd_metadata) { + if (s->fvd_metadata != s->fvd_data) { + bdrv_delete(s->fvd_metadata); + } + s->fvd_metadata = NULL; + } + if (s->fvd_data) { + bdrv_delete(s->fvd_data); + s->fvd_data = NULL; + } + + if (s->add_storage_cmd) { + my_qemu_free(s->add_storage_cmd); + s->add_storage_cmd = NULL; + } + + if (s->leaked_chunks) { + my_qemu_free(s->leaked_chunks); + s->leaked_chunks = NULL; + } +#ifdef FVD_DEBUG + dump_resource_summary(s); +#endif } static int fvd_probe(const uint8_t * buf, int buf_size, const char *filename) -- 1.7.0.4