[libvirt] rebased multipath patch
Daniel Veillard
veillard at redhat.com
Tue Sep 8 13:50:11 UTC 2009
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 at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list