mirror of https://github.com/xemu-project/xemu.git
qed: support for growing images
The .bdrv_truncate() operation resizes images and growing is easy to implement in QED. Simply check that the new size is valid and then update the image_size header field to reflect the new size. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
f6a00aa150
commit
77a5a0001b
20
block/qed.c
20
block/qed.c
|
@ -1333,7 +1333,27 @@ static BlockDriverAIOCB *bdrv_qed_aio_flush(BlockDriverState *bs,
|
||||||
|
|
||||||
static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset)
|
static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset)
|
||||||
{
|
{
|
||||||
|
BDRVQEDState *s = bs->opaque;
|
||||||
|
uint64_t old_image_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!qed_is_image_size_valid(offset, s->header.cluster_size,
|
||||||
|
s->header.table_size)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shrinking is currently not supported */
|
||||||
|
if ((uint64_t)offset < s->header.image_size) {
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
old_image_size = s->header.image_size;
|
||||||
|
s->header.image_size = offset;
|
||||||
|
ret = qed_write_header_sync(s);
|
||||||
|
if (ret < 0) {
|
||||||
|
s->header.image_size = old_image_size;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t bdrv_qed_getlength(BlockDriverState *bs)
|
static int64_t bdrv_qed_getlength(BlockDriverState *bs)
|
||||||
|
|
Loading…
Reference in New Issue