|
|
0a122b |
From 989d971046a36afa7acb67855f565603297ad2e8 Mon Sep 17 00:00:00 2001
|
|
|
0a122b |
From: Jeffrey Cody <jcody@redhat.com>
|
|
|
0a122b |
Date: Wed, 20 Nov 2013 19:44:01 +0100
|
|
|
0a122b |
Subject: [PATCH 18/25] block: vhdx - remove BAT file offset bit shifting
|
|
|
0a122b |
|
|
|
0a122b |
RH-Author: Jeffrey Cody <jcody@redhat.com>
|
|
|
0a122b |
Message-id: <348f6a1952aa68e9a5cfefb56a7e86f5ff1d01c9.1384975172.git.jcody@redhat.com>
|
|
|
0a122b |
Patchwork-id: 55811
|
|
|
0a122b |
O-Subject: [RHEL7 qemu-kvm PATCH 18/26] block: vhdx - remove BAT file offset bit shifting
|
|
|
0a122b |
Bugzilla: 879234
|
|
|
0a122b |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
0a122b |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
0a122b |
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
0a122b |
|
|
|
0a122b |
Bit shifting can be fun, but in this case it was unnecessary. The
|
|
|
0a122b |
upper 44 bits of the 64-bit BAT entry is specifies the File Offset,
|
|
|
0a122b |
so we shifted the bits to get access to the value.
|
|
|
0a122b |
|
|
|
0a122b |
However, per the spec the value is in MB. So we dutifully shifted back
|
|
|
0a122b |
to the left by 20 bits, to convert to a true uint64_t file offset.
|
|
|
0a122b |
|
|
|
0a122b |
This replaces those steps with just a bit mask, to get rid of the lower
|
|
|
0a122b |
20 bits instead.
|
|
|
0a122b |
|
|
|
0a122b |
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
|
0a122b |
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
0a122b |
(cherry picked from commit 0b7da092b40734538631c3ad461c1753a87535fc)
|
|
|
0a122b |
---
|
|
|
0a122b |
block/vhdx.c | 6 ++----
|
|
|
0a122b |
block/vhdx.h | 1 -
|
|
|
0a122b |
2 files changed, 2 insertions(+), 5 deletions(-)
|
|
|
0a122b |
|
|
|
0a122b |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
0a122b |
---
|
|
|
0a122b |
block/vhdx.c | 6 ++----
|
|
|
0a122b |
block/vhdx.h | 1 -
|
|
|
0a122b |
2 files changed, 2 insertions(+), 5 deletions(-)
|
|
|
0a122b |
|
|
|
0a122b |
diff --git a/block/vhdx.c b/block/vhdx.c
|
|
|
0a122b |
index baf8970..97099aa 100644
|
|
|
0a122b |
--- a/block/vhdx.c
|
|
|
0a122b |
+++ b/block/vhdx.c
|
|
|
0a122b |
@@ -985,7 +985,7 @@ static void vhdx_block_translate(BDRVVHDXState *s, int64_t sector_num,
|
|
|
0a122b |
|
|
|
0a122b |
sinfo->bytes_avail = sinfo->sectors_avail << s->logical_sector_size_bits;
|
|
|
0a122b |
|
|
|
0a122b |
- sinfo->file_offset = s->bat[sinfo->bat_idx] >> VHDX_BAT_FILE_OFF_BITS;
|
|
|
0a122b |
+ sinfo->file_offset = s->bat[sinfo->bat_idx] & VHDX_BAT_FILE_OFF_MASK;
|
|
|
0a122b |
|
|
|
0a122b |
sinfo->block_offset = block_offset << s->logical_sector_size_bits;
|
|
|
0a122b |
|
|
|
0a122b |
@@ -999,7 +999,6 @@ static void vhdx_block_translate(BDRVVHDXState *s, int64_t sector_num,
|
|
|
0a122b |
* in the block, and add in the payload data block offset
|
|
|
0a122b |
* in the file, in bytes, to get the final read address */
|
|
|
0a122b |
|
|
|
0a122b |
- sinfo->file_offset <<= 20; /* now in bytes, rather than 1MB units */
|
|
|
0a122b |
sinfo->file_offset += sinfo->block_offset;
|
|
|
0a122b |
}
|
|
|
0a122b |
|
|
|
0a122b |
@@ -1110,8 +1109,7 @@ static void vhdx_update_bat_table_entry(BlockDriverState *bs, BDRVVHDXState *s,
|
|
|
0a122b |
{
|
|
|
0a122b |
/* The BAT entry is a uint64, with 44 bits for the file offset in units of
|
|
|
0a122b |
* 1MB, and 3 bits for the block state. */
|
|
|
0a122b |
- s->bat[sinfo->bat_idx] = ((sinfo->file_offset>>20) <<
|
|
|
0a122b |
- VHDX_BAT_FILE_OFF_BITS);
|
|
|
0a122b |
+ s->bat[sinfo->bat_idx] = sinfo->file_offset;
|
|
|
0a122b |
|
|
|
0a122b |
s->bat[sinfo->bat_idx] |= state & VHDX_BAT_STATE_BIT_MASK;
|
|
|
0a122b |
|
|
|
0a122b |
diff --git a/block/vhdx.h b/block/vhdx.h
|
|
|
0a122b |
index a85c5c8..7deb7fd 100644
|
|
|
0a122b |
--- a/block/vhdx.h
|
|
|
0a122b |
+++ b/block/vhdx.h
|
|
|
0a122b |
@@ -229,7 +229,6 @@ typedef struct QEMU_PACKED VHDXLogDataSector {
|
|
|
0a122b |
/* upper 44 bits are the file offset in 1MB units lower 3 bits are the state
|
|
|
0a122b |
other bits are reserved */
|
|
|
0a122b |
#define VHDX_BAT_STATE_BIT_MASK 0x07
|
|
|
0a122b |
-#define VHDX_BAT_FILE_OFF_BITS (64 - 44)
|
|
|
0a122b |
#define VHDX_BAT_FILE_OFF_MASK 0xFFFFFFFFFFF00000 /* upper 44 bits */
|
|
|
0a122b |
typedef uint64_t VHDXBatEntry;
|
|
|
0a122b |
|
|
|
0a122b |
--
|
|
|
0a122b |
1.7.1
|
|
|
0a122b |
|