[libvirt] [PATCH v2] storage: vz storage pool support

Olga Krishtal okrishtal at virtuozzo.com
Tue Dec 6 11:10:48 UTC 2016


On 06/12/16 02:59, John Ferlan wrote:
>
> On 12/02/2016 12:09 PM, Olga Krishtal wrote:
>> On 20/09/16 23:30, John Ferlan wrote:
>>> On 07/14/2016 01:13 PM, Olga Krishtal wrote:
>>>> This patch supports pool and volume management within Virtuozzo Storage.
>>>> Virtuozzo Storage is a highly-available distributed software defined
>>>> storage
>>>> with built-in replication and disaster recovery. From client's point of
>>>> view it looks like network attached storage (NFS or GlusterFS).
>>>> More information about vzstorage can be found here:
>>>> https://openvz.org/Virtuozzo_Storage
>>>> It supports the same volume formats as directory, nfs, etc.
>>>> Default format is raw.
>>>>
>>>> Signed-off-by: Olga Krishtal <okrishtal at virtuozzo.com>
>>>> ---
>>>>    configure.ac                      |  31 +++++++++++
>>>>    docs/schemas/storagepool.rng      |  29 ++++++++++
>>>>    include/libvirt/libvirt-storage.h |   1 +
>>>>    src/conf/storage_conf.c           |  16 +++++-
>>>>    src/conf/storage_conf.h           |   4 +-
>>>>    src/storage/storage_backend.c     |   3 +
>>>>    src/storage/storage_backend_fs.c  | 112
>>>> +++++++++++++++++++++++++++++++++++++-
>>>>    src/storage/storage_backend_fs.h  |   3 +
>>>>    src/storage/storage_driver.c      |   2 +
>>>>    tools/virsh-pool.c                |   2 +
>>>>    tools/virsh.c                     |   3 +
>>>>    11 files changed, 203 insertions(+), 3 deletions(-)
>>>>
>>> In an effort to go through older on list bugs I'm wondering about the
>>> relative importance of this compared to the fspool series.  Shall I
>>> assume this is dropped in favor of that?
>>>
>>> Tks -
>> No, we will not drop it. We want to have Virtuozzo Storage as backend
>> for storage pool.
>>
> To be more specific this code is getting wired in with the 'fs' backend
> rather than creating it's own... Don't like that.
>
> Similar to what I recently reviewed for the Veritas/vxfs changes - there
> needs to be a separate storage_backend_vstorage.c in order to handle the
> vstorage pool. Don't lump it in with the "fs" pool/backend. No different
> than what is required for rbd, gluster, mpath, logical, disk, scsi, etc.

I thought of it first, however, after implementing some part of 
functionality -
I saw that for vstorage backend  I need to implement only 2 callbacks:
virStorageBackendVzStart
virStorageBackendVzfindPoolSources
All volume types and operations are the same as in pool/fs backend,
Basically what we need to use storage is to find it:
vstorage discover - finds all clusters or domain using DNS, zeroconf, etc
Than,  we need to mount this cluster (I assume, that the authorization 
will be done before pool creation):
vstorage-mount -c cluster-name mount_point. Then we have an access to 
this cluster as a filesystem, we
can upload-download image files, etc.
To avoid copy/paste of all vol-ops  and nearly half of pool-ops I've 
choosen pool/fs_backend.
Do you still think that it is necessary to have separate backend?



> Don't forget things need to be as separable as possible.  Add the pool
> code, add the storage conf code, add the virsh code, etc.  One long
> patch is just tough to review.

I will do splitting.

