mirror of https://gitee.com/openkylin/libvirt.git
conf: validate: Move qemu-specific LUN disk validation to global validation
LUN disks are supported only by VMX and QEMU drivers and the VMX implementation is a subset of qemu's implementation, thus we can move the qemu-specific validator to the global validation code providing that we allow the format to be 'none' (qemu driver always sets 'raw' if it's not set) and allow disk type 'volume' as a source (qemu always translates the source, and VMX doesn't implement 'volume' at all). Moving the code to the global validation allows us to stop calling it from the qemu specific validation and also deduplicates the checks. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
5ccb39616f
commit
7dee442677
|
@ -540,6 +540,57 @@ virDomainDiskDefValidateSource(const virStorageSource *src)
|
|||
#define VENDOR_LEN 8
|
||||
#define PRODUCT_LEN 16
|
||||
|
||||
|
||||
/**
|
||||
* virDomainDiskDefSourceLUNValidate:
|
||||
* @src: disk source struct
|
||||
*
|
||||
* Validate whether the disk source is valid for disk device='lun'.
|
||||
*
|
||||
* Returns 0 if the configuration is valid -1 and a libvirt error if the source
|
||||
* is invalid.
|
||||
*/
|
||||
int
|
||||
virDomainDiskDefSourceLUNValidate(const virStorageSource *src)
|
||||
{
|
||||
if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_NETWORK) {
|
||||
if (src->protocol != VIR_STORAGE_NET_PROTOCOL_ISCSI) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("disk device='lun' is not supported for protocol='%s'"),
|
||||
virStorageNetProtocolTypeToString(src->protocol));
|
||||
return -1;
|
||||
}
|
||||
} else if (!virStorageSourceIsBlockLocal(src) &&
|
||||
src->type != VIR_STORAGE_TYPE_VOLUME) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device='lun' is only valid for block type disk source"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->format != VIR_STORAGE_FILE_RAW &&
|
||||
src->format != VIR_STORAGE_FILE_NONE) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' must use 'raw' format"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->sliceStorage) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' doesn't support storage slice"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->encryption &&
|
||||
src->encryption->format != VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' doesn't support encryption"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainDiskDefValidate(const virDomainDef *def,
|
||||
const virDomainDiskDef *disk)
|
||||
|
@ -551,16 +602,8 @@ virDomainDiskDefValidate(const virDomainDef *def,
|
|||
|
||||
/* Validate LUN configuration */
|
||||
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
|
||||
/* volumes haven't been translated at this point, so accept them */
|
||||
if (!(disk->src->type == VIR_STORAGE_TYPE_BLOCK ||
|
||||
disk->src->type == VIR_STORAGE_TYPE_VOLUME ||
|
||||
(disk->src->type == VIR_STORAGE_TYPE_NETWORK &&
|
||||
disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI))) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("disk '%s' improperly configured for a "
|
||||
"device='lun'"), disk->dst);
|
||||
if (virDomainDiskDefSourceLUNValidate(disk->src) < 0)
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (disk->src->pr) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
|
|
|
@ -40,3 +40,5 @@ int virDomainDeviceDefValidate(const virDomainDeviceDef *dev,
|
|||
void *parseOpaque);
|
||||
|
||||
int virDomainDiskDefValidateSource(const virStorageSource *src);
|
||||
|
||||
int virDomainDiskDefSourceLUNValidate(const virStorageSource *src);
|
||||
|
|
|
@ -767,6 +767,7 @@ virDomainConfVMNWFilterTeardown;
|
|||
virDomainActualNetDefValidate;
|
||||
virDomainDefValidate;
|
||||
virDomainDeviceValidateAliasForHotplug;
|
||||
virDomainDiskDefSourceLUNValidate;
|
||||
|
||||
|
||||
# conf/interface_conf.h
|
||||
|
|
|
@ -9825,54 +9825,6 @@ qemuDomainDiskByName(virDomainDef *def,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuDomainDefValidateDiskLunSource:
|
||||
* @src: disk source struct
|
||||
*
|
||||
* Validate whether the disk source is valid for disk device='lun'.
|
||||
*
|
||||
* Returns 0 if the configuration is valid -1 and a libvirt error if the source
|
||||
* is invalid.
|
||||
*/
|
||||
int
|
||||
qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
|
||||
{
|
||||
if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_NETWORK) {
|
||||
if (src->protocol != VIR_STORAGE_NET_PROTOCOL_ISCSI) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("disk device='lun' is not supported for protocol='%s'"),
|
||||
virStorageNetProtocolTypeToString(src->protocol));
|
||||
return -1;
|
||||
}
|
||||
} else if (!virStorageSourceIsBlockLocal(src)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device='lun' is only valid for block type disk source"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->format != VIR_STORAGE_FILE_RAW) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' must use 'raw' format"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->sliceStorage) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' doesn't support storage slice"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->encryption &&
|
||||
src->encryption->format != VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("disk device 'lun' doesn't support encryption"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuDomainPrepareChannel(virDomainChrDef *channel,
|
||||
const char *domainChannelTargetDir)
|
||||
|
|
|
@ -893,9 +893,6 @@ int qemuDomainSecretPrepare(virQEMUDriver *driver,
|
|||
virDomainObj *vm)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
||||
|
||||
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
|
||||
int qemuDomainDeviceDefValidateDisk(const virDomainDiskDef *disk,
|
||||
virQEMUCaps *qemuCaps);
|
||||
|
||||
|
|
|
@ -14856,7 +14856,7 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
|
|||
goto endjob;
|
||||
|
||||
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN &&
|
||||
qemuDomainDefValidateDiskLunSource(mirror) < 0)
|
||||
virDomainDiskDefSourceLUNValidate(mirror) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (!(flags & VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB) &&
|
||||
|
|
|
@ -2663,9 +2663,6 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (qemuDomainDefValidateDiskLunSource(disk->src) < 0)
|
||||
return -1;
|
||||
|
||||
if (disk->wwn) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("Setting wwn is not supported for lun device"));
|
||||
|
|
Loading…
Reference in New Issue