From: Chandrika Srinivasan <chandrika.srinivasan@citrix.com>
Date: Fri, 2 Jun 2017 09:03:07 +0100
CP-22601: Calculate log bit based CBT block size

Signed-off-by: Chandrika Srinivasan <chandrika.srinivasan@citrix.com>
Reviewed-by: Mark Syms <mark.syms@citrix.com>
---
 drivers/block-log.c   | 27 ++++++++++++++++++---------
 drivers/tapdisk-vbd.c |  5 ++---
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/block-log.c b/drivers/block-log.c
index 7cf2863..a46b6d6 100644
--- a/drivers/block-log.c
+++ b/drivers/block-log.c
@@ -78,6 +78,13 @@ static inline void set_bit(int nr, void* bmap)
 	BITMAP_ENTRY(nr, bmap) |= (1UL << BITMAP_SHIFT(nr));
 }
 
+static inline uint64_t
+get_bit_for_sec(td_sector_t sector)
+{
+	uint64_t block = (sector * SECTOR_SIZE) / CBT_BLOCK_SIZE;
+	return block;
+}
+
 static int bitmap_init(struct tdlog_data *data, char *name)
 {
 	uint64_t bmsize;
@@ -92,11 +99,11 @@ static int bitmap_init(struct tdlog_data *data, char *name)
 	}
 
 	if (result == 0) {
-		//data->size is in number of sectors
-		//Convert it to bytes
+		//data->size is in number of sectors, convert it to bytes
 		bmsize = bitmap_size(data->size * SECTOR_SIZE) + sizeof(struct cbt_log_metadata);
-
-		DPRINTF("allocating %"PRIu64" bytes for dirty bitmap", bmsize);
+		DPRINTF("CBT: allocating %"PRIu64" bytes (bitmap %"PRIu64" + header %lu) for dirty bitmap",
+								bmsize, bitmap_size(data->size * SECTOR_SIZE),
+											sizeof(struct cbt_log_metadata));
 
 		data->bitmap = mmap(NULL, bmsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 		if (!data->bitmap) {
@@ -125,14 +132,12 @@ static int bitmap_free(struct tdlog_data *data)
 	return 0;
 }
 
-static int bitmap_set(struct tdlog_data* data, uint64_t sector, int count)
+static int bitmap_set(struct tdlog_data* data, uint64_t block, int count)
 {
 	int i;
 
-	EPRINTF("Setting %d bits starting at sector %"PRIu64"\n", count, sector);
-
 	for (i = 0; i < count; i++)
-		set_bit(sector + i, data->bitmap);
+		set_bit(block + i, data->bitmap);
 
 	return 0;
 }
@@ -171,8 +176,12 @@ static void tdlog_queue_read(td_driver_t* driver, td_request_t treq)
 static void tdlog_queue_write(td_driver_t* driver, td_request_t treq)
 {
 	struct tdlog_data* data = (struct tdlog_data*)driver->data;
+	uint64_t start_bit, last_bit;
+
+	start_bit = get_bit_for_sec(treq.sec);
+	last_bit = get_bit_for_sec(treq.sec + treq.secs - 1);
 
-	bitmap_set(data, treq.sec, treq.secs);
+	bitmap_set(data, start_bit, (last_bit - start_bit) + 1);
 	td_forward_request(treq);
 }
 
diff --git a/drivers/tapdisk-vbd.c b/drivers/tapdisk-vbd.c
index 54c5190..fcdc812 100644
--- a/drivers/tapdisk-vbd.c
+++ b/drivers/tapdisk-vbd.c
@@ -529,13 +529,12 @@ static int tapdisk_vbd_add_dirty_log(td_vbd_t *vbd)
 	driver = NULL;
 	log    = NULL;
 
-	ERR(TLOG_WARN, "tapdisk_vbd_add_dirty_log called for %s with log file %s\n",
+	DPRINTF("CBT:tapdisk_vbd_add_dirty_log called for %s with log file %s\n",
 			vbd->name, vbd->logpath);
 
 	parent = tapdisk_vbd_first_image(vbd);
 
-	ERR(TLOG_WARN, "Size in VBD: %"PRIu64"\n", vbd->disk_info.size);
-	ERR(TLOG_WARN, "Size in Image: %"PRIu64"\n", parent->info.size);
+	DPRINTF("CBT: Size in Image: %"PRIu64" sectors\n", parent->info.size);
 
 	log = tapdisk_image_allocate(vbd->logpath,
 					DISK_TYPE_LOG,
-- 
1.8.3.1

