Fix assert(region_marker) at the end of the block in find_block_run()
This commit is contained in:
@@ -244,7 +244,7 @@ void blockstore_heap_t::read_blocks(uint64_t disk_offset, uint64_t disk_size, ui
|
|||||||
assert(block_num < block_info.size());
|
assert(block_num < block_info.size());
|
||||||
uint32_t block_offset = 0;
|
uint32_t block_offset = 0;
|
||||||
std::map<uint32_t, verify_offset_t> offsets_seen;
|
std::map<uint32_t, verify_offset_t> offsets_seen;
|
||||||
while (block_offset < dsk->meta_block_size - 2)
|
while (block_offset <= dsk->meta_block_size-2)
|
||||||
{
|
{
|
||||||
heap_write_t *skip_erase_wr = NULL, *skip_erase_to = NULL;
|
heap_write_t *skip_erase_wr = NULL, *skip_erase_to = NULL;
|
||||||
uint8_t *data = buf + buf_offset + block_offset;
|
uint8_t *data = buf + buf_offset + block_offset;
|
||||||
@@ -553,6 +553,8 @@ uint64_t blockstore_heap_t::load_blocks(uint64_t disk_offset, uint64_t size, uin
|
|||||||
copy = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk->meta_block_size);
|
copy = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk->meta_block_size);
|
||||||
memcpy(copy, buf, last_offset);
|
memcpy(copy, buf, last_offset);
|
||||||
memset(copy+last_offset, 0, dsk->meta_block_size-last_offset);
|
memset(copy+last_offset, 0, dsk->meta_block_size-last_offset);
|
||||||
|
if (last_offset <= dsk->meta_block_size-2)
|
||||||
|
*(uint16_t*)(copy+last_offset) = FREE_SPACE_BIT | (dsk->meta_block_size-last_offset);
|
||||||
}
|
}
|
||||||
block_info[block_num] = {
|
block_info[block_num] = {
|
||||||
.used_space = 0,
|
.used_space = 0,
|
||||||
@@ -1109,7 +1111,7 @@ void blockstore_heap_t::defragment_block(uint32_t block_num)
|
|||||||
const uint8_t *new_end = new_data+dsk->meta_block_size;
|
const uint8_t *new_end = new_data+dsk->meta_block_size;
|
||||||
uint8_t *old = inf.data;
|
uint8_t *old = inf.data;
|
||||||
uint8_t *cur = new_data;
|
uint8_t *cur = new_data;
|
||||||
while (old < end)
|
while (old <= end-2)
|
||||||
{
|
{
|
||||||
uint16_t region_marker = *((uint16_t*)old);
|
uint16_t region_marker = *((uint16_t*)old);
|
||||||
if (region_marker & FREE_SPACE_BIT)
|
if (region_marker & FREE_SPACE_BIT)
|
||||||
@@ -1185,7 +1187,7 @@ uint32_t blockstore_heap_t::find_block_run(heap_block_info_t & inf, uint32_t spa
|
|||||||
uint8_t *data = inf.data + inf.free_pos;
|
uint8_t *data = inf.data + inf.free_pos;
|
||||||
uint8_t *end = inf.data + dsk->meta_block_size;
|
uint8_t *end = inf.data + dsk->meta_block_size;
|
||||||
uint8_t *last_free = NULL;
|
uint8_t *last_free = NULL;
|
||||||
while (data < end)
|
while (data <= end-2)
|
||||||
{
|
{
|
||||||
uint16_t region_marker = *((uint16_t*)data);
|
uint16_t region_marker = *((uint16_t*)data);
|
||||||
assert(region_marker);
|
assert(region_marker);
|
||||||
@@ -1200,8 +1202,10 @@ uint32_t blockstore_heap_t::find_block_run(heap_block_info_t & inf, uint32_t spa
|
|||||||
// Merge free regions
|
// Merge free regions
|
||||||
*((uint16_t*)last_free) += (region_marker & ~FREE_SPACE_BIT);
|
*((uint16_t*)last_free) += (region_marker & ~FREE_SPACE_BIT);
|
||||||
*((uint16_t*)data) = 0;
|
*((uint16_t*)data) = 0;
|
||||||
|
inf.free_pos = last_free-inf.data;
|
||||||
}
|
}
|
||||||
uint16_t region_size = *((uint16_t*)last_free) & ~FREE_SPACE_BIT;
|
uint16_t region_size = *((uint16_t*)last_free) & ~FREE_SPACE_BIT;
|
||||||
|
assert(last_free-inf.data+region_size <= dsk->meta_block_size);
|
||||||
if (region_size == space)
|
if (region_size == space)
|
||||||
{
|
{
|
||||||
inf.free_pos = last_free-inf.data+space;
|
inf.free_pos = last_free-inf.data+space;
|
||||||
|
|||||||
Reference in New Issue
Block a user