All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, kwolf@nongnu.org, jsnow@redhat.com,
	Ronnie Sahlberg <ronniesahlberg@gmail.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Peter Lieven <pl@kamp.de>,
	Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH 15/31] iscsi: Switch cluster_sectors to byte-based
Date: Mon, 17 Apr 2017 20:33:40 -0500	[thread overview]
Message-ID: <20170418013356.3578-16-eblake@redhat.com> (raw)
In-Reply-To: <20170418013356.3578-1-eblake@redhat.com>

We are gradually converting to byte-based interfaces, as they are
easier to reason about than sector-based.  Convert all uses of
the cluster size in sectors, along with adding assertions that we
are not dividing by zero.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 block/iscsi.c | 56 +++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 21 deletions(-)

diff --git a/block/iscsi.c b/block/iscsi.c
index 5daa201..9648a45 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -79,7 +79,7 @@ typedef struct IscsiLun {
     unsigned long *allocmap;
     unsigned long *allocmap_valid;
     long allocmap_size;
-    int cluster_sectors;
+    int cluster_size;
     bool use_16_for_rw;
     bool write_protected;
     bool lbpme;
@@ -460,9 +460,10 @@ static int iscsi_allocmap_init(IscsiLun *iscsilun, int open_flags)
 {
     iscsi_allocmap_free(iscsilun);

+    assert(iscsilun->cluster_size);
     iscsilun->allocmap_size =
-        DIV_ROUND_UP(sector_lun2qemu(iscsilun->num_blocks, iscsilun),
-                     iscsilun->cluster_sectors);
+        DIV_ROUND_UP(iscsilun->num_blocks * iscsilun->block_size,
+                     iscsilun->cluster_size);

     iscsilun->allocmap = bitmap_try_new(iscsilun->allocmap_size);
     if (!iscsilun->allocmap) {
@@ -470,7 +471,7 @@ static int iscsi_allocmap_init(IscsiLun *iscsilun, int open_flags)
     }

     if (open_flags & BDRV_O_NOCACHE) {
-        /* in case that cache.direct = on all allocmap entries are
+        /* when cache.direct = on all allocmap entries are
          * treated as invalid to force a relookup of the block
          * status on every read request */
         return 0;
@@ -491,17 +492,19 @@ iscsi_allocmap_update(IscsiLun *iscsilun, int64_t sector_num,
                       int nb_sectors, bool allocated, bool valid)
 {
     int64_t cl_num_expanded, nb_cls_expanded, cl_num_shrunk, nb_cls_shrunk;
+    int cluster_sectors = iscsilun->cluster_size >> BDRV_SECTOR_BITS;

     if (iscsilun->allocmap == NULL) {
         return;
     }
     /* expand to entirely contain all affected clusters */
-    cl_num_expanded = sector_num / iscsilun->cluster_sectors;
+    assert(cluster_sectors);
+    cl_num_expanded = sector_num / cluster_sectors;
     nb_cls_expanded = DIV_ROUND_UP(sector_num + nb_sectors,
-                                   iscsilun->cluster_sectors) - cl_num_expanded;
+                                   cluster_sectors) - cl_num_expanded;
     /* shrink to touch only completely contained clusters */
-    cl_num_shrunk = DIV_ROUND_UP(sector_num, iscsilun->cluster_sectors);
-    nb_cls_shrunk = (sector_num + nb_sectors) / iscsilun->cluster_sectors
+    cl_num_shrunk = DIV_ROUND_UP(sector_num, cluster_sectors);
+    nb_cls_shrunk = (sector_num + nb_sectors) / cluster_sectors
                       - cl_num_shrunk;
     if (allocated) {
         bitmap_set(iscsilun->allocmap, cl_num_expanded, nb_cls_expanded);
@@ -565,9 +568,12 @@ iscsi_allocmap_is_allocated(IscsiLun *iscsilun, int64_t sector_num,
     if (iscsilun->allocmap == NULL) {
         return true;
     }
-    size = DIV_ROUND_UP(sector_num + nb_sectors, iscsilun->cluster_sectors);
+    assert(iscsilun->cluster_size);
+    size = DIV_ROUND_UP(sector_num + nb_sectors,
+                        iscsilun->cluster_size >> BDRV_SECTOR_BITS);
     return !(find_next_bit(iscsilun->allocmap, size,
-                           sector_num / iscsilun->cluster_sectors) == size);
+                           sector_num * BDRV_SECTOR_SIZE /
+                           iscsilun->cluster_size) == size);
 }

 static inline bool iscsi_allocmap_is_valid(IscsiLun *iscsilun,
@@ -577,9 +583,12 @@ static inline bool iscsi_allocmap_is_valid(IscsiLun *iscsilun,
     if (iscsilun->allocmap_valid == NULL) {
         return false;
     }
-    size = DIV_ROUND_UP(sector_num + nb_sectors, iscsilun->cluster_sectors);
+    assert(iscsilun->cluster_size);
+    size = DIV_ROUND_UP(sector_num + nb_sectors,
+                        iscsilun->cluster_size >> BDRV_SECTOR_BITS);
     return (find_next_zero_bit(iscsilun->allocmap_valid, size,
-                               sector_num / iscsilun->cluster_sectors) == size);
+                               sector_num * BDRV_SECTOR_SIZE /
+                               iscsilun->cluster_size) == size);
 }

 static int coroutine_fn
@@ -814,16 +823,21 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
         BlockDriverState *file;
         /* check the block status from the beginning of the cluster
          * containing the start sector */
-        int64_t ret = iscsi_co_get_block_status(bs,
-                          sector_num - sector_num % iscsilun->cluster_sectors,
-                          BDRV_REQUEST_MAX_SECTORS, &pnum, &file);
+        int cluster_sectors = iscsilun->cluster_size >> BDRV_SECTOR_BITS;
+        int head;
+        int64_t ret;
+
+        assert(cluster_sectors);
+        head = sector_num % cluster_sectors;
+        ret = iscsi_co_get_block_status(bs, sector_num - head,
+                                        BDRV_REQUEST_MAX_SECTORS, &pnum,
+                                        &file);
         if (ret < 0) {
             return ret;
         }
         /* if the whole request falls into an unallocated area we can avoid
-         * to read and directly return zeroes instead */
-        if (ret & BDRV_BLOCK_ZERO &&
-            pnum >= nb_sectors + sector_num % iscsilun->cluster_sectors) {
+         * reading and directly return zeroes instead */
+        if (ret & BDRV_BLOCK_ZERO && pnum >= nb_sectors + head) {
             qemu_iovec_memset(iov, 0, 0x00, iov->size);
             return 0;
         }
@@ -1944,8 +1958,8 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
      * reasonable size */
     if (iscsilun->bl.opt_unmap_gran * iscsilun->block_size >= 4 * 1024 &&
         iscsilun->bl.opt_unmap_gran * iscsilun->block_size <= 16 * 1024 * 1024) {
-        iscsilun->cluster_sectors = (iscsilun->bl.opt_unmap_gran *
-                                     iscsilun->block_size) >> BDRV_SECTOR_BITS;
+        iscsilun->cluster_size = iscsilun->bl.opt_unmap_gran *
+            iscsilun->block_size;
         if (iscsilun->lbprz) {
             ret = iscsi_allocmap_init(iscsilun, bs->open_flags);
         }
@@ -2143,7 +2157,7 @@ static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
     IscsiLun *iscsilun = bs->opaque;
     bdi->unallocated_blocks_are_zero = iscsilun->lbprz;
     bdi->can_write_zeroes_with_unmap = iscsilun->lbprz && iscsilun->lbp.lbpws;
-    bdi->cluster_size = iscsilun->cluster_sectors * BDRV_SECTOR_SIZE;
+    bdi->cluster_size = iscsilun->cluster_size;
     return 0;
 }

-- 
2.9.3

  parent reply	other threads:[~2017-04-18  1:34 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-18  1:33 [Qemu-devel] [PATCH 00/31] make bdrv_get_block_status byte-based Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 01/31] block: Drop unused bdrv_round_sectors_to_clusters() Eric Blake
2017-04-26 21:41   ` John Snow
2017-04-18  1:33 ` [Qemu-devel] [PATCH 02/31] block: Make bdrv_round_to_clusters() signature more useful Eric Blake
2017-04-26 21:41   ` John Snow
2017-04-26 21:47     ` Eric Blake
2017-04-26 21:54       ` John Snow
2017-04-18  1:33 ` [Qemu-devel] [PATCH 03/31] qcow2: Switch is_zero_sectors() to byte-based Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 04/31] block: Switch bdrv_make_zero() " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 05/31] qemu-img: Switch get_block_status() " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 06/31] block: Convert bdrv_get_block_status() to bytes Eric Blake
2017-04-18 21:34   ` [Qemu-devel] [PATCH v1.5 06.5/31] fixup! " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 07/31] block: Switch bdrv_co_get_block_status() to byte-based Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 08/31] block: Switch BdrvCoGetBlockStatusData " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 09/31] block: Switch bdrv_co_get_block_status_above() " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 10/31] block: Convert bdrv_get_block_status_above() to bytes Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 11/31] block: Add .bdrv_co_block_status() callback Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 12/31] commit: Switch to .bdrv_co_block_status() Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 13/31] file-posix: " Eric Blake
2017-04-18 20:56   ` Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 14/31] gluster: " Eric Blake
2017-04-19 13:26   ` [Qemu-devel] [Qemu-block] " Niels de Vos
2017-04-19 14:06   ` [Qemu-devel] " Prasanna Kalever
2017-04-19 14:08     ` Prasanna Kalever
2017-04-18  1:33 ` Eric Blake [this message]
2017-04-18  1:33 ` [Qemu-devel] [PATCH 16/31] iscsi: Switch iscsi_allocmap_update() to byte-based Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 17/31] iscsi: Switch to .bdrv_co_block_status() Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 18/31] mirror: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 19/31] null: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 20/31] parallels: " Eric Blake
2017-04-18 10:28   ` Denis V. Lunev
2017-04-18  1:33 ` [Qemu-devel] [PATCH 21/31] qcow: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 22/31] qcow2: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 23/31] qed: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 24/31] raw: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 25/31] sheepdog: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 26/31] vdi: Avoid bitrot of debugging code Eric Blake
2017-04-18  5:13   ` Stefan Weil
2017-05-13 20:35     ` Philippe Mathieu-Daudé
2017-04-18  1:33 ` [Qemu-devel] [PATCH 27/31] vdi: Switch to .bdrv_co_block_status() Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 28/31] vmdk: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 29/31] vpc: " Eric Blake
2017-07-13 12:55   ` Kevin Wolf
2017-07-13 13:52     ` Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 30/31] vvfat: " Eric Blake
2017-04-18  1:33 ` [Qemu-devel] [PATCH 31/31] block: Drop unused .bdrv_co_get_block_status() Eric Blake
2017-04-18  1:37 ` [Qemu-devel] [Qemu-block] [PATCH 00/31] make bdrv_get_block_status byte-based Eric Blake
2017-04-18 20:23 ` [Qemu-devel] " Eric Blake

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=20170418013356.3578-16-eblake@redhat.com \
    --to=eblake@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@nongnu.org \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pl@kamp.de \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=ronniesahlberg@gmail.com \
    /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.