On Thu, Feb 14, 2008 at 06:24:09AM -0500, Daniel Veillard wrote:
On Tue, Feb 12, 2008 at 04:30:45AM +0000, Daniel P. Berrange wrote:
> This defines the internal driver API for the storage APIs. The
> pattern follows that used for the existing APIs. NB, both the
> storage pool and storage volume objects are now top level objects.
> Previous iterations of this code have the volume as a child of
> the pool. This unneccessarily complicated the reference counting
> and forced you to always have a pool available first.
[...]
> + unsigned int flags);
> +typedef int
> + (*virDrvStoragePoolCreate) (virStoragePoolPtr pool);
as mentioned previously, a flags here is a safety IMHO
> +typedef int
> + (*virDrvStoragePoolDestroy) (virStoragePoolPtr pool);
[...]
> +/**
> +* _virNetwork:
> +*
> +* Internal structure associated to a storage volume
> +*/
> +struct _virStorageVol {
> + unsigned int magic; /* specific value to check */
> + int refs; /* reference count */
> + virConnectPtr conn; /* pointer back to the connection */
> + char *pool; /* Pool name of owner */
> + char *name; /* the storage vol external name */
> + /* XXX currently abusing path for this. Ought not to be so evil */
> + char key[PATH_MAX]; /* unique key for storage vol */
> };
I'm just a bit surprized by the static allocation of the key. Even if
we are passing _virStorageVol data around, I guess the string is zero
terminated and we can probably avoid the static size. Or is that too much of
a burden ?
Yes, I'll switch this to be allocated on demand - I just happened to have it
pre-allocated because I have simply renamed the 'uuid' field which was also
pre-allocated.
> +int
> +virStoragePoolCreate(virStoragePoolPtr pool)
> +{
> + virConnectPtr conn;
> + DEBUG("pool=%p", pool);
> +
> + if (pool == NULL) {
> + TODO;
> + return (-1);
> + }
> + if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
> + virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
> + return (-1);
> + }
> + conn = pool->conn;
> + if (conn->flags & VIR_CONNECT_RO) {
> + virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> + return (-1);
> + }
> +
> + if (conn->storageDriver && conn->storageDriver->poolCreate)
> + return conn->storageDriver->poolCreate (pool);
> +
> + virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
> + return -1;
> +
> +}
Would just like to see a flags parameter here too.
Yes, all Create methods need flags.
> +/**
> + * virStoragePoolDestroy:
> + * @pool: pointer to storage pool
> + *
> + * Destroy an active storage pool. The virStoragePoolPtr
> + * object should not be used after this method returns
> + * successfully as it has been free'd
maybe indicating the difference between Free/Destroy and Delete would be
good here. people might think it's used to free the on-disk resources
(I believe it's not the case, but in the context of storage maybe
a bit more details are needed it's not like domains for which the runtime
state can be recreated from the defined state, for storage it's a bit
different I think).
This comment is actually bogus - the Destroy method does not actually
free the virStoragePoolPtr object itself - you still need to call the
explicit virStoragePoolFree method.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules:
http://search.cpan.org/~danberr/ -=|
|=- Projects:
http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|