From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49333) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USnKq-0005hK-UQ for qemu-devel@nongnu.org; Thu, 18 Apr 2013 07:49:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1USnKp-0006aR-BT for qemu-devel@nongnu.org; Thu, 18 Apr 2013 07:49:04 -0400 Received: from mail-pa0-f49.google.com ([209.85.220.49]:47622) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USnKp-0006aH-5A for qemu-devel@nongnu.org; Thu, 18 Apr 2013 07:49:03 -0400 Received: by mail-pa0-f49.google.com with SMTP id kp14so1532196pab.22 for ; Thu, 18 Apr 2013 04:49:02 -0700 (PDT) From: Liu Yuan Date: Thu, 18 Apr 2013 19:48:52 +0800 Message-Id: <1366285732-21694-1-git-send-email-namei.unix@gmail.com> Subject: [Qemu-devel] [PATCH] sheepdog: implement .bdrv_co_is_allocated List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , sheepdog@lists.wpkg.org, Stefan Hajnoczi , MORITA Kazutaka From: Liu Yuan Cc: MORITA Kazutaka Cc: Kevin Wolf Cc: Stefan Hajnoczi Signed-off-by: Liu Yuan --- NOTE: This patch based on the previous discard path block/sheepdog.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/block/sheepdog.c b/block/sheepdog.c index c099117..80f7bfc 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2138,6 +2138,29 @@ static coroutine_fn int sd_co_discard(BlockDriverState *bs, int64_t sector_num, return acb->ret; } +static coroutine_fn int +sd_co_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, + int *pnum) +{ + BDRVSheepdogState *s = bs->opaque; + SheepdogInode *inode = &s->inode; + unsigned long start = sector_num * SECTOR_SIZE / SD_DATA_OBJ_SIZE, idx, + end = start + (nb_sectors * SECTOR_SIZE) / SD_DATA_OBJ_SIZE; + + for (idx = start; idx <= end; idx++) { + if (inode->data_vdi_id[idx] == 0) { + break; + } + } + if (idx == start) { + *pnum = SD_DATA_OBJ_SIZE / SECTOR_SIZE; + return 0; + } + + *pnum = (idx - start) * SD_DATA_OBJ_SIZE / SECTOR_SIZE; + return 1; +} + static QEMUOptionParameter sd_create_options[] = { { .name = BLOCK_OPT_SIZE, @@ -2171,6 +2194,7 @@ static BlockDriver bdrv_sheepdog = { .bdrv_co_writev = sd_co_writev, .bdrv_co_flush_to_disk = sd_co_flush_to_disk, .bdrv_co_discard = sd_co_discard, + .bdrv_co_is_allocated = sd_co_is_allocated, .bdrv_snapshot_create = sd_snapshot_create, .bdrv_snapshot_goto = sd_snapshot_goto, @@ -2197,6 +2221,7 @@ static BlockDriver bdrv_sheepdog_tcp = { .bdrv_co_writev = sd_co_writev, .bdrv_co_flush_to_disk = sd_co_flush_to_disk, .bdrv_co_discard = sd_co_discard, + .bdrv_co_is_allocated = sd_co_is_allocated, .bdrv_snapshot_create = sd_snapshot_create, .bdrv_snapshot_goto = sd_snapshot_goto, @@ -2223,6 +2248,7 @@ static BlockDriver bdrv_sheepdog_unix = { .bdrv_co_writev = sd_co_writev, .bdrv_co_flush_to_disk = sd_co_flush_to_disk, .bdrv_co_discard = sd_co_discard, + .bdrv_co_is_allocated = sd_co_is_allocated, .bdrv_snapshot_create = sd_snapshot_create, .bdrv_snapshot_goto = sd_snapshot_goto, -- 1.7.9.5