[libvirt] [PATCH v2] Source control for storage pool
Daniel Veillard
veillard at redhat.com
Mon Sep 5 07:55:56 UTC 2011
On Sat, Sep 03, 2011 at 02:59:18AM +0800, Lei Li wrote:
> Fix bug #611823 storage driver should prohibit pools with duplicate underlying
> storage.
>
> Add API virStoragePoolSourceFindDuplicate() to do uniqueness check based on
> source location infomation for pool type.
Okay I tweaked the subject and description a little bit
>
> Signed-off-by: Lei Li <lilei at linux.vnet.ibm.com>
> ---
> src/conf/storage_conf.c | 80 ++++++++++++++++++++++++++++++++++++++++++
> src/conf/storage_conf.h | 5 +++
> src/libvirt_private.syms | 2 +
> src/storage/storage_driver.c | 6 +++
> 4 files changed, 93 insertions(+), 0 deletions(-)
>
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index 8d14e87..1e7da69 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -1311,6 +1311,21 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
> return NULL;
> }
>
> +virStoragePoolObjPtr
> +virStoragePoolSourceFindDuplicateDevices(virStoragePoolObjPtr pool,
> + virStoragePoolDefPtr def) {
> + unsigned int i, j;
> +
> + for (i = 0; i < pool->def->source.ndevice; i++) {
> + for (j = 0; j < def->source.ndevice; j++) {
> + if (STREQ(pool->def->source.devices[i].path, def->source.devices[j].path))
> + return pool;
> + }
> + }
> +
> + return NULL;
> +}
> +
> void
> virStoragePoolObjClearVols(virStoragePoolObjPtr pool)
> {
> @@ -1701,6 +1716,71 @@ cleanup:
> return ret;
> }
>
> +int virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
> + virStoragePoolDefPtr def)
> +{
> + int i;
> + int ret = 1;
> + virStoragePoolObjPtr pool = NULL;
> + virStoragePoolObjPtr matchpool = NULL;
> +
> + /* Check the pool list for duplicate underlying storage */
> + for (i = 0; i < pools->count; i++) {
> + pool = pools->objs[i];
> + if (def->type != pool->def->type)
> + continue;
> +
> + virStoragePoolObjLock(pool);
> +
> + switch (pool->def->type) {
> + case VIR_STORAGE_POOL_DIR:
> + if (STREQ(pool->def->target.path, def->target.path))
> + matchpool = pool;
> + break;
> + case VIR_STORAGE_POOL_NETFS:
> + if ((STREQ(pool->def->source.dir, def->source.dir)) \
> + && (STREQ(pool->def->source.host.name, def->source.host.name)))
> + matchpool = pool;
> + break;
> + case VIR_STORAGE_POOL_SCSI:
> + if (STREQ(pool->def->source.adapter, def->source.adapter))
> + matchpool = pool;
> + break;
> + case VIR_STORAGE_POOL_ISCSI:
> + {
> + matchpool = virStoragePoolSourceFindDuplicateDevices(pool, def);
> + if (matchpool) {
> + if (STREQ(matchpool->def->source.host.name, def->source.host.name)) {
> + if ((matchpool->def->source.initiator.iqn) && (def->source.initiator.iqn)) {
> + if (STREQ(matchpool->def->source.initiator.iqn, def->source.initiator.iqn))
> + break;
> + matchpool = NULL;
> + }
> + break;
> + }
> + matchpool = NULL;
> + }
> + break;
> + }
> + case VIR_STORAGE_POOL_FS:
> + case VIR_STORAGE_POOL_LOGICAL:
> + case VIR_STORAGE_POOL_DISK:
> + matchpool = virStoragePoolSourceFindDuplicateDevices(pool, def);
> + break;
> + default:
> + break;
> + }
> + virStoragePoolObjUnlock(pool);
> + }
> +
> + if (matchpool) {
> + virStorageReportError(VIR_ERR_OPERATION_FAILED,
> + _("Storage source conflict with pool: '%s'"),
> + matchpool->def->name);
> + ret = -1;
> + }
> + return ret;
> +}
>
> void virStoragePoolObjLock(virStoragePoolObjPtr obj)
> {
> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
> index 271441a..d115a15 100644
> --- a/src/conf/storage_conf.h
> +++ b/src/conf/storage_conf.h
> @@ -335,6 +335,8 @@ virStoragePoolObjPtr virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
> const unsigned char *uuid);
> virStoragePoolObjPtr virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
> const char *name);
> +virStoragePoolObjPtr virStoragePoolSourceFindDuplicateDevices(virStoragePoolObjPtr pool,
> + virStoragePoolDefPtr def);
>
> virStorageVolDefPtr virStorageVolDefFindByKey(virStoragePoolObjPtr pool,
> const char *key);
> @@ -388,6 +390,9 @@ int virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
> virStoragePoolDefPtr def,
> unsigned int check_active);
>
> +int virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
> + virStoragePoolDefPtr def);
> +
> void virStoragePoolObjLock(virStoragePoolObjPtr obj);
> void virStoragePoolObjUnlock(virStoragePoolObjPtr obj);
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9f03e30..316eb7e 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -947,7 +947,9 @@ virStoragePoolObjClearVols;
> virStoragePoolObjDeleteDef;
> virStoragePoolObjFindByName;
> virStoragePoolObjFindByUUID;
> +virStoragePoolSourceFindDuplicateDevices;
> virStoragePoolObjIsDuplicate;
> +virStoragePoolSourceFindDuplicate;
> virStoragePoolObjListFree;
> virStoragePoolObjLock;
> virStoragePoolObjRemove;
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 68cac1f..c05b74e 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -536,6 +536,9 @@ storagePoolCreate(virConnectPtr conn,
> if (virStoragePoolObjIsDuplicate(&driver->pools, def, 1) < 0)
> goto cleanup;
>
> + if (virStoragePoolSourceFindDuplicate(&driver->pools, def) < 0)
> + goto cleanup;
> +
> if ((backend = virStorageBackendForType(def->type)) == NULL)
> goto cleanup;
>
> @@ -589,6 +592,9 @@ storagePoolDefine(virConnectPtr conn,
> if (virStoragePoolObjIsDuplicate(&driver->pools, def, 0) < 0)
> goto cleanup;
>
> + if (virStoragePoolSourceFindDuplicate(&driver->pools, def) < 0)
> + goto cleanup;
> +
> if (virStorageBackendForType(def->type) == NULL)
> goto cleanup;
>
ACK, the two comments from Dan have been addressed in v2, and patch
looks fine so applied,
I also added you to the AUTHORS before commiting,
thanks a lot,
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