[libvirt] [PATCH v2 3/7] conf: Introduce virDomainDiskSourceIsBlockType

John Ferlan jferlan at redhat.com
Thu Jul 18 17:28:29 UTC 2013


On 07/18/2013 11:02 AM, John Ferlan wrote:
> Introduce a new helper to check if the disk source is of block type
> ---
>  src/conf/domain_conf.c   | 41 +++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h   |  3 +++
>  src/libvirt_private.syms |  1 +
>  src/qemu/qemu_command.c  |  5 ++---
>  src/qemu/qemu_conf.c     | 23 +++++------------------
>  5 files changed, 52 insertions(+), 21 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 06b44b1..4f24ecf 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -41,6 +41,7 @@
>  #include "virbuffer.h"
>  #include "virlog.h"
>  #include "nwfilter_conf.h"
> +#include "storage_conf.h"
>  #include "virstoragefile.h"
>  #include "virfile.h"
>  #include "virbitmap.h"
> @@ -18334,3 +18335,43 @@ virDomainDiskDefGenSecurityLabelDef(const char *model)
>  
>      return seclabel;
>  }
> +
> +/**
> + * virDomainDiskSourceIsBlockType:
> + *
> + * Check if the disk *source* is of block type. This just tries
> + * to check from the type of disk def, not to probe the underlying
> + * storage.
> + *
> + * Return true if its source is block type, or false otherwise.
> + */
> +bool
> +virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def)
> +{
> +    /* No reason to think the disk source is block type if
> +     * the source is empty
> +     */
> +    if (!def->src)
> +        return false;
> +
> +    if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK)
> +        return true;
> +
> +    /* For volume types, check the srcpool.
> +     * If it's a block type source pool, then it's possible
> +     */
> +    if (def->type == VIR_DOMAIN_DISK_TYPE_VOLUME && def->srcpool &&
> +        def->srcpool->voltype == VIR_STORAGE_VOL_BLOCK) {
> +        /* We don't think the volume accessed by remote URI is
> +         * block type source, since we can't/shouldn't manage it
> +         * (e.g. set sgio=filtered|unfiltered for it) in libvirt.
> +         */
> +         if (def->srcpool->pooltype == VIR_STORAGE_POOL_ISCSI &&
> +             def->srcpool->mode == VIR_DOMAIN_DISK_SOURCE_POOL_MODE_URI)
> +             return false;

UG... I messed up the split the above 7 lines have to go in the next
patch...

I also found out that I forgot to update my branch before sending and I
have a couple of merges to handle...

John
> +
> +        return true;
> +    }
> +
> +    return false;
> +}
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index c21d1e2..05400ce 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2710,4 +2710,7 @@ virDomainDefMaybeAddController(virDomainDefPtr def,
>  
>  char *virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps);
>  
> +bool virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def)
> +    ATTRIBUTE_NONNULL(1);
> +
>  #endif /* __DOMAIN_CONF_H */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index fc4e750..047d2db 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -204,6 +204,7 @@ virDomainDiskProtocolTransportTypeToString;
>  virDomainDiskProtocolTypeToString;
>  virDomainDiskRemove;
>  virDomainDiskRemoveByName;
> +virDomainDiskSourceIsBlockType;
>  virDomainDiskTypeFromString;
>  virDomainDiskTypeToString;
>  virDomainEmulatorPinAdd;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 71e37f3..591279b 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -42,6 +42,7 @@
>  #include "domain_audit.h"
>  #include "domain_conf.h"
>  #include "snapshot_conf.h"
> +#include "storage_conf.h"
>  #include "network/bridge_driver.h"
>  #include "virnetdevtap.h"
>  #include "base64.h"
> @@ -3490,9 +3491,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
>                                 virDomainDiskProtocolTypeToString(disk->protocol));
>                  goto error;
>              }
> -        } else if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
> -                   !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
> -                     disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)) {
> +        } else if (!virDomainDiskSourceIsBlockType(disk)) {
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                             _("disk device='lun' is only valid for block type disk source"));
>              goto error;
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index c91551f..4fa0055 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -52,6 +52,7 @@
>  #include "virfile.h"
>  #include "virstring.h"
>  #include "viratomic.h"
> +#include "storage_conf.h"
>  #include "configmake.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_QEMU
> @@ -1160,12 +1161,7 @@ qemuAddSharedDevice(virQEMUDriverPtr driver,
>      if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
>          disk = dev->data.disk;
>  
> -        if (!disk->shared ||
> -            !disk->src ||
> -            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
> -             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
> -               disk->srcpool &&
> -               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
> +        if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
>              return 0;
>      } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
>          hostdev = dev->data.hostdev;
> @@ -1271,12 +1267,7 @@ qemuRemoveSharedDevice(virQEMUDriverPtr driver,
>      if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
>          disk = dev->data.disk;
>  
> -        if (!disk->shared ||
> -            !disk->src ||
> -            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
> -             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
> -               disk->srcpool &&
> -               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
> +        if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
>              return 0;
>      } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
>          hostdev = dev->data.hostdev;
> @@ -1366,12 +1357,8 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
>      if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
>          disk = dev->data.disk;
>  
> -        if (!disk->src ||
> -            disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
> -            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
> -             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
> -               disk->srcpool &&
> -               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
> +        if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
> +            virDomainDiskSourceIsBlockType(disk))
>              return 0;
>  
>          path = disk->src;
> 




More information about the libvir-list mailing list