All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 02/24] qcow2: Define and use QCOW2_COMPRESSED_SECTOR_SIZE
Date: Mon, 20 May 2019 18:14:31 +0200	[thread overview]
Message-ID: <20190520161453.30723-3-kwolf@redhat.com> (raw)
In-Reply-To: <20190520161453.30723-1-kwolf@redhat.com>

From: Alberto Garcia <berto@igalia.com>

When an L2 table entry points to a compressed cluster the space used
by the data is specified in 512-byte sectors. This size is independent
from BDRV_SECTOR_SIZE and is specific to the qcow2 file format.

The QCOW2_COMPRESSED_SECTOR_SIZE constant defined in this patch makes
this explicit.

Signed-off-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qcow2.h          |  4 ++++
 block/qcow2-cluster.c  |  5 +++--
 block/qcow2-refcount.c | 25 ++++++++++++++-----------
 block/qcow2.c          |  3 ++-
 4 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/block/qcow2.h b/block/qcow2.h
index e62508d1ce..8d92ef1fee 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -74,6 +74,10 @@
 #define MIN_CLUSTER_BITS 9
 #define MAX_CLUSTER_BITS 21
 
+/* Defined in the qcow2 spec (compressed cluster descriptor) */
+#define QCOW2_COMPRESSED_SECTOR_SIZE 512U
+#define QCOW2_COMPRESSED_SECTOR_MASK (~(QCOW2_COMPRESSED_SECTOR_SIZE - 1))
+
 /* Must be at least 2 to cover COW */
 #define MIN_L2_CACHE_SIZE 2 /* cache entries */
 
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 974a4e8656..b36f4aa84a 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -796,8 +796,9 @@ int qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
         return cluster_offset;
     }
 
-    nb_csectors = ((cluster_offset + compressed_size - 1) >> 9) -
-                  (cluster_offset >> 9);
+    nb_csectors =
+        (cluster_offset + compressed_size - 1) / QCOW2_COMPRESSED_SECTOR_SIZE -
+        (cluster_offset / QCOW2_COMPRESSED_SECTOR_SIZE);
 
     cluster_offset |= QCOW_OFLAG_COMPRESSED |
                       ((uint64_t)nb_csectors << s->csize_shift);
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 7481903396..0b09d6838b 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1172,12 +1172,11 @@ void qcow2_free_any_clusters(BlockDriverState *bs, uint64_t l2_entry,
     switch (ctype) {
     case QCOW2_CLUSTER_COMPRESSED:
         {
-            int nb_csectors;
-            nb_csectors = ((l2_entry >> s->csize_shift) &
-                           s->csize_mask) + 1;
-            qcow2_free_clusters(bs,
-                (l2_entry & s->cluster_offset_mask) & ~511,
-                nb_csectors * 512, type);
+            int64_t offset = (l2_entry & s->cluster_offset_mask)
+                & QCOW2_COMPRESSED_SECTOR_MASK;
+            int size = QCOW2_COMPRESSED_SECTOR_SIZE *
+                (((l2_entry >> s->csize_shift) & s->csize_mask) + 1);
+            qcow2_free_clusters(bs, offset, size, type);
         }
         break;
     case QCOW2_CLUSTER_NORMAL:
@@ -1317,9 +1316,12 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
                         nb_csectors = ((entry >> s->csize_shift) &
                                        s->csize_mask) + 1;
                         if (addend != 0) {
+                            uint64_t coffset = (entry & s->cluster_offset_mask)
+                                & QCOW2_COMPRESSED_SECTOR_MASK;
                             ret = update_refcount(
-                                bs, (entry & s->cluster_offset_mask) & ~511,
-                                nb_csectors * 512, abs(addend), addend < 0,
+                                bs, coffset,
+                                nb_csectors * QCOW2_COMPRESSED_SECTOR_SIZE,
+                                abs(addend), addend < 0,
                                 QCOW2_DISCARD_SNAPSHOT);
                             if (ret < 0) {
                                 goto fail;
@@ -1635,9 +1637,10 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
             nb_csectors = ((l2_entry >> s->csize_shift) &
                            s->csize_mask) + 1;
             l2_entry &= s->cluster_offset_mask;
-            ret = qcow2_inc_refcounts_imrt(bs, res,
-                                           refcount_table, refcount_table_size,
-                                           l2_entry & ~511, nb_csectors * 512);
+            ret = qcow2_inc_refcounts_imrt(
+                bs, res, refcount_table, refcount_table_size,
+                l2_entry & QCOW2_COMPRESSED_SECTOR_MASK,
+                nb_csectors * QCOW2_COMPRESSED_SECTOR_SIZE);
             if (ret < 0) {
                 goto fail;
             }
diff --git a/block/qcow2.c b/block/qcow2.c
index 8e024007db..d39882785d 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -4187,7 +4187,8 @@ qcow2_co_preadv_compressed(BlockDriverState *bs,
 
     coffset = file_cluster_offset & s->cluster_offset_mask;
     nb_csectors = ((file_cluster_offset >> s->csize_shift) & s->csize_mask) + 1;
-    csize = nb_csectors * 512 - (coffset & 511);
+    csize = nb_csectors * QCOW2_COMPRESSED_SECTOR_SIZE -
+        (coffset & ~QCOW2_COMPRESSED_SECTOR_MASK);
 
     buf = g_try_malloc(csize);
     if (!buf) {
-- 
2.20.1



  parent reply	other threads:[~2019-05-20 16:18 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-20 16:14 [Qemu-devel] [PULL 00/24] Block layer patches Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 01/24] block/file-posix: Truncate in xfs_write_zeroes() Kevin Wolf
2019-05-20 16:14 ` Kevin Wolf [this message]
2019-05-20 16:14 ` [Qemu-devel] [PULL 03/24] block: Use BDRV_REQUEST_MAX_BYTES instead of BDRV_REQUEST_MAX_SECTORS Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 04/24] qmp: forbid qmp_cont in RUN_STATE_FINISH_MIGRATE Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 05/24] iotest: fix 169: do not run " Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 06/24] nvme: fix copy direction in DMA reads going to CMB Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 07/24] block: Add bdrv_try_set_aio_context() Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 08/24] block: Make bdrv_attach/detach_aio_context() static Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 09/24] block: Move recursion to bdrv_set_aio_context() Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 10/24] block: Propagate AioContext change to parents Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 11/24] test-block-iothread: Test AioContext propagation through the tree Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 12/24] block: Implement .(can_)set_aio_ctx for BlockBackend Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 13/24] block: Add blk_set_allow_aio_context_change() Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 14/24] blockjob: Propagate AioContext change to all job nodes Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 15/24] blockjob: Remove AioContext notifiers Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 16/24] test-block-iothread: Test AioContext propagation for block jobs Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 17/24] block/file-posix: Unaligned O_DIRECT block-status Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 18/24] iotests: Test unaligned raw images with O_DIRECT Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 19/24] qemu-img.texi: Be specific about JSON object types Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 20/24] qemu-img.texi: Describe human-readable info output Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 21/24] block: Improve "Block node is read-only" message Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 22/24] iotests.py: Let assert_qmp() accept an array Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 23/24] iotests.py: Fix VM.run_job Kevin Wolf
2019-05-20 16:14 ` [Qemu-devel] [PULL 24/24] iotests: Make 245 faster and more reliable Kevin Wolf
2019-05-20 17:08 ` [Qemu-devel] [PULL 00/24] Block layer patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190520161453.30723-3-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.