fix: write correctly prev and next block on deletion
This commit is contained in:
@ -43,21 +43,35 @@ int chunk_split(chunk_t *chunk, chunk_t *new_chunk, size_t new_size)
|
||||
|
||||
void destroy_chunk(chunk_t *chunk)
|
||||
{
|
||||
chunk_t chunk_next_to;
|
||||
chunk_t chunk_prev, chunk_next, *first_chunk = chunk, *last_chunk = chunk;
|
||||
|
||||
if (chunk->prev != NULL)
|
||||
{
|
||||
chunk_read(chunk->prev, &chunk_next_to);
|
||||
if (chunk_next_to.block_id == chunk->block_id && chunk_next_to.is_used == false)
|
||||
chunk_merge(&chunk_next_to, chunk);
|
||||
*chunk = chunk_next_to;
|
||||
chunk_read(chunk->prev, &chunk_prev);
|
||||
if (chunk_prev.block_id == chunk->block_id && chunk_prev.is_used == false)
|
||||
chunk_merge(&chunk_prev, chunk);
|
||||
first_chunk = &chunk_prev;
|
||||
}
|
||||
if (chunk->next != NULL)
|
||||
{
|
||||
chunk_read(chunk->next, &chunk_next_to);
|
||||
if (chunk_next_to.block_id == chunk->block_id && chunk_next_to.is_used == false)
|
||||
chunk_merge(chunk, &chunk_next_to);
|
||||
chunk_read(chunk->next, &chunk_next);
|
||||
if (chunk_next.block_id == chunk->block_id && chunk_next.is_used == false)
|
||||
chunk_merge(chunk, &chunk_next);
|
||||
last_chunk = &chunk_next;
|
||||
}
|
||||
|
||||
if (last_chunk != chunk)
|
||||
{
|
||||
last_chunk->prev = chunk->prev;
|
||||
chunk_write(last_chunk);
|
||||
}
|
||||
|
||||
chunk->is_used = false;
|
||||
chunk_write(chunk);
|
||||
|
||||
if (first_chunk != chunk)
|
||||
{
|
||||
first_chunk->next = chunk->next;
|
||||
chunk_write(first_chunk);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user