[libvirt] [PATCH] Fix bug #611823 prohibit pools with duplicate storage
Daniel P. Berrange
berrange at redhat.com
Tue Aug 2 11:09:16 UTC 2011
On Fri, Jul 29, 2011 at 12:34:15PM +0800, Lei Li wrote:
> To make sure the unique storage pool defined and created from different directory to avoid inconsistent version of volume pool created, I add two API be called by storage driver to check for the probable duplicate pools and refused the duplicate pool.
>
> virStoragePoolObjFindByPath() provide a method to find pool object by target path in pool list.
> virStoragePoolTargetDuplicate() implement the function to check if there is duplicate pool.
> Add judgement for storagePoolCreate&storagePoolDefine by calling virStoragePoolTargetDuplicate() to avoid both transient storage pool and persistent storage pool be created repeatedly in storage driver.
>
>
> Signed-off-by: Lei Li<lilei at linux.vnet.ibm.com>
> ---
> src/conf/storage_conf.c | 39 +++++++++++++++++++++++++++++++++++++++
> src/conf/storage_conf.h | 4 ++++
> src/libvirt_private.syms | 2 ++
> src/storage/storage_driver.c | 6 ++++++
> 4 files changed, 51 insertions(+), 0 deletions(-)
>
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index 995f9a6..a499e82 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -1317,6 +1317,22 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
> return NULL;
> }
>
> +virStoragePoolObjPtr
> +virStoragePoolObjFindByPath(virStoragePoolObjListPtr pools,
> + const char *path)
> +{
> + unsigned int i;
> +
> + for (i = 0 ; i< pools->count ; i++) {
> + virStoragePoolObjLock(pools->objs[i]);
> + if (STREQ(pools->objs[i]->def->target.path, path))
> + return pools->objs[i];
> + virStoragePoolObjUnlock(pools->objs[i]);
> + }
> +
> + return NULL;
> +}
> +
> void
> virStoragePoolObjClearVols(virStoragePoolObjPtr pool)
> {
> @@ -1707,6 +1723,29 @@ cleanup:
> return ret;
> }
>
> +int virStoragePoolTargetDuplicate(virStoragePoolObjListPtr pools,
> + virStoragePoolDefPtr def)
> +{
> + int ret = 1;
> + virStoragePoolObjPtr pool = NULL;
> +
> + /*check pool list if defined target path already exist*/
> + pool = virStoragePoolObjFindByPath(pools, def->target.path);
> +
> + if (pool) {
> + virStorageReportError(VIR_ERR_OPERATION_FAILED,
> + _("target path '%s' is already in use"),
> + pool->def->target.path);
> + ret = -1;
> + goto cleanup;
> + }
This only works for pools which are type=dir|fs|netfs|logical
It will fail for type=iscsi|scsi|disk, because in those cases the
target path has no uniqueness requirement, and will almost always
just be either /dev or /dev/disk/by-path for all pool.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list