Revision 5ea3c2b4 hw/xen_disk.c
b/hw/xen_disk.c | ||
---|---|---|
616 | 616 |
{ |
617 | 617 |
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); |
618 | 618 |
int index, qflags, have_barriers, info = 0; |
619 |
char *h; |
|
620 | 619 |
|
621 | 620 |
/* read xenstore entries */ |
622 | 621 |
if (blkdev->params == NULL) { |
622 |
char *h = NULL; |
|
623 | 623 |
blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params"); |
624 |
h = strchr(blkdev->params, ':'); |
|
624 |
if (blkdev->params != NULL) { |
|
625 |
h = strchr(blkdev->params, ':'); |
|
626 |
} |
|
625 | 627 |
if (h != NULL) { |
626 | 628 |
blkdev->fileproto = blkdev->params; |
627 | 629 |
blkdev->filename = h+1; |
... | ... | |
649 | 651 |
blkdev->mode == NULL || |
650 | 652 |
blkdev->type == NULL || |
651 | 653 |
blkdev->dev == NULL) { |
652 |
return -1;
|
|
654 |
goto out_error;
|
|
653 | 655 |
} |
654 | 656 |
|
655 | 657 |
/* read-only ? */ |
... | ... | |
672 | 674 |
/* setup via xenbus -> create new block driver instance */ |
673 | 675 |
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n"); |
674 | 676 |
blkdev->bs = bdrv_new(blkdev->dev); |
675 |
if (bdrv_open(blkdev->bs, blkdev->filename, qflags, |
|
676 |
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) { |
|
677 |
bdrv_delete(blkdev->bs); |
|
678 |
return -1; |
|
677 |
if (blkdev->bs) { |
|
678 |
if (bdrv_open(blkdev->bs, blkdev->filename, qflags, |
|
679 |
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) { |
|
680 |
bdrv_delete(blkdev->bs); |
|
681 |
blkdev->bs = NULL; |
|
682 |
} |
|
683 |
} |
|
684 |
if (!blkdev->bs) { |
|
685 |
goto out_error; |
|
679 | 686 |
} |
680 | 687 |
} else { |
681 | 688 |
/* setup via qemu cmdline -> already setup for us */ |
... | ... | |
704 | 711 |
xenstore_write_be_int(&blkdev->xendev, "sectors", |
705 | 712 |
blkdev->file_size / blkdev->file_blk); |
706 | 713 |
return 0; |
714 |
|
|
715 |
out_error: |
|
716 |
qemu_free(blkdev->params); |
|
717 |
blkdev->params = NULL; |
|
718 |
qemu_free(blkdev->mode); |
|
719 |
blkdev->mode = NULL; |
|
720 |
qemu_free(blkdev->type); |
|
721 |
blkdev->type = NULL; |
|
722 |
qemu_free(blkdev->dev); |
|
723 |
blkdev->dev = NULL; |
|
724 |
qemu_free(blkdev->devtype); |
|
725 |
blkdev->devtype = NULL; |
|
726 |
return -1; |
|
707 | 727 |
} |
708 | 728 |
|
709 | 729 |
static int blk_connect(struct XenDevice *xendev) |
Also available in: Unified diff