On 06/04/13 03:29, John Ferlan wrote:
On 03/25/2013 12:43 PM, Osier Yang wrote:
> startPool creates the vHBA if it's not existed yet, stopPool destroys
s/it's not exists/it does not exist/
Okay.
> the vHBA. Also to support autostart, checkPool will creates the
vHBA
s/creates/create
Okay.
> if it's not existed yet.
s/it's not existed/it does not exist
Okay.
> ---
> src/storage/storage_backend_scsi.c | 64 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 64 insertions(+)
>
> diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
> index 258c82e..0bb4e70 100644
> --- a/src/storage/storage_backend_scsi.c
> +++ b/src/storage/storage_backend_scsi.c
> @@ -646,6 +646,36 @@ getAdapterName(virStoragePoolSourceAdapter adapter)
> }
>
> static int
> +createVport(virStoragePoolSourceAdapter adapter)
> +{
> + unsigned int parent_host;
> +
> + if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
> + return 0;
Since the StopPool has the same check - why put this check in here
instead of StartPool?
Sometimes you will want to put checking inside helper to avoid the caller
incorrectly use it. Though the checking of this helper is simple enough
to let the caller make mistake. But I'd keep it here.
> +
> + /* This filters either HBA or already created vHBA */
> + if (virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
> + adapter.data.fchost.wwpn))
> + return 0;
there's a memory leak here as the called function returns strdup()
value. Of course this logic could be backwards too and what you meant
was "if (!vir...)" probably changes the return value too...
Added the VIR_FREE.
I hope it goes without saying that the leak exists below too :-)
> +
> + if (!adapter.data.fchost.parent) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("'parent' for vHBA must be specified"));
> + return -1;
> + }
> +
> + if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
> + return -1;
> +
> + if (virManageVport(parent_host, adapter.data.fchost.wwnn,
> + adapter.data.fchost.wwpn, VPORT_CREATE) < 0)
> + return -1;
> +
> + virFileWaitForDevices();
> + return 0;
> +}
> +
> +static int
> virStorageBackendSCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
> virStoragePoolObjPtr pool,
> bool *isActive)
> @@ -707,10 +737,44 @@ out:
> return ret;
> }
>
> +static int
> +virStorageBackendSCSIStartPool(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virStoragePoolObjPtr pool)
> +{
> + virStoragePoolSourceAdapter adapter = pool->def->source.adapter;
> +
> + return createVport(adapter);
> +}
> +
> +static int
> +virStorageBackendSCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virStoragePoolObjPtr pool)
> +{
> + virStoragePoolSourceAdapter adapter = pool->def->source.adapter;
> + unsigned int parent_host;
> +
> + if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
> + return 0;
> +
> + if (!(virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
> + adapter.data.fchost.wwpn)))
> + return -1;
> +
> + if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
> + return -1;
> +
> + if (virManageVport(parent_host, adapter.data.fchost.wwnn,
> + adapter.data.fchost.wwpn, VPORT_DELETE) < 0)
> + return -1;
> +
> + return 0;
"Consistently speaking" there could have been a deleteVport() or the
"createVport()" is/was unnecessary.
I added a deleteVport.
> +}
>
> virStorageBackend virStorageBackendSCSI = {
> .type = VIR_STORAGE_POOL_SCSI,
>
> .checkPool = virStorageBackendSCSICheckPool,
> .refreshPool = virStorageBackendSCSIRefreshPool,
> + .startPool = virStorageBackendSCSIStartPool,
> + .stopPool = virStorageBackendSCSIStopPool,
> };
>
I think this one needs a refactor and re-review.
The straightforward diff is attached, and I assume you will ACK it.