qcow2: Update get/set_l2_entry() and add get/set_l2_bitmap()
Extended L2 entries are 128-bit wide: 64 bits for the entry itself and 64 bits for the subcluster allocation bitmap. In order to support them correctly get/set_l2_entry() need to be updated so they take the entry width into account in order to calculate the correct offset. This patch also adds the get/set_l2_bitmap() functions that are used to access the bitmaps. For convenience we allow calling get_l2_bitmap() on images without subclusters. In this case the returned value is always 0 and has no meaning. Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <6ee0f81ae3329c991de125618b3675e1e46acdbb.1594396418.git.berto@igalia.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
c8fd8554d9
commit
39a9f0a50e
@ -533,15 +533,36 @@ static inline size_t l2_entry_size(BDRVQcow2State *s)
|
||||
static inline uint64_t get_l2_entry(BDRVQcow2State *s, uint64_t *l2_slice,
|
||||
int idx)
|
||||
{
|
||||
idx *= l2_entry_size(s) / sizeof(uint64_t);
|
||||
return be64_to_cpu(l2_slice[idx]);
|
||||
}
|
||||
|
||||
static inline uint64_t get_l2_bitmap(BDRVQcow2State *s, uint64_t *l2_slice,
|
||||
int idx)
|
||||
{
|
||||
if (has_subclusters(s)) {
|
||||
idx *= l2_entry_size(s) / sizeof(uint64_t);
|
||||
return be64_to_cpu(l2_slice[idx + 1]);
|
||||
} else {
|
||||
return 0; /* For convenience only; this value has no meaning. */
|
||||
}
|
||||
}
|
||||
|
||||
static inline void set_l2_entry(BDRVQcow2State *s, uint64_t *l2_slice,
|
||||
int idx, uint64_t entry)
|
||||
{
|
||||
idx *= l2_entry_size(s) / sizeof(uint64_t);
|
||||
l2_slice[idx] = cpu_to_be64(entry);
|
||||
}
|
||||
|
||||
static inline void set_l2_bitmap(BDRVQcow2State *s, uint64_t *l2_slice,
|
||||
int idx, uint64_t bitmap)
|
||||
{
|
||||
assert(has_subclusters(s));
|
||||
idx *= l2_entry_size(s) / sizeof(uint64_t);
|
||||
l2_slice[idx + 1] = cpu_to_be64(bitmap);
|
||||
}
|
||||
|
||||
static inline bool has_data_file(BlockDriverState *bs)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
|
Loading…
Reference in New Issue
Block a user