[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH V5 1/2] block/iscsi: fix rounding in iscsi_allocati
From: |
Peter Lieven |
Subject: |
[Qemu-stable] [PATCH V5 1/2] block/iscsi: fix rounding in iscsi_allocationmap_set |
Date: |
Mon, 18 Jul 2016 10:52:19 +0200 |
when setting clusters as alloacted the boundaries have
to be expanded. As Paolo pointed out the calculation of
the number of clusters is wrong:
Suppose cluster_sectors is 2, sector_num = 1, nb_sectors = 6:
In the "mark allocated" case, you want to set 0..8, i.e.
cluster_num=0, nb_clusters=4.
0--.--2--.--4--.--6--.--8
<--|_________________|--> (<--> = expanded)
Instead you are setting nb_clusters=3, so that 6..8 is not marked.
0--.--2--.--4--.--6--.--8
<--|______________|!!! (! = wrong)
Cc: address@hidden
Reported-by: Paolo Bonzini <address@hidden>
Signed-off-by: Peter Lieven <address@hidden>
---
block/iscsi.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index cf1e9e7..22330e1 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -432,12 +432,14 @@ static unsigned long *iscsi_allocationmap_init(IscsiLun
*iscsilun)
static void iscsi_allocationmap_set(IscsiLun *iscsilun, int64_t sector_num,
int nb_sectors)
{
+ int64_t cluster_num, nb_clusters;
if (iscsilun->allocationmap == NULL) {
return;
}
- bitmap_set(iscsilun->allocationmap,
- sector_num / iscsilun->cluster_sectors,
- DIV_ROUND_UP(nb_sectors, iscsilun->cluster_sectors));
+ cluster_num = sector_num / iscsilun->cluster_sectors;
+ nb_clusters = DIV_ROUND_UP(sector_num + nb_sectors,
+ iscsilun->cluster_sectors) - cluster_num;
+ bitmap_set(iscsilun->allocationmap, cluster_num, nb_clusters);
}
static void iscsi_allocationmap_clear(IscsiLun *iscsilun, int64_t sector_num,
--
1.9.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-stable] [PATCH V5 1/2] block/iscsi: fix rounding in iscsi_allocationmap_set,
Peter Lieven <=