On 11.11.2014 13:38, John Ferlan wrote:
>
>
> On 11/11/2014 07:21 AM, Michal Privoznik wrote:
>> On 10.11.2014 23:45, John Ferlan wrote:
>>>
https://bugzilla.redhat.com/show_bug.cgi?id=1160565
>>>
>>> If a 'parent' attribute is provided for the fchost, then at startup
>>> time check to ensure it is a vport capable scsi_host. If the parent
>>> is not vport capable, then disallow the startup. The following is the
>>> expected results:
>>>
>>> error: Failed to start pool fc_pool
>>> error: XML error: parent 'scsi_host2' specified for vHBA is not vport
capable
>>>
>>> where the XML for the fc_pool is:
>>>
>>> <pool type='scsi'>
>>> <name>fc_pool</name>
>>> <source>
>>> <adapter type='fc_host' parent='scsi_host2'
wwnn='5001a4aaf3ca174b' wwpn='5001a4a77192b864'/>
>>> </source>
>>> ...
>>>
>>> and 'scsi_host2' is not vport capable.
>>>
>>> Providing an incorrect parent and a correct wwnn/wwpn could lead to
>>> failures at shutdown (deleteVport) where the assumption is the parent
>>> is for the fchost.
>>>
>>> NOTE: If the provided wwnn/wwpn doesn't resolve to an existing
scsi_host,
>>> then we will be creating one with code (virManageVport) which
>>> assumes the parent is vport capable.
>>>
>>> Signed-off-by: John Ferlan <jferlan(a)redhat.com>
>>> ---
>>> src/storage/storage_backend_scsi.c | 22 ++++++++++++++++++----
>>> 1 file changed, 18 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/storage/storage_backend_scsi.c
b/src/storage/storage_backend_scsi.c
>>> index 02160bc..549d8db 100644
>>> --- a/src/storage/storage_backend_scsi.c
>>> +++ b/src/storage/storage_backend_scsi.c
>>> @@ -556,6 +556,20 @@ createVport(virStoragePoolSourceAdapter adapter)
>>> if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
>>> return 0;
>>>
>>> + /* If a parent was provided, then let's make sure it's vhost
capable */
>>> + if (adapter.data.fchost.parent) {
>>> + if (virGetSCSIHostNumber(adapter.data.fchost.parent,
&parent_host) < 0)
>>> + return -1;
>
> ^^^ [1] ^^^
>>> +
>>> + if (!virIsCapableFCHost(NULL, parent_host)) {
>>> + virReportError(VIR_ERR_XML_ERROR,
>>> + _("parent '%s' specified for vHBA
"
>>> + "is not vport capable"),
>>> + adapter.data.fchost.parent);
>>> + return -1;
>>> + }
>>> + }
>>> +
>>> /* This filters either HBA or already created vHBA */
>>> if ((name = virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
>>> adapter.data.fchost.wwpn))) {
>>> @@ -565,14 +579,14 @@ createVport(virStoragePoolSourceAdapter adapter)
>>>
>>> if (!adapter.data.fchost.parent &&
>>> !(adapter.data.fchost.parent = virFindFCHostCapableVport(NULL)))
{
>>> - virReportError(VIR_ERR_XML_ERROR, "%s",
>>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>>> _("'parent' for vHBA not specified,
and "
>>> "cannot find one on this host"));
>>> return -1;
>>> - }
>>>
>>> - if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host)
< 0)
>>> - return -1;
>>> + if (virGetSCSIHostNumber(adapter.data.fchost.parent,
&parent_host) < 0)
>>> + return -1;
>>> + }
>>
>> This chunk seems odd. After the error is reported, the control jumps out
>> from the function, so virGetSCSIHostNumer is not called at all. Did you
>> forget to commit something?
>>
>
> The earlier chunk of code where the parent exists, we figure the
> parent_host value. [1]
>
> This chunk is - if a parent wasn't provided, find a capable vport, then
> get the parent_host value.
>
> I moved it inside the if because it makes no sense to call the function
> twice in the event we had a parent value..
My point is, when the conditions are met, and the error is reported the
control jumps out of the function right after virReportError(). That's
because there's 'return -1' after that. However, the next line in the
same block is yet another function call. This, however, will never be
called so it's a dead code. Hence my question.
Michal
Doh! Of course as you'll find in later patches the logic is adjusted
and thus where my brain was already at. I'll fix this one though to be:
diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_sc
index 549d8db..88928c9 100644
--- a/src/storage/storage_backend_scsi.c
+++ b/src/storage/storage_backend_scsi.c
@@ -577,12 +577,13 @@ createVport(virStoragePoolSourceAdapter adapter)
return 0;
}
- if (!adapter.data.fchost.parent &&
- !(adapter.data.fchost.parent = virFindFCHostCapableVport(NULL))) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("'parent' for vHBA not specified, and "
- "cannot find one on this host"));
- return -1;
+ if (!adapter.data.fchost.parent) {
+ if (!(adapter.data.fchost.parent = virFindFCHostCapableVport(NULL))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("'parent' for vHBA not specified, and "
+ "cannot find one on this host"));
+ return -1;
+ }
if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
return -1;