[Libvir] PATCH: Add SCSI HBA backend for storage driver

Daniel Veillard veillard at redhat.com
Tue Mar 25 07:24:48 UTC 2008


On Mon, Mar 24, 2008 at 11:15:47PM +0000, Daniel P. Berrange wrote:
> And this time with the patch included...
[...]
>  PARTED_REQUIRED="1.8.0"
> +HAL_REQUIRED="0.5.0"

  With HAL being in Solaris now, maybe that could even be made non-linux
specific

[...]
> @@ -584,6 +585,8 @@ AC_ARG_WITH(storage-iscsi,
>  [  --with-storage-iscsi        with iSCSI backend for the storage driver (on)],[],[with_storage_iscsi=check])
>  AC_ARG_WITH(storage-disk,
>  [  --with-storage-disk         with GPartd Disk backend for the storage driver (on)],[],[with_storage_disk=check])
> +AC_ARG_WITH(storage-scsi,
> +[  --with-storage-scsi         with HAL SCSI Disk backend for the storage driver (on)],[],[with_storage_scsi=check])
>  
>  if test "$with_storage_fs" = "yes" -o "$with_storage_fs" = "check"; then
>    AC_PATH_PROG(MOUNT, [mount], [], [$PATH:/sbin:/usr/sbin])
> @@ -741,6 +744,30 @@ AC_SUBST(LIBPARTED_CFLAGS)
>  AC_SUBST(LIBPARTED_LIBS)

  maybe a meta option --with-storage giving a default to the group of options
(that now 5 of them) could be helpful for reduced setups.

[...]
> diff -N src/storage_backend_scsi.c
[...]
> +#define LINUX_SYSFS_SCSI_HOST_PREFIX "/sys/class/scsi_host/"
> +#define LINUX_SYSFS_SCSI_HOST_POSTFIX "/device"

  hopefully we can add Solaris equivalent later

> +    if (strlen(absLink) >= buflen) {
> +        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                              "link too long for buffer");
> +        return -1;
> +    }
> +    strcpy(buf, absLink);

  Even if just checked can we still use strncpy(), i assume at some point
we will add an automatic check against strcpy 

[...]
> +virStorageBackendSCSICreateVol(virConnectPtr conn,
> +                               virStoragePoolObjPtr pool,
> +                               const char *name,
> +                               const char *path,
> +                               const char *key,
> +                               unsigned long long size)
> +{
> +    virStorageVolDefPtr vol;
> +    char *tmppath;
> +
> +    if ((vol = calloc(1, sizeof(*vol))) == NULL) {
> +        virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
> +        goto cleanup;
> +    }

    maybe check that size is greater than some absolute minimum like 1 MByte
(and maximum size ?) this could also allow to catch some conversion errors 
or 0 being passed.

> +    tmppath = strdup(path);
[...]
> +    if ((vol->target.path = virStorageBackendStablePath(conn,
> +                                                        pool,
> +                                                        tmppath)) == NULL)
> +        goto cleanup;
> +
> +    if (tmppath != vol->target.path)
> +        free(tmppath);
> +    tmppath = NULL;

  it's a bit funky, you mean virStorageBackendStablePath could just grab the
parameter string or not and that need to be checked later to decide if it needs
freeing ? Even for an internal API it's a bit dangerous IMHO, what if 
it is called with a constant string path, let's avoid the potential problem
get virStorageBackendStablePath to always strdup if it reuses the parameter,
no ?

[...]
> +        goto cleanup;
> +    }
> +
> +#define HAL_GET_PROPERTY(path, name, err, type, value)                  \
> +    (value) = libhal_device_get_property_ ## type(ctx, (path), (name), (err)); \
> +    if (dbus_error_is_set((err))) {                                     \
> +        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,             \
> +                              "unable to lookup '%s' property on %s: %s", \
> +                              (name), (path), derr.message);            \
> +        goto cleanup;                                                   \
> +    }

  i'm not too fond of macros defined in the function code, move it just before
Also for token-pasting I though one needed to glue the # and the identifiers
like foo##bar , i'm surprized foo ## bar actually works

> +    /* These are props of the physical device */
> +    HAL_GET_PROPERTY(devname, "scsi.host", &derr, int, host);
> +    HAL_GET_PROPERTY(devname, "scsi.bus", &derr, int, bus);
> +    HAL_GET_PROPERTY(devname, "scsi.target", &derr, int, target);
> +    HAL_GET_PROPERTY(devname, "scsi.lun", &derr, int, lun);
> +
> +    /* These are props of the logic device */
> +    HAL_GET_PROPERTY(strdevs[0], "block.device", &derr, string, dev);
> +    /*
> +     * XXX storage.serial is not actually unique if they have
> +     * multipath on the fibre channel adapter
> +     */
> +    HAL_GET_PROPERTY(strdevs[0], "storage.serial", &derr, string, key);
> +    HAL_GET_PROPERTY(strdevs[0], "storage.size", &derr, uint64, size);
> +
> +#undef HAL_GET_PROPERTY

Looks good, and will make easier to test the simple storage management 
on developpers machines, +1

  thanks !

Daniel

-- 
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard      | virtualization library  http://libvirt.org/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/




More information about the libvir-list mailing list