diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2c3b96b0e5..ad641ed67b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3893,6 +3893,28 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev, return -1; } } + + /* Validate LUN configuration + * NOTE: virStorageTranslateDiskSourcePool is not run yet, so for + * disk "volume"'s, the closest we can get at config time is + * to ensure mode isn't direct since host/default will allow + * lun/block usage. At run time if it's determined the wrong + * voltype and pooltype values are set, then failure occurs + */ + if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN && + !(disk->src->type == VIR_STORAGE_TYPE_BLOCK || + (disk->src->type == VIR_STORAGE_TYPE_NETWORK && + disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI) || + (disk->src->type == VIR_STORAGE_TYPE_VOLUME && + disk->src->srcpool && + disk->src->srcpool->mode != + VIR_STORAGE_SOURCE_POOL_MODE_DIRECT))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("disk '%s' improperly configured for a " + "device='lun'"), + disk->dst); + return -1; + } } if (dev->type == VIR_DOMAIN_DEVICE_VIDEO) { diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4154601d82..f85f63b333 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -818,7 +818,7 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT); DO_TEST("disk-drive-no-boot", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_BOOTINDEX); - DO_TEST_FAILURE("disk-device-lun-type-invalid", + DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_SCSI); DO_TEST("disk-usb", NONE); DO_TEST("disk-usb-device",