[libvirt] rebased multipath patch

Daniel P. Berrange berrange at redhat.com
Thu Sep 3 17:03:00 UTC 2009


On Wed, Sep 02, 2009 at 11:28:27AM -0400, Dave Allan wrote:
> @@ -1177,6 +1180,26 @@ if test "$with_storage_scsi" = "check"; then
>  fi
>  AM_CONDITIONAL([WITH_STORAGE_SCSI], [test "$with_storage_scsi" = "yes"])
>  
> +if test "$with_storage_mpath" = "check"; then
> +   with_storage_mpath=yes
> +
> +   AC_DEFINE_UNQUOTED([WITH_STORAGE_MPATH], 1,
> +     [whether mpath backend for storage driver is enabled])
> +fi
> +AM_CONDITIONAL([WITH_STORAGE_MPATH], [test "$with_storage_mpath" = "yes"])
> +
> +if test "$with_storage_mpath" = "yes"; then
> +   DEVMAPPER_REQUIRED=0.0
> +   DEVMAPPER_CFLAGS=
> +   DEVMAPPER_LIBS=
> +   PKG_CHECK_MODULES(DEVMAPPER, devmapper >= $DEVMAPPER_REQUIRED,
> +    [], [
> +    AC_MSG_ERROR(
> +    [You must install device-mapper-devel >= $DEVMAPPER_REQUIRED to compile libvirt])
> +    ])
> +fi
> +AC_SUBST([DEVMAPPER_CFLAGS])
> +AC_SUBST([DEVMAPPER_LIBS])


Need to update livbvirt.spec.in with a dependancy on device mapper for this
tool, both Requires & BuildRequries

> diff --git a/src/Makefile.am b/src/Makefile.am
> index bedeb84..cf3420b 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -199,6 +199,9 @@ STORAGE_DRIVER_ISCSI_SOURCES =					\
>  STORAGE_DRIVER_SCSI_SOURCES =					\
>  		storage_backend_scsi.h storage_backend_scsi.c
>  
> +STORAGE_DRIVER_MPATH_SOURCES =					\
> +		storage_backend_mpath.h storage_backend_mpath.c
> +
>  STORAGE_DRIVER_DISK_SOURCES =					\
>  		storage_backend_disk.h storage_backend_disk.c
>  
> @@ -478,6 +481,10 @@ if WITH_STORAGE_SCSI
>  libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_SCSI_SOURCES)
>  endif
>  
> +if WITH_STORAGE_MPATH
> +libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_MPATH_SOURCES)
> +endif
> +
>  if WITH_STORAGE_DISK
>  libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_DISK_SOURCES)
>  endif
> @@ -539,6 +546,7 @@ EXTRA_DIST +=							\
>  		$(STORAGE_DRIVER_LVM_SOURCES)			\
>  		$(STORAGE_DRIVER_ISCSI_SOURCES)			\
>  		$(STORAGE_DRIVER_SCSI_SOURCES)			\
> +		$(STORAGE_DRIVER_MPATH_SOURCES)			\
>  		$(STORAGE_DRIVER_DISK_SOURCES)			\
>  		$(NODE_DEVICE_DRIVER_SOURCES)			\
>  		$(NODE_DEVICE_DRIVER_HAL_SOURCES)		\
> @@ -607,6 +615,7 @@ libvirt_la_LDFLAGS = $(VERSION_SCRIPT_FLAGS)libvirt.syms \
>                      $(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
>                      $(LIBXML_LIBS) $(SELINUX_LIBS) \
>  		    $(XEN_LIBS) $(DRIVER_MODULE_LIBS) \
> +		    $(DEVMAPPER_LIBS) \
>  		    @CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
>  libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) -DIN_LIBVIRT
>  libvirt_la_DEPENDENCIES = $(libvirt_la_LIBADD) libvirt.syms


I think you probably need a $(DEVMAPPER_CFLAGS) somewhere in here too,
even if it happens to be empty for default Fedora installs.

> +static int
> +virStorageBackendMpathUpdateVolTargetInfo(virConnectPtr conn,
> +                                          virStorageVolTargetPtr target,
> +                                          unsigned long long *allocation,
> +                                          unsigned long long *capacity)
> +{
> +    int ret = 0;
> +    int fd = -1;
> +
> +    if ((fd = open(target->path, O_RDONLY)) < 0) {
> +        virReportSystemError(conn, errno,
> +                             _("cannot open volume '%s'"),
> +                             target->path);
> +        ret = -1;
> +        goto out;
> +    }
> +
> +    if (virStorageBackendUpdateVolTargetInfoFD(conn,
> +                                               target,
> +                                               fd,
> +                                               allocation,
> +                                               capacity) < 0) {
> +
> +        VIR_ERROR(_("Failed to update volume target info for %s"),
> +            target->path);
> +
> +        ret = -1;
> +        goto out;
> +    }
> +
> +    if (virStorageBackendUpdateVolTargetFormatFD(conn,
> +                                                 target,
> +                                                 fd) < 0) {
> +        VIR_ERROR(_("Failed to update volume target format for %s"),
> +            target->path);
> +
> +        ret = -1;
> +        goto out;
> +    }

These two VIR_EROR calls should be virRaiseError() or similar
if we're going to return a fail status.

> +static int
> +virStorageBackendMpathNewVol(virConnectPtr conn,
> +                             virStoragePoolObjPtr pool,
> +                             const int devnum,
> +                             const char *dev)
> +{
> +    virStorageVolDefPtr vol;
> +    int retval = 0;
> +
> +    if (VIR_ALLOC(vol) < 0) {
> +        virReportOOMError(conn);
> +        retval = -1;
> +        goto out;
> +    }
> +
> +    vol->type = VIR_STORAGE_VOL_BLOCK;
> +
> +    if (virAsprintf(&(vol->name), "dm-%u", devnum) < 0) {
> +        virReportOOMError(conn);
> +        retval = -1;
> +        goto free_vol;
> +    }
> +
> +    if (virAsprintf(&vol->target.path, "/dev/%s", dev) < 0) {
> +        virReportOOMError(conn);
> +        retval = -1;
> +        goto free_vol;
> +    }
> +
> +    if (virStorageBackendMpathUpdateVolTargetInfo(conn,
> +                                                  &vol->target,
> +                                                  &vol->allocation,
> +                                                  &vol->capacity) < 0) {
> +
> +        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                              _("Failed to update volume for '%s'"),
> +                              vol->target.path);
> +        retval = -1;
> +        goto free_vol;
> +    }
> +
> +    /* XXX should use logical unit's UUID instead */
> +    vol->key = strdup(vol->target.path);
> +    if (vol->key == NULL) {
> +        virReportOOMError(conn);
> +        retval = -1;
> +        goto free_vol;
> +    }
> +
> +    pool->def->capacity += vol->capacity;
> +    pool->def->allocation += vol->allocation;
> +
> +    if (VIR_REALLOC_N(pool->volumes.objs,
> +                      pool->volumes.count + 1) < 0) {
> +        virReportOOMError(conn);
> +        retval = -1;
> +        goto free_vol;
> +    }
> +    pool->volumes.objs[pool->volumes.count++] = vol;
> +

If 'retval' is declared as -1 initially, then 

> +    goto out;
> +
> +free_vol:
> +    virStorageVolDefFree(vol);
> +out:
> +    return retval;
> +}

could be simplified with


  ret = 0;

cleanup:
  if (ret != 0)
    virStorageVolDefFree(vol);

  return ret;



Allowing the removal of all the retval = -1 assignments
during the method.

> +    }
> +
> +    if (!(strcmp(target_type, "multipath"))) {

Can use STRNEQ() here


ACK if those minor things are cleaned up


Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list