>
>>> John
>>>
>>> FWIW: It compiled, but failed syntax-check.
>> I have checked it once again - and in my case -syntax-check is passed.
>> Can you tell me what is wrong in your case? (The patch is ok for upstream)
>>
> Digging around I found my old review branch (been far too long to
> remember) - it was 571 commits old, but still able to rebase without
> merges (that's good)... My make syntax-check returns:
>
>
> preprocessor_indentation
> cppi: src/storage/storage_backend_fs.h: line 33: not properly indented
> cppi: src/storage/storage_backend_fs.h: line 35: not properly indented
> maint.mk: incorrect preprocessor indentation
> cfg.mk:684: recipe for target 'sc_preprocessor_indentation' failed
> make: *** [sc_preprocessor_indentation] Error 1
>
> This is something you would see on your system because:
>
> #if WITH_STORAGE_VSTORAGE
> extern virStorageBackend virStorageBackendVstorage;
> #endif
>
> needs have need to change to
>
> # if WITH_STORAGE_VSTORAGE
> extern virStorageBackend virStorageBackendVstorage;
> # endif
>
> But it doesn't belong there anyway

Thanks a lot.

>
>>>    Also the name "vstorage"
>>> would seemingly be a bit too generic. I saw and thought virtual storage
>>> not Virtuozzo Storage
>>>
>> All tools we use to manage Virtuozzo storage starts with vstorage*.
>> However, I can use vzstorage instead.
>>
> I suppose vstorage would be OK - I'm letting you know what I thought
> when I saw it.
>
> John
>
>>>> diff --git a/configure.ac b/configure.ac
>>>> index 2c81c95..2ee8b8c 100644
>>>> --- a/configure.ac
>>>> +++ b/configure.ac
>>>> @@ -1692,6 +1692,10 @@ AC_ARG_WITH([storage-zfs],
>>>>      [AS_HELP_STRING([--with-storage-zfs],
>>>>        [with ZFS backend for the storage driver @<:@default=check@:>@])],
>>>>      [],[with_storage_zfs=check])
>>>> +AC_ARG_WITH([storage-vstorage],
>>>> +  [AS_HELP_STRING([--with-storage-vstorage],
>>>> +    [with VZ backend for the storage driver @<:@default=check@:>@])],
>>>> +  [],[with_storage_vstorage=check])
>>>>      if test "$with_libvirtd" = "no"; then
>>>>      with_storage_dir=no
>>>> @@ -1705,6 +1709,7 @@ if test "$with_libvirtd" = "no"; then
>>>>      with_storage_sheepdog=no
>>>>      with_storage_gluster=no
>>>>      with_storage_zfs=no
>>>> +  with_storage_vstorage=no
>>>>    fi
>>>>    if test "$with_storage_dir" = "yes" ; then
>>>>      AC_DEFINE_UNQUOTED([WITH_STORAGE_DIR], 1, [whether directory
>>>> backend for storage driver is enabled])
>>>> @@ -1963,6 +1968,31 @@ if test "$with_storage_fs" = "yes" ||
>>>>      fi
>>>>    fi
>>>>    +if test "$with_storage_vstorage" = "yes" || test
>>>> "$with_storage_vstorage" = "check"; then
>>>> +   AC_PATH_PROG([VSTORAGE], [vstorage], [], [$PATH:/sbin:/usr/bin])
>>>> +   AC_PATH_PROG([VSTORAGE_MOUNT], [vstorage-mount], [],
>>>> [$PATH:/sbin/usr/bin])
>>>> +  if test "$with_storage_vstorage" = "yes"; then
>>>> +    if test -z "$VSTORAGE" ; then AC_MSG_ERROR([We need vstorage
>>>> tools for virtuozzo storage driver]); fi
>>>> +    if test -z "$VSTORAGE_MOUNT" ; then AC_MSG_ERROR([We need
>>>> vstorage mount tool for virtuozzo storage driver]); fi
>>>> +    if test  "$with_storage_fs" = "no"; then AC_MSG_ERROR([We need
>>>> fs backend for vstorage pool]); fi
>>>> +  else
>>>> +    if test -z "$VSTORAGE" ; then with_storage_vstorage=no; fi
>>>> +    if test -z "$VSTORAGE" ; then with_storage_vstorage=no; fi
>>>> +    if test  "$with_storage_fs"= "no"; then
>>>> with_storage_vstorage=no; fi
>>>> +
>>>> +    if test "$with_storage_vstorage" = "check" ; then
>>>> with_storage_vstorage=yes ; fi
>>>> +  fi
>>>> +  if test "$with_storage_vstorage" = "yes"; then
>>>> +      AC_DEFINE_UNQUOTED([WITH_STORAGE_VSTORAGE], 1, [whether
>>>> virtuozzo storage backend for storage driver is enabled])
>>>> +      AC_DEFINE_UNQUOTED([VSTORAGE], ["$VSTORAGE"], [Location or
>>>> name of vstorage program])
>>>> +      AC_DEFINE_UNQUOTED([VSTORAGE_MOUNT], ["$VSTORAGE_MOUNT"],
>>>> [Location or name of vstorage-mount program])
>>>> +      AC_DEFINE_UNQUOTED([with_storage_fs], ["$VSTORAGE_MOUNT"],
>>>> [must be on])
>>>> +  fi
>>>> +
>>>> +  if test "$with_storage_vstorage" = "check" ; then
>>>> with_storage_vstorage=yes ; fi
>>>> +fi
>>>> +AM_CONDITIONAL([WITH_STORAGE_VSTORAGE], [test
>>>> "$with_storage_vstorage" = "yes"])
>>>> +
>>>>    LIBPARTED_CFLAGS=
>>>>    LIBPARTED_LIBS=
>>>>    if test "$with_storage_disk" = "yes" ||
>>>> @@ -2759,6 +2789,7 @@ AC_MSG_NOTICE([     RBD: $with_storage_rbd])
>>>>    AC_MSG_NOTICE([Sheepdog: $with_storage_sheepdog])
>>>>    AC_MSG_NOTICE([ Gluster: $with_storage_gluster])
>>>>    AC_MSG_NOTICE([     ZFS: $with_storage_zfs])
>>>> +AC_MSG_NOTICE([Vstorage: $with_storage_vstorage])
>>>>    AC_MSG_NOTICE([])
>>>>    AC_MSG_NOTICE([Security Drivers])
>>>>    AC_MSG_NOTICE([])
>>>> diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
>>>> index 49d212f..8ad5616 100644
>>>> --- a/docs/schemas/storagepool.rng
>>>> +++ b/docs/schemas/storagepool.rng
>>>> @@ -24,6 +24,7 @@
>>>>            <ref name='poolsheepdog'/>
>>>>            <ref name='poolgluster'/>
>>>>            <ref name='poolzfs'/>
>>>> +        <ref name='poolvstorage'/>
>>>>          </choice>
>>>>        </element>
>>>>      </define>
>>>> @@ -173,6 +174,18 @@
>>>>        </interleave>
>>>>      </define>
>>>>    +  <define name='poolvstorage'>
>>>> +     <attribute name='type'>
>>>> +      <value>vz</value>
>>>> +    </attribute>
>>>> +    <interleave>
>>>> +      <ref name='commonmetadata'/>
>>>> +      <ref name='sizing'/>
>>>> +      <ref name='sourcevstorage'/>
>>>> +      <ref name='target'/>
>>>> +    </interleave>
>>>> +  </define>
>>>> +
>>>>      <define name='sourceinfovendor'>
>>>>        <interleave>
>>>>          <optional>
>>>> @@ -609,6 +622,22 @@
>>>>        </element>
>>>>      </define>
>>>>    +  <define name='clustername'>
>>>> +    <interleave>
>>>> +      <element name='name'>
>>>> +        <ref name='genericName'/>
>>>> +      </element>
>>>> +    </interleave>
>>>> +  </define>
>>>> +
>>>> +  <define name='sourcevstorage'>
>>>> +    <element name='source'>
>>>> +      <interleave>
>>>> +        <ref name='clustername'/>
>>>> +      </interleave>
>>>> +    </element>
>>>> +  </define>
>>>> +
>>>>      <define name='IscsiQualifiedName'>
>>>>        <data type='string'>
>>>>          <param
>>>> name="pattern">iqn\.[0-9]{4}-(0[1-9]|1[0-2])\.[a-zA-Z0-9\.\-]+(:.+)?</param>
>>>>
>>>> diff --git a/include/libvirt/libvirt-storage.h
>>>> b/include/libvirt/libvirt-storage.h
>>>> index 0974f6e..28babf7 100644
>>>> --- a/include/libvirt/libvirt-storage.h
>>>> +++ b/include/libvirt/libvirt-storage.h
>>>> @@ -232,6 +232,7 @@ typedef enum {
>>>>        VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG      = 1 << 15,
>>>>        VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER       = 1 << 16,
>>>>        VIR_CONNECT_LIST_STORAGE_POOLS_ZFS           = 1 << 17,
>>>> +    VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE      = 1 << 18,
>>>>    } virConnectListAllStoragePoolsFlags;
>>>>      int
>>>> virConnectListAllStoragePools(virConnectPtr conn,
>>>> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
>>>> index 05a1a49..e3c8ac1 100644
>>>> --- a/src/conf/storage_conf.c
>>>> +++ b/src/conf/storage_conf.c
>>>> @@ -60,7 +60,7 @@ VIR_ENUM_IMPL(virStoragePool,
>>>>                  "dir", "fs", "netfs",
>>>>                  "logical", "disk", "iscsi",
>>>>                  "scsi", "mpath", "rbd",
>>>> -              "sheepdog", "gluster", "zfs")
>>>> +              "sheepdog", "gluster", "zfs", "vstorage")
>>>>      VIR_ENUM_IMPL(virStoragePoolFormatFileSystem,
>>>>                  VIR_STORAGE_POOL_FS_LAST,
>>>> @@ -274,6 +274,16 @@ static virStoragePoolTypeInfo poolTypeInfo[] = {
>>>>             .defaultFormat = VIR_STORAGE_FILE_RAW,
>>>>         },
>>>>        },
>>>> +    {.poolType = VIR_STORAGE_POOL_VSTORAGE,
>>>> +     .poolOptions = {
>>>> +        .flags = VIR_STORAGE_POOL_SOURCE_NAME,
>>>> +     },
>>>> +     .volOptions = {
>>>> +        .defaultFormat = VIR_STORAGE_FILE_RAW,
>>>> +        .formatFromString = virStorageVolumeFormatFromString,
>>>> +        .formatToString = virStorageFileFormatTypeToString,
>>>> +     },
>>>> +    },
>>>>    };
>>>>      @@ -2588,6 +2598,10 @@
>>>> virStoragePoolSourceFindDuplicate(virConnectPtr conn,
>>>>                /* Only one mpath pool is valid per host */
>>>>                matchpool = pool;
>>>>                break;
>>>> +        case VIR_STORAGE_POOL_VSTORAGE:
>>>> +            if (STREQ(pool->def->source.name, def->source.name))
>>>> +                matchpool = pool;
>>>> +            break;
>>>>            case VIR_STORAGE_POOL_RBD:
>>>>            case VIR_STORAGE_POOL_LAST:
>>>>                break;
>>>> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
>>>> index 185ae5e..bf33b5f 100644
>>>> --- a/src/conf/storage_conf.h
>>>> +++ b/src/conf/storage_conf.h
>>>> @@ -95,6 +95,7 @@ typedef enum {
>>>>        VIR_STORAGE_POOL_SHEEPDOG, /* Sheepdog device */
>>>>        VIR_STORAGE_POOL_GLUSTER,  /* Gluster device */
>>>>        VIR_STORAGE_POOL_ZFS,      /* ZFS */
>>>> +    VIR_STORAGE_POOL_VSTORAGE, /* Virtuozzo Storage */
>>>>          VIR_STORAGE_POOL_LAST,
>>>>    } virStoragePoolType;
>>>> @@ -545,7 +546,8 @@ VIR_ENUM_DECL(virStoragePartedFs)
>>>>                     VIR_CONNECT_LIST_STORAGE_POOLS_RBD      | \
>>>>                     VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG | \
>>>>                     VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER  | \
>>>> -                 VIR_CONNECT_LIST_STORAGE_POOLS_ZFS)
>>>> +                 VIR_CONNECT_LIST_STORAGE_POOLS_ZFS      | \
>>>> +                 VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE)
>>>>      # define
>>>> VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL                  \
>>>>                    (VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ACTIVE     | \
>>>> diff --git a/src/storage/storage_backend.c
>>>> b/src/storage/storage_backend.c
>>>> index 97f6ffe..181d3f5 100644
>>>> --- a/src/storage/storage_backend.c
>>>> +++ b/src/storage/storage_backend.c
>>>> @@ -135,6 +135,9 @@ static virStorageBackendPtr backends[] = {
>>>>    #if WITH_STORAGE_ZFS
>>>>        &virStorageBackendZFS,
>>>>    #endif
>>>> +#if WITH_STORAGE_VSTORAGE
>>>> +    &virStorageBackendVstorage,
>>>> +#endif
>>>>        NULL
>>>>    };
>>>>    diff --git a/src/storage/storage_backend_fs.c
>>>> b/src/storage/storage_backend_fs.c
>>>> index 0a12ecb..b89b3ae 100644
>>>> --- a/src/storage/storage_backend_fs.c
>>>> +++ b/src/storage/storage_backend_fs.c
>>>> @@ -371,7 +371,13 @@
>>>> virStorageBackendFileSystemIsValid(virStoragePoolObjPtr pool)
>>>>                               "%s", _("missing source path"));
>>>>                return -1;
>>>>            }
>>>> -    } else {
>>>> +    } else if (pool->def->type == VIR_STORAGE_POOL_VSTORAGE) {
>>>> +        if (!pool->def->source.name) {
>>>> +            virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> +                           "%s", _("missing source cluster name"));
>>>> +            return -1;
>>>> +        }
>>>> +    } else{
>>>>            if (pool->def->source.ndevice != 1) {
>>>>                if (pool->def->source.ndevice == 0)
>>>>                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>>>> @@ -411,6 +417,9 @@
>>>> virStorageBackendFileSystemGetPoolSource(virStoragePoolObjPtr pool)
>>>>                                pool->def->source.dir) < 0)
>>>>                    return NULL;
>>>>            }
>>>> +    } else if (pool->def->type == VIR_STORAGE_POOL_VSTORAGE) {
>>>> +        if (virAsprintf(&src, "vstorage://%s",
>>>> pool->def->source.name) < 0)
>>>> +            return NULL;
>>>>        } else {
>>>>            if (VIR_STRDUP(src, pool->def->source.devices[0].path) < 0)
>>>>                return NULL;
>>>> @@ -546,7 +555,9 @@
>>>> virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
>>>>        VIR_FREE(src);
>>>>        return ret;
>>>>    }
>>>> +#endif /* WITH_STORAGE_FS */
>>>>    +#if WITH_STORAGE_FS
>>>>    /**
>>>>     * @pool storage pool to unmount
>>>>     *
>>>> @@ -1654,3 +1665,102 @@ virStorageFileBackend
>>>> virStorageFileBackendDir = {
>>>>    };
>>>>      #endif /* WITH_STORAGE_FS */
>>>> +
>>>> +#if WITH_STORAGE_VSTORAGE
>>>> +static int
>>>> +virStorageBackendVzStart(virConnectPtr conn ATTRIBUTE_UNUSED,
>>>> +                         virStoragePoolObjPtr pool)
>>>> +{
>>>> +    int ret = -1;
>>>> +    virCommandPtr cmd = NULL;
>>>> +
>>>> +    cmd = virCommandNewArgList(VSTORAGE_MOUNT, "-c",
>>>> pool->def->source.name,
>>>> +                               pool->def->target.path, NULL);
>>>> +    if (virCommandRun(cmd, NULL) < 0)
>>>> +        goto cleanup;
>>>> +    ret = 0;
>>>> +
>>>> + cleanup:
>>>> +    virCommandFree(cmd);
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +static char*
>>>> +virStorageBackendVzfindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
>>>> +                                   const char *srcSpec
>>>> ATTRIBUTE_UNUSED,
>>>> +                                   unsigned int flags)
>>>> +{
>>>> +
>>>> +    virCommandPtr cmd = NULL;
>>>> +    char *buf = NULL;
>>>> +    char *ret = NULL;
>>>> +    char **clusters = NULL;
>>>> +    size_t clusters_num = 0;
>>>> +    size_t i = 0;
>>>> +    virStoragePoolSourceList vzcluster_list = {
>>>> +                                .type = VIR_STORAGE_POOL_VSTORAGE,
>>>> +                                .nsources = 0,
>>>> +                                .sources = NULL
>>>> +    };
>>>> +
>>>> +    virCheckFlags(0, NULL);
>>>> +
>>>> +    cmd = virCommandNewArgList(VSTORAGE, "discover", NULL);
>>>> +    virCommandSetOutputBuffer(cmd, &buf);
>>>> +
>>>> +    if (virCommandRun(cmd, NULL) < 0)
>>>> +        goto cleanup;
>>>> +
>>>> +    if (!(clusters = virStringSplitCount(buf, "\n", 0, &clusters_num)))
>>>> +        goto cleanup;
>>>> +
>>>> +    if (clusters_num > 0) {
>>>> +        vzcluster_list.nsources = clusters_num - 1;
>>>> +
>>>> +        if (VIR_ALLOC_N(vzcluster_list.sources,
>>>> vzcluster_list.nsources) < 0)
>>>> +            goto cleanup;
>>>> +
>>>> +        for  (; i < vzcluster_list.nsources; i++) {
>>>> +            if (VIR_ALLOC(vzcluster_list.sources[i].devices) < 0)
>>>> +                goto cleanup;
>>>> +            if (VIR_STRDUP(vzcluster_list.sources[i].name,
>>>> clusters[i]) < 0)
>>>> +                goto cleanup;
>>>> +        }
>>>> +    }
>>>> +
>>>> +    if (!(ret = virStoragePoolSourceListFormat(&vzcluster_list)))
>>>> +        goto cleanup;
>>>> +
>>>> + cleanup:
>>>> +    for (i = 0; i < vzcluster_list.nsources; i++) {
>>>> +        virStoragePoolSourceClear(&vzcluster_list.sources[i]);
>>>> +        VIR_FREE(clusters[i]);
>>>> +    }
>>>> +    VIR_FREE(vzcluster_list.sources);
>>>> +    VIR_FREE(buf);
>>>> +    virCommandFree(cmd);
>>>> +    return ret;
>>>> +
>>>> +}
>>>> +virStorageBackend virStorageBackendVstorage = {
>>>> +    .type = VIR_STORAGE_POOL_VSTORAGE,
>>>> +
>>>> +    .startPool = virStorageBackendVzStart,
>>>> +    .checkPool = virStorageBackendFileSystemCheck,
>>>> +    .stopPool = virStorageBackendFileSystemStop,
>>>> +    .findPoolSources = virStorageBackendVzfindPoolSources,
>>>> +    .buildPool = virStorageBackendFileSystemBuild,
>>>> +    .deletePool = virStorageBackendFileSystemDelete,
>>>> +    .refreshPool = virStorageBackendFileSystemRefresh,
>>>> +    .buildVol = virStorageBackendFileSystemVolBuild,
>>>> +    .buildVolFrom = virStorageBackendFileSystemVolBuildFrom,
>>>> +    .createVol = virStorageBackendFileSystemVolCreate,
>>>> +    .refreshVol = virStorageBackendFileSystemVolRefresh,
>>>> +    .deleteVol = virStorageBackendFileSystemVolDelete,
>>>> +    .resizeVol = virStorageBackendFileSystemVolResize,
>>>> +    .uploadVol = virStorageBackendVolUploadLocal,
>>>> +    .downloadVol = virStorageBackendVolDownloadLocal,
>>>> +    .wipeVol = virStorageBackendVolWipeLocal,
>>>> +
>>>> +};
>>>> +#endif /* WITH_STORAGE_VSTORAGE */
>>>> diff --git a/src/storage/storage_backend_fs.h
>>>> b/src/storage/storage_backend_fs.h
>>>> index 347ea9b..23cff66 100644
>>>> --- a/src/storage/storage_backend_fs.h
>>>> +++ b/src/storage/storage_backend_fs.h
>>>> @@ -30,6 +30,9 @@
>>>>    extern virStorageBackend virStorageBackendFileSystem;
>>>>    extern virStorageBackend virStorageBackendNetFileSystem;
>>>>    # endif
>>>> +#if WITH_STORAGE_VSTORAGE
>>>> +extern virStorageBackend virStorageBackendVstorage;
>>>> +#endif
>>>>      typedef enum {
>>>>        FILESYSTEM_PROBE_FOUND,
>>>> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
>>>> index cb9d578..3b6c7b4 100644
>>>> --- a/src/storage/storage_driver.c
>>>> +++ b/src/storage/storage_driver.c
>>>> @@ -1618,6 +1618,7 @@ storageVolLookupByPath(virConnectPtr conn,
>>>>                case VIR_STORAGE_POOL_ISCSI:
>>>>                case VIR_STORAGE_POOL_SCSI:
>>>>                case VIR_STORAGE_POOL_MPATH:
>>>> +            case VIR_STORAGE_POOL_VSTORAGE:
>>>>                    stable_path = virStorageBackendStablePath(pool,
>>>>                                                              cleanpath,
>>>>                                                              false);
>>>> @@ -3485,6 +3486,7 @@ virStorageTranslateDiskSourcePool(virConnectPtr
>>>> conn,
>>>>        case VIR_STORAGE_POOL_DISK:
>>>>        case VIR_STORAGE_POOL_SCSI:
>>>>        case VIR_STORAGE_POOL_ZFS:
>>>> +    case VIR_STORAGE_POOL_VSTORAGE:
>>>>            if (!(def->src->path = virStorageVolGetPath(vol)))
>>>>                goto cleanup;
>>>>    diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
>>>> index 6045331..6ea2424 100644
>>>> --- a/tools/virsh-pool.c
>>>> +++ b/tools/virsh-pool.c
>>>> @@ -1166,6 +1166,8 @@ cmdPoolList(vshControl *ctl, const vshCmd *cmd
>>>> ATTRIBUTE_UNUSED)
>>>>                case VIR_STORAGE_POOL_ZFS:
>>>>                    flags |= VIR_CONNECT_LIST_STORAGE_POOLS_ZFS;
>>>>                    break;
>>>> +            case VIR_STORAGE_POOL_VSTORAGE:
>>>> +                flags |= VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE;
>>>>                case VIR_STORAGE_POOL_LAST:
>>>>                    break;
>>>>                }
>>>> diff --git a/tools/virsh.c b/tools/virsh.c
>>>> index 5dc482d..61c8e2f 100644
>>>> --- a/tools/virsh.c
>>>> +++ b/tools/virsh.c
>>>> @@ -682,6 +682,9 @@ virshShowVersion(vshControl *ctl ATTRIBUTE_UNUSED)
>>>>    #ifdef WITH_STORAGE_ZFS
>>>>        vshPrint(ctl, " ZFS");
>>>>    #endif
>>>> +#ifdef WITH_STORAGE_VSTORAGE
>>>> +    vshPrint(ctl, " Vstorage");
>>>> +#endif
>>>>        vshPrint(ctl, "\n");
>>>>          vshPrint(ctl, "%s", _(" Miscellaneous:"));
>>>>
>>


-- 
Best regards,
Olga




More information about the libvir-list mailing list