[libvirt] [Libvirt] [PATCH v2] Fix bug #611823 prohibit pools with duplicate storage
Eric Blake
eblake at redhat.com
Mon Aug 1 20:12:51 UTC 2011
On 07/31/2011 10:58 PM, Lei Li wrote:
> Make sure the unique storage pool defined and create from different directory to avoid inconsistent version of volume pool created.
Wrap your commit messages; typically at 70 columns or so (since 'git
log' adds some indentation, but you want the end result to still fit in
80 columns for legibility).
>
> Signed-off-by: Lei Li<lilei at linux.vnet.ibm.com>
> ---
> src/conf/storage_conf.c | 36 ++++++++++++++++++++++++++++++++++++
> src/conf/storage_conf.h | 4 ++++
> src/libvirt_private.syms | 2 ++
> src/storage/storage_driver.c | 6 ++++++
> 4 files changed, 48 insertions(+), 0 deletions(-)
>
>
> +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;
> +}
This one is good; in fact, we may even want to expose it as a public
API, parallel to other virStoragePoolLookupBy* functions (but not until
after 0.9.4 is released)
>
> +int virStoragePoolTargetDuplicate(virStoragePoolObjListPtr pools,
> + virStoragePoolDefPtr def)
> +{
> + int ret = 1;
> + virStoragePoolObjPtr pool = NULL;
> +
> + /* Check the pool list if defined target path already exist */
s/exist/exists/
However, I'm not sure if this warrants a separate function. Instead,
should we just fold this additional logic search into
virStoragePoolObjIsDuplicate?
> +++ b/src/libvirt_private.syms
> @@ -937,7 +937,9 @@ virStoragePoolObjClearVols;
> virStoragePoolObjDeleteDef;
> virStoragePoolObjFindByName;
> virStoragePoolObjFindByUUID;
> +virStoragePoolObjFindByPath;
> virStoragePoolObjIsDuplicate;
> +virStoragePoolTargetDuplicate;
Sort these lines (or just the virStoragePoolObjFindByPath, if we go with
inlining the duplicate target search into virStoragePoolObjIsDuplicate).
> +++ b/src/storage/storage_driver.c
> @@ -536,6 +536,9 @@ storagePoolCreate(virConnectPtr conn,
> if (virStoragePoolObjIsDuplicate(&driver->pools, def, 1)< 0)
> goto cleanup;
>
> + if (virStoragePoolTargetDuplicate(&driver->pools, def)< 0)
> + goto cleanup;
> +
Given my consolidation ideas, you wouldn't even have to touch
storage_driver.c.
While I like the idea, I think that it was first proposed too late after
the 0.9.4 RC1, and it isn't a show-stopper bug, so I'd feel better
deferring this to post-release and a v3 patch.
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list