sheepdog: fix clone operation by 'qemu-img create -b'
We should pass base_inode->vdi_id to base_vdi_id of SheepdogVdiReq so that sheep can create a clone instead a fresh volume. This fixes following command: qemu-create -b sheepdog:base sheepdog:clone so users can boot sheepdog:clone as a normal volume. Cc: qemu-devel@nongnu.org Cc: Kevin Wolf <kwolf@redhat.com> Cc: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Liu Yuan <namei.unix@gmail.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
cf7f616b9d
commit
9f23fce7b2
@ -161,7 +161,7 @@ typedef struct SheepdogVdiReq {
|
|||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t data_length;
|
uint32_t data_length;
|
||||||
uint64_t vdi_size;
|
uint64_t vdi_size;
|
||||||
uint32_t vdi_id;
|
uint32_t base_vdi_id;
|
||||||
uint8_t copies;
|
uint8_t copies;
|
||||||
uint8_t copy_policy;
|
uint8_t copy_policy;
|
||||||
uint8_t reserved[2];
|
uint8_t reserved[2];
|
||||||
@ -1493,7 +1493,7 @@ static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot)
|
|||||||
|
|
||||||
memset(&hdr, 0, sizeof(hdr));
|
memset(&hdr, 0, sizeof(hdr));
|
||||||
hdr.opcode = SD_OP_NEW_VDI;
|
hdr.opcode = SD_OP_NEW_VDI;
|
||||||
hdr.vdi_id = s->inode.vdi_id;
|
hdr.base_vdi_id = s->inode.vdi_id;
|
||||||
|
|
||||||
wlen = SD_MAX_VDI_LEN;
|
wlen = SD_MAX_VDI_LEN;
|
||||||
|
|
||||||
@ -1684,7 +1684,7 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
|
|
||||||
if (backing_file) {
|
if (backing_file) {
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BDRVSheepdogState *s;
|
BDRVSheepdogState *base;
|
||||||
BlockDriver *drv;
|
BlockDriver *drv;
|
||||||
|
|
||||||
/* Currently, only Sheepdog backing image is supported. */
|
/* Currently, only Sheepdog backing image is supported. */
|
||||||
@ -1702,15 +1702,15 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
s = bs->opaque;
|
base = bs->opaque;
|
||||||
|
|
||||||
if (!is_snapshot(&s->inode)) {
|
if (!is_snapshot(&base->inode)) {
|
||||||
error_report("cannot clone from a non snapshot vdi");
|
error_report("cannot clone from a non snapshot vdi");
|
||||||
bdrv_unref(bs);
|
bdrv_unref(bs);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
s->inode.vdi_id = base->inode.vdi_id;
|
||||||
bdrv_unref(bs);
|
bdrv_unref(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1743,7 +1743,7 @@ static void sd_close(BlockDriverState *bs)
|
|||||||
memset(&hdr, 0, sizeof(hdr));
|
memset(&hdr, 0, sizeof(hdr));
|
||||||
|
|
||||||
hdr.opcode = SD_OP_RELEASE_VDI;
|
hdr.opcode = SD_OP_RELEASE_VDI;
|
||||||
hdr.vdi_id = s->inode.vdi_id;
|
hdr.base_vdi_id = s->inode.vdi_id;
|
||||||
wlen = strlen(s->name) + 1;
|
wlen = strlen(s->name) + 1;
|
||||||
hdr.data_length = wlen;
|
hdr.data_length = wlen;
|
||||||
hdr.flags = SD_FLAG_CMD_WRITE;
|
hdr.flags = SD_FLAG_CMD_WRITE;
|
||||||
@ -1846,7 +1846,7 @@ static bool sd_delete(BDRVSheepdogState *s)
|
|||||||
unsigned int wlen = SD_MAX_VDI_LEN, rlen = 0;
|
unsigned int wlen = SD_MAX_VDI_LEN, rlen = 0;
|
||||||
SheepdogVdiReq hdr = {
|
SheepdogVdiReq hdr = {
|
||||||
.opcode = SD_OP_DEL_VDI,
|
.opcode = SD_OP_DEL_VDI,
|
||||||
.vdi_id = s->inode.vdi_id,
|
.base_vdi_id = s->inode.vdi_id,
|
||||||
.data_length = wlen,
|
.data_length = wlen,
|
||||||
.flags = SD_FLAG_CMD_WRITE,
|
.flags = SD_FLAG_CMD_WRITE,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user