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:
Liu Yuan 2014-01-03 20:13:12 +08:00 committed by Kevin Wolf
parent cf7f616b9d
commit 9f23fce7b2

View File

@ -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,
}; };