From nobody Tue Feb 10 08:26:41 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528386272086441.067131757364; Thu, 7 Jun 2018 08:44:32 -0700 (PDT) Received: from localhost ([::1]:58709 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQx5Q-0004Qd-Sz for importer@patchew.org; Thu, 07 Jun 2018 11:44:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35430) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQx04-0007zA-Bv for qemu-devel@nongnu.org; Thu, 07 Jun 2018 11:38:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQx02-000483-Ty for qemu-devel@nongnu.org; Thu, 07 Jun 2018 11:38:56 -0400 Received: from mx2.mpynet.fi ([82.197.21.85]:21992) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fQwzy-00042r-4t; Thu, 07 Jun 2018 11:38:50 -0400 From: Ari Sundholm To: Date: Thu, 7 Jun 2018 18:38:14 +0300 Message-ID: <1528385894-19434-11-git-send-email-ari@tuxera.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1528385894-19434-1-git-send-email-ari@tuxera.com> References: <1528385894-19434-1-git-send-email-ari@tuxera.com> MIME-Version: 1.0 X-ClientProxiedBy: tuxera-exch.ad.tuxera.com (10.20.48.11) To tuxera-exch.ad.tuxera.com (10.20.48.11) Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 82.197.21.85 Subject: [Qemu-devel] [PATCH v3 10/10] block/blklogwrites: Use the block device logical sector size when logging writes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "open list:blklogwrites" , Ari Sundholm , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The guest OS may perform writes which are aligned to the logical sector size instead of the physical one, so logging at this granularity records the writes performed on the block device most faithfully. Signed-off-by: Ari Sundholm --- block/blklogwrites.c | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/block/blklogwrites.c b/block/blklogwrites.c index 8b09e12..52166f2 100644 --- a/block/blklogwrites.c +++ b/block/blklogwrites.c @@ -47,6 +47,8 @@ struct log_write_entry { =20 typedef struct { BdrvChild *log_file; + uint32_t sectorsize; + uint32_t sectorbits; uint64_t cur_log_sector; uint64_t nr_entries; } BDRVBlkLogWritesState; @@ -67,6 +69,8 @@ static int blk_log_writes_open(BlockDriverState *bs, QDic= t *options, int flags, goto fail; } =20 + s->sectorsize =3D BDRV_SECTOR_SIZE; /* May be updated later */ + s->sectorbits =3D BDRV_SECTOR_BITS; s->cur_log_sector =3D 1; s->nr_entries =3D 0; =20 @@ -168,11 +172,20 @@ static void blk_log_writes_refresh_limits(BlockDriver= State *bs, Error **errp) } } =20 +static inline uint32_t blk_log_writes_log2(uint32_t value) +{ + assert(value > 0); + return 31 - clz32(value); +} + static void blk_log_writes_apply_blkconf(BlockDriverState *bs, BlockConf *= conf) { - assert(bs && conf && conf->blk); + BDRVBlkLogWritesState *s =3D bs->opaque; + assert(bs && conf && conf->blk && s); =20 - bs->bl.request_alignment =3D conf->logical_block_size; + s->sectorsize =3D conf->logical_block_size; + s->sectorbits =3D blk_log_writes_log2(s->sectorsize); + bs->bl.request_alignment =3D s->sectorsize; if (conf->discard_granularity !=3D (uint32_t)-1) { bs->bl.pdiscard_alignment =3D conf->discard_granularity; } @@ -215,20 +228,20 @@ typedef struct { static void coroutine_fn blk_log_writes_co_do_log(BlkLogWritesLogReq *lr) { BDRVBlkLogWritesState *s =3D lr->bs->opaque; - uint64_t cur_log_offset =3D s->cur_log_sector << BDRV_SECTOR_BITS; + uint64_t cur_log_offset =3D s->cur_log_sector << s->sectorbits; =20 s->nr_entries++; s->cur_log_sector +=3D - ROUND_UP(lr->qiov->size, BDRV_SECTOR_SIZE) >> BDRV_SECTOR_BITS; + ROUND_UP(lr->qiov->size, s->sectorsize) >> s->sectorbits; =20 lr->log_ret =3D bdrv_co_pwritev(s->log_file, cur_log_offset, lr->qiov-= >size, lr->qiov, 0); =20 /* Logging for the "write zeroes" operation */ if (lr->log_ret =3D=3D 0 && lr->zero_size) { - cur_log_offset =3D s->cur_log_sector << BDRV_SECTOR_BITS; + cur_log_offset =3D s->cur_log_sector << s->sectorbits; s->cur_log_sector +=3D - ROUND_UP(lr->zero_size, BDRV_SECTOR_SIZE) >> BDRV_SECTOR_B= ITS; + ROUND_UP(lr->zero_size, s->sectorsize) >> s->sectorbits; =20 lr->log_ret =3D bdrv_co_pwrite_zeroes(s->log_file, cur_log_offset, lr->zero_size, 0); @@ -240,21 +253,22 @@ static void coroutine_fn blk_log_writes_co_do_log(Blk= LogWritesLogReq *lr) .magic =3D cpu_to_le64(WRITE_LOG_MAGIC), .version =3D cpu_to_le64(WRITE_LOG_VERSION), .nr_entries =3D cpu_to_le64(s->nr_entries), - .sectorsize =3D cpu_to_le32(1 << BDRV_SECTOR_BITS), + .sectorsize =3D cpu_to_le32(s->sectorsize), }; - static const char zeroes[BDRV_SECTOR_SIZE - sizeof(super)] =3D { '= \0' }; + void *zeroes =3D g_malloc0(s->sectorsize - sizeof(super)); QEMUIOVector qiov; =20 qemu_iovec_init(&qiov, 2); qemu_iovec_add(&qiov, &super, sizeof(super)); - qemu_iovec_add(&qiov, (void *)zeroes, sizeof(zeroes)); + qemu_iovec_add(&qiov, zeroes, s->sectorsize - sizeof(super)); =20 lr->log_ret =3D - bdrv_co_pwritev(s->log_file, 0, BDRV_SECTOR_SIZE, &qiov, 0); + bdrv_co_pwritev(s->log_file, 0, s->sectorsize, &qiov, 0); if (lr->log_ret =3D=3D 0) { lr->log_ret =3D bdrv_co_flush(s->log_file->bs); } qemu_iovec_destroy(&qiov); + g_free(zeroes); } } =20 @@ -271,6 +285,7 @@ blk_log_writes_co_log(BlockDriverState *bs, uint64_t of= fset, uint64_t bytes, { QEMUIOVector log_qiov; size_t niov =3D qiov ? qiov->niov : 0; + BDRVBlkLogWritesState *s =3D bs->opaque; BlkLogWritesFileReq fr =3D { .bs =3D bs, .offset =3D offset, @@ -283,22 +298,23 @@ blk_log_writes_co_log(BlockDriverState *bs, uint64_t = offset, uint64_t bytes, .bs =3D bs, .qiov =3D &log_qiov, .entry =3D { - .sector =3D cpu_to_le64(offset >> BDRV_SECTOR_BITS), - .nr_sectors =3D cpu_to_le64(bytes >> BDRV_SECTOR_BITS), + .sector =3D cpu_to_le64(offset >> s->sectorbits), + .nr_sectors =3D cpu_to_le64(bytes >> s->sectorbits), .flags =3D cpu_to_le64(entry_flags), .data_len =3D 0, }, .zero_size =3D is_zero_write ? bytes : 0, }; - static const char zeroes[BDRV_SECTOR_SIZE - sizeof(struct log_write_en= try)] - =3D { '\0' }; + void *zeroes =3D g_malloc0(s->sectorsize - sizeof(lr.entry)); =20 + assert((1 << s->sectorbits) =3D=3D s->sectorsize); + assert(bs->bl.request_alignment =3D=3D s->sectorsize); assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); =20 qemu_iovec_init(&log_qiov, niov + 2); qemu_iovec_add(&log_qiov, &lr.entry, sizeof(lr.entry)); - qemu_iovec_add(&log_qiov, (void *)zeroes, sizeof(zeroes)); + qemu_iovec_add(&log_qiov, zeroes, s->sectorsize - sizeof(lr.entry)); for (size_t i =3D 0; i < niov; ++i) { qemu_iovec_add(&log_qiov, qiov->iov[i].iov_base, qiov->iov[i].iov_= len); } @@ -307,6 +323,7 @@ blk_log_writes_co_log(BlockDriverState *bs, uint64_t of= fset, uint64_t bytes, blk_log_writes_co_do_log(&lr); =20 qemu_iovec_destroy(&log_qiov); + g_free(zeroes); =20 if (lr.log_ret < 0) { return lr.log_ret; --=20 2.7.4