diff options
author | Jeff Cody <jcody@redhat.com> | 2013-10-30 10:44:46 -0400 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2013-11-07 13:58:59 +0100 |
commit | 1a848fd4517820981b542e0d10e64c0426414229 (patch) | |
tree | 32830646f081e47e520dcbc1f6a9764bf6c5b8ae /block/vhdx.h | |
parent | 0a43a1b5d7c33208120eeb2d98ebb9ab15dc2c87 (diff) |
block: vhdx - add region overlap detection for image files
Regions in the image file cannot overlap - the log, region tables,
and metdata must all be unique and non-overlapping.
This adds region checking by means of a QLIST; there can be a variable
number of regions and metadata (there may be metadata or region tables
that we do not recognize / know about, but are not required).
This adds the capability to register a region for later checking, and
to check against registered regions for any overlap.
Also, if neither the BAT or Metadata region tables are found, return
error.
Signed-off-by: Jeff Cody <jcody@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'block/vhdx.h')
-rw-r--r-- | block/vhdx.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/block/vhdx.h b/block/vhdx.h index 584ebec8fc..d9065595fc 100644 --- a/block/vhdx.h +++ b/block/vhdx.h @@ -230,6 +230,7 @@ typedef struct QEMU_PACKED VHDXLogDataSector { other bits are reserved */ #define VHDX_BAT_STATE_BIT_MASK 0x07 #define VHDX_BAT_FILE_OFF_BITS (64 - 44) +#define VHDX_BAT_FILE_OFF_MASK 0xFFFFFFFFFFF00000 /* upper 44 bits */ typedef uint64_t VHDXBatEntry; /* ---- METADATA REGION STRUCTURES ---- */ @@ -334,6 +335,12 @@ typedef struct VHDXLogEntries { uint32_t tail; } VHDXLogEntries; +typedef struct VHDXRegionEntry { + uint64_t start; + uint64_t end; + QLIST_ENTRY(VHDXRegionEntry) entries; +} VHDXRegionEntry; + typedef struct BDRVVHDXState { CoMutex lock; @@ -374,6 +381,8 @@ typedef struct BDRVVHDXState { VHDXParentLocatorEntry *parent_entries; Error *migration_blocker; + + QLIST_HEAD(VHDXRegionHead, VHDXRegionEntry) regions; } BDRVVHDXState; void vhdx_guid_generate(MSGUID *guid); |