From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:46895) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5D6m-0002J5-IO for qemu-devel@nongnu.org; Wed, 07 Mar 2012 04:24:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S5D6L-0000se-K8 for qemu-devel@nongnu.org; Wed, 07 Mar 2012 04:24:32 -0500 Received: from e23smtp06.au.ibm.com ([202.81.31.148]:36123) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5D6L-0000rQ-1R for qemu-devel@nongnu.org; Wed, 07 Mar 2012 04:24:05 -0500 Received: from /spool/local by e23smtp06.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 7 Mar 2012 09:19:43 +1000 Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q279NiPw1458414 for ; Wed, 7 Mar 2012 20:23:45 +1100 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q279NiHb000476 for ; Wed, 7 Mar 2012 20:23:44 +1100 From: Dong Xu Wang Date: Wed, 7 Mar 2012 17:22:57 +0800 Message-Id: <1331112179-12726-2-git-send-email-wdongxu@linux.vnet.ibm.com> In-Reply-To: <1331112179-12726-1-git-send-email-wdongxu@linux.vnet.ibm.com> References: <1331112179-12726-1-git-send-email-wdongxu@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 2/4] block: image fragmentation statistics for qed List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, Dong Xu Wang , stefanha@linux.vnet.ibm.com From: Dong Xu Wang Add fragmentation statistics for qed file format. Signed-off-by: Dong Xu Wang --- block/qed.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+), 0 deletions(-) diff --git a/block/qed.c b/block/qed.c index a041d31..eb4dd90 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1444,6 +1444,46 @@ static int bdrv_qed_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) return 0; } +static int bdrv_qed_get_fragment(BlockDriverState *bs, BlockFragInfo *bfi) +{ + BDRVQEDState *s = bs->opaque; + uint32_t cluster_size = s->header.cluster_size; + uint64_t table_noffsets = s->header.table_size * cluster_size / sizeof(uint64_t); + uint64_t i, j; + uint64_t l2_offset; + int ret = 0; + uint64_t last_offset = 0; + uint64_t size = s->header.table_size * cluster_size; + uint64_t *table = qemu_blockalign(s->bs, size); + + for (i = 0; i < table_noffsets; i++) { + l2_offset = s->l1_table->offsets[i]; + if (l2_offset == 0) { + continue; + } + ret = bdrv_pread(bs->file, l2_offset, table, size); + if (ret < 0) { + qemu_vfree(table); + return ret; + } + for (j = 0; j < size/sizeof(uint64_t); j++) { + uint64_t *offset = (uint64_t *)(table + j); + if (*offset < cluster_size) { + continue; + } + bfi->allocated_clusters++; + if (last_offset && (last_offset + cluster_size) != *offset) { + bfi->fragmented_clusters++; + } + last_offset = *offset; + } + } + bfi->total_clusters = (s->header.image_size + s->header.cluster_size - 1) / + s->header.cluster_size; + qemu_vfree(table); + return ret; +} + static int bdrv_qed_change_backing_file(BlockDriverState *bs, const char *backing_file, const char *backing_fmt) @@ -1569,6 +1609,7 @@ static BlockDriver bdrv_qed = { .bdrv_get_info = bdrv_qed_get_info, .bdrv_change_backing_file = bdrv_qed_change_backing_file, .bdrv_check = bdrv_qed_check, + .bdrv_get_fragment = bdrv_qed_get_fragment, }; static void bdrv_qed_init(void) -- 1.7.5.4