On Thu, Sep 03, 2009 at 06:03:00PM +0100, Daniel P. Berrange wrote:
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
Okay, I will add this as a separate patch
> 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.
Added in
if WITH_STORAGE_MPATH
libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_MPATH_SOURCES)
libvirt_driver_storage_la_CFLAGS += $(DEVMAPPER_CFLAGS)
endif
> +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.
Done using the proper virStorageReportError()
> +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;
I also moved
pool->def->capacity += vol->capacity;
pool->def->allocation += vol->allocation;
just before exiting to avoid incleasing the capacity in case the
VIR_REALLOC_N(pool->volumes.objs) could fail.
Allowing the removal of all the retval = -1 assignments
during the method.
> + }
> +
> + if (!(strcmp(target_type, "multipath"))) {
Can use STRNEQ() here
I would assume that virStorageBackendIsMultipath() would
return 1 if target_type is actually "multipath", and hence
use
if (STREQ(target_type, "multipath")) {
ret = 1;
}
ret being initialized to 0 at the beginning :-)
ACK if those minor things are cleaned up
I also fixed the Copyrights on the new code
Applied and commited, thanks !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/