From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43115) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bPQU9-0006B0-7y for qemu-devel@nongnu.org; Tue, 19 Jul 2016 04:34:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bPQU7-0003PG-8j for qemu-devel@nongnu.org; Tue, 19 Jul 2016 04:34:36 -0400 Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 19 Jul 2016 10:34:17 +0200 Message-Id: <1468917259-8475-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1468917259-8475-1-git-send-email-pbonzini@redhat.com> References: <1468917259-8475-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 10/12] block/iscsi: fix rounding in iscsi_allocationmap_set List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Lieven , qemu-stable@nongnu.org From: Peter Lieven 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: qemu-stable@nongnu.org Reported-by: Paolo Bonzini Signed-off-by: Peter Lieven Message-Id: <1468831940-15556-2-git-send-email-pl@kamp.de> Signed-off-by: Paolo Bonzini --- 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, -- 2.7.4