Skip to content

Commit

Permalink
parallels: update used bitmap in allocate_cluster
Browse files Browse the repository at this point in the history
We should extend the bitmap if the file is extended and set the bit in
the image used bitmap once the cluster is allocated. Sanity check at
that moment also looks like a good idea.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
  • Loading branch information
Denis V. Lunev committed Sep 20, 2023
1 parent 1915d85 commit e651cde
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions block/parallels.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,8 @@ allocate_clusters(BlockDriverState *bs, int64_t sector_num,
return len;
}
if (s->data_end + space > (len >> BDRV_SECTOR_BITS)) {
uint32_t new_usedsize;

space += s->prealloc_size;
/*
* We require the expanded size to read back as zero. If the
Expand All @@ -305,6 +307,12 @@ allocate_clusters(BlockDriverState *bs, int64_t sector_num,
if (ret < 0) {
return ret;
}

new_usedsize = s->used_bmap_size +
(space << BDRV_SECTOR_BITS) / s->cluster_size;
s->used_bmap = bitmap_zero_extend(s->used_bmap, s->used_bmap_size,
new_usedsize);
s->used_bmap_size = new_usedsize;
}

/*
Expand Down Expand Up @@ -336,6 +344,12 @@ allocate_clusters(BlockDriverState *bs, int64_t sector_num,
}
}

ret = mark_used(bs, s->used_bmap, s->used_bmap_size,
s->data_end << BDRV_SECTOR_BITS, to_allocate);
if (ret < 0) {
/* Image consistency is broken. Alarm! */
return ret;
}
for (i = 0; i < to_allocate; i++) {
parallels_set_bat_entry(s, idx + i, s->data_end / s->off_multiplier);
s->data_end += s->tracks;
Expand Down

0 comments on commit e651cde

Please sign in to comment.