[libvirt] [PATCH 1/1] Implement NPIV

Dave Allan dallan at redhat.com
Mon Apr 13 14:25:08 UTC 2009


Daniel P. Berrange wrote:
> On Wed, Apr 08, 2009 at 05:53:57PM -0400, Dave Allan wrote:
>> Daniel P. Berrange wrote:
>>>> diff --git a/src/storage_conf.h b/src/storage_conf.h
>>>> index 4e35ccb..cfd8b14 100644
>>>> --- a/src/storage_conf.h
>>>> +++ b/src/storage_conf.h
>>>> @@ -192,6 +192,12 @@ struct _virStoragePoolSource {
>>>>     /* Or an adapter */
>>>>     char *adapter;
>>>>
>>>> +    /* And an optional WWPN */
>>>> +    char *wwpn;
>>>> +
>>>> +    /* And an optional WWNN */
>>>> +    char *wwnn;
>>>> +
>>> Since adapter, wwpn and wwnn are all associated with each other, I
>>> think we should put them all into a union here. eg, replace the
>>> current
>>>
>>>      char *adapter;
>>>
>>> with
>>>
>>>     union {
>>>        char *name;
>>>        char *wwpn;
>>>        char *wwnn;
>>>     } adapter;
>> I don't have completely working code yet, but here's what I'm thinking:
>>
>> We can't use a union because wwpn and wwnn will always be in use at the 
>> same time, but I agree that we're starting to collect a bunch of related 
>> information about adapters that clutters up the pool source struct. 
>> I've created a struct along the lines of virStoragePoolSourceHost to 
>> contain this information.  It will need some additional fields.
> 
> I don't know what I was thinking when I wrote 'union'. I absolutely
> meant an anonymous 'struct'. A named struct as you show below is
> even better
> 
>> /* 
>>
>>  * For adapter based pools, info on the relevant adapter 
>>
>>  */
>> typedef struct _virStoragePoolSourceAdapter virStoragePoolSourceAdapter;
>> typedef virStoragePoolSourceAdapter *virStoragePoolSourceAdapterPtr;
>> struct _virStoragePoolSourceAdapter {
>>     char *name;
>>     char *wwpn;
>>     char *wwnn;
>> };
>>
>> Since we might be creating a virtual adapter on a physical adapter that 
>> we specify by wwpn/wwnn, we'll need two places to specify wwpn/wwnn in 
>> the XML.  I propose:
> 
> Hmm, yes, this is what made me think originally that the storage pool
> may not be the right place to put the creation/deletion of the vport.
> 
> Working through the steps for using NPIV in our APIs...
> 
>  - list of HBAs == virNodeListDevices() with  cap='scsi_host'
> 
>  - For each HBA
>     - Query XML of the  virNodeDevicePtr object
>     - Look for 'vport' capability flag
> 
> You now have an virNodeDevicePtr object which you  know is able to
> create/delete vports, lets say its name is 'host3'.
> 
>  - Define config for a new vport, giving <parent> as the name of
>    virNodeDevicePtr we just obtained
> 
>        <device>
>          <parent>host3</parent>
>          <capability type='scsi_host'>
>             <capability type='fc'>
>               <wwpn>88889999aaaabbbb</wwpn>
>               <wwnn>4444555566667777</wwnn>
>             </capability>
>          </capability>
>        </device>
> 
>  - Create the device with  virNodeDeviceCreate(char *xml);
> 
>  - Use the device by defining a SCSI storage pool using the
>    <host></host> property of the device we just created
> 
> This keeps the notion of hierarchy / parent+child relationship between
> HBAs just witin the node device APIs, and avoids replicating it in the
> storage APIs.

The above generally sounds like a good idea to me.  I am in the process 
of working out the specifics, but it's a much cleaner fit than trying to 
make this functionality go into pools.

> I still think it would be worth adding a 'wwpn' and 'wwnn' to the
> SCSI storage pool XML config - to be used as an alternative to the
> 'host' parameter, since wwpn+wwnn are guarenteed stable across
> machines, whereas 'host' is only unique within scope of a single
> machine and even changes across boot.

That sounds good; a user can create the adapter with the device API and 
then be able to find the associated pool easily via wwpn/wwnn.

> This does of course mean swe need to add new virNodeDeviceCreate
> and virNodeDeviceDestroy  APIs, but I think it is worth doing that
> and they can be useful for other areas too. For example, it would 
> allow us to have a means to create loopback devices, or create 
> NBD devices (via qemu-nbd), which are useful things todo if you
> want to get into the innards of file based disks

Agreed.

>> <pool type="scsi">
>>   <name>npiv</name>
>>   <source>
>>     <adapter name="host6" wwpn="0000111122223333" wwnn="4444555566667777"/>
>>     <vport wwpn="88889999aaaabbbb" wwnn="ccccddddeeeeffff"/>
> 
> So, we'd keep the <adapter> line as you show, but would
> not need the <vport> line, because the <adater> line would
> refer to the wwpn/wwn/host of the vport itself

That works for me.

>>   </source>
>>   <target>
>>     <path>/dev/disk/by-id</path>
>>   </target>
>> </pool>

Dave




More information about the libvir-list mailing list