diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-06-03 11:11:04 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-06-03 11:11:04 +0100 |
commit | 2f78e9cccf5203964043e4b7656da663d9d8e30f (patch) | |
tree | caa6b0cdd17caae44cd9fafce66ba6a8a0369e2f /tools/blktap/drivers | |
parent | 09c8ee7eaca8262064544fe50ba4ed5ddad56b0e (diff) | |
download | xen-2f78e9cccf5203964043e4b7656da663d9d8e30f.tar.gz xen-2f78e9cccf5203964043e4b7656da663d9d8e30f.tar.bz2 xen-2f78e9cccf5203964043e4b7656da663d9d8e30f.zip |
blktap: fix and use ROUNDUP macro (bug 1430 part 1)
As pointed out in Xen Bugzilla 1430 in the blktap QCOW driver the
rounding function is wrong in line 824 of block-qcow.c.
This patch replaces this (and other roundings) with the already
existing ROUNDUP macro (and fixes the usual macro pitfall).
Signed-off-by: Andre Przywara <andre.przywara@amd.com>
Diffstat (limited to 'tools/blktap/drivers')
-rw-r--r-- | tools/blktap/drivers/block-qcow.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/tools/blktap/drivers/block-qcow.c b/tools/blktap/drivers/block-qcow.c index c6d32a4077..dd65cd01bb 100644 --- a/tools/blktap/drivers/block-qcow.c +++ b/tools/blktap/drivers/block-qcow.c @@ -55,7 +55,7 @@ #define ROUNDUP(l, s) \ ({ \ (uint64_t)( \ - (l + (s - 1)) - ((l + (s - 1)) % s)); \ + ((l) + ((s) - 1)) - (((l) + ((s) - 1)) % (s))); \ }) #undef IOCB_IDX @@ -800,14 +800,14 @@ static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flag /* read the level 1 table */ shift = s->cluster_bits + s->l2_bits; - s->l1_size = (header->size + (1LL << shift) - 1) >> shift; + s->l1_size = ROUNDUP(header->size, 1LL << shift); s->l1_table_offset = header->l1_table_offset; /*allocate a 4Kbyte multiple of memory*/ l1_table_size = s->l1_size * sizeof(uint64_t); if (l1_table_size % 4096 > 0) { - l1_table_size = ((l1_table_size >> 12) + 1) << 12; + l1_table_size = ROUNDUP(l1_table_size, 4096); } ret = posix_memalign((void **)&s->l1_table, 4096, l1_table_size); if (ret != 0) goto fail; @@ -821,7 +821,7 @@ static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flag lseek(fd, 0, SEEK_SET); l1_table_block = l1_table_size + s->l1_table_offset; - l1_table_block = l1_table_block + 512 - (l1_table_block % 512); + l1_table_block = ROUNDUP(l1_table_block, 512); ret = posix_memalign((void **)&buf2, 4096, l1_table_block); if (ret != 0) goto fail; if (read(fd, buf2, l1_table_block) != l1_table_block) @@ -1226,11 +1226,11 @@ int qcow_create(const char *filename, uint64_t total_size, header_size = (header_size + 7) & ~7; if (header_size % 4096 > 0) { - header_size = ((header_size >> 12) + 1) << 12; + header_size = ROUNDUP(header_size, 4096); } shift = header.cluster_bits + header.l2_bits; - l1_size = ((size * 512) + (1LL << shift) - 1) >> shift; + l1_size = ROUNDUP(size * 512, 1LL << shift); header.l1_table_offset = cpu_to_be64(header_size); DPRINTF("L1 Table offset: %d, size %d\n", |