[libvirt] [PATCH 6/9] nodedev: Dump max vports and vports in use for HBA's XML

Osier Yang jyang at redhat.com
Tue Jan 15 01:12:19 UTC 2013


On 2013年01月15日 03:42, Michal Privoznik wrote:
> On 14.01.2013 15:34, Osier Yang wrote:
>> This enrichs HBA's xml by dumping the number of max vports and
>> vports in use. Format is like:
>>
>>    <capability type='vport_ops'>
>>      <max_vports>164</max_vports>
>>      <vports>5</vports>
>>    </capability>
>>
>> * docs/formatnode.html.in: (Document the new XML)
>> * docs/schemas/nodedev.rng: (Add the schema)
>> * src/conf/node_device_conf.h: (New member for data.scsi_host)
>> * src/node_device/node_device_linux_sysfs.c: (Collect the value of
>>    max_vports and vports)
>> ---
>>   docs/formatnode.html.in                   |   10 ++++--
>>   docs/schemas/nodedev.rng                  |    6 +++
>>   src/conf/node_device_conf.c               |    7 +++-
>>   src/conf/node_device_conf.h               |    2 +
>>   src/node_device/node_device_linux_sysfs.c |   48 ++++++++++++++++++++++++++--
>>   5 files changed, 65 insertions(+), 8 deletions(-)
>
>> diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c
>> index 054afea..b498726 100644
>> --- a/src/node_device/node_device_linux_sysfs.c
>> +++ b/src/node_device/node_device_linux_sysfs.c
>> @@ -40,6 +40,8 @@
>>   int
>>   detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>>   {
>> +    char *max_vports = NULL;
>> +    char *vports = NULL;
>>       int ret = -1;
>>
>>       VIR_DEBUG("Checking if host%d is an FC HBA", d->scsi_host.host);
>> @@ -50,7 +52,7 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>>           if (virReadFCHost(NULL,
>>                             d->scsi_host.host,
>>                             "port_name",
>> -&d->scsi_host.wwpn) == -1) {
>> +&d->scsi_host.wwpn)<  0) {
>>               VIR_ERROR(_("Failed to read WWPN for host%d"), d->scsi_host.host);
>>               goto cleanup;
>>           }
>> @@ -58,7 +60,7 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>>           if (virReadFCHost(NULL,
>>                             d->scsi_host.host,
>>                             "node_name",
>> -&d->scsi_host.wwnn) == -1) {
>> +&d->scsi_host.wwnn)<  0) {
>>               VIR_ERROR(_("Failed to read WWNN for host%d"), d->scsi_host.host);
>>               goto cleanup;
>>           }
>> @@ -66,23 +68,61 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>>           if (virReadFCHost(NULL,
>>                             d->scsi_host.host,
>>                             "fabric_name",
>> -&d->scsi_host.fabric_wwn) == -1) {
>> +&d->scsi_host.fabric_wwn)<  0) {
>>               VIR_ERROR(_("Failed to read fabric WWN for host%d"),
>>                         d->scsi_host.host);
>>               goto cleanup;
>>           }
>>       }
>>
>> -    if (virIsCapableVport(NULL, d->scsi_host.host) == 0)
>> +    if (virIsCapableVport(NULL, d->scsi_host.host) == 0) {
>>           d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS;
>>
>> +        if (virReadFCHost(NULL,
>> +                          d->scsi_host.max_vports,
>> +                          "max_npiv_vports",
>> +&max_vports)<  0) {
>> +            VIR_ERROR(_("Failed to read max_npiv_vports for host%d"),
>> +                      d->scsi_host.host);
>> +            goto cleanup;
>> +        }
>> +
>> +         if (virReadFCHost(NULL,
>> +                          d->scsi_host.max_vports,
>> +                          "npiv_vports_inuse",
>> +&vports)<  0) {
>> +            VIR_ERROR(_("Failed to read npiv_vports_inuse for host%d"),
>> +                      d->scsi_host.host);
>> +            goto cleanup;
>> +        }
>> +
>> +        if (virStrToLong_i(max_vports, NULL, 10,
>> +&d->scsi_host.max_vports)<  0) {
>> +            VIR_ERROR(_("Failed to parse value of max_npiv_vports '%s'"),
>> +                      max_vports);
>> +            goto cleanup;
>> +        }
>> +
>> +        if (virStrToLong_i(vports, NULL, 10,
>> +&d->scsi_host.vports)<  0) {
>> +            VIR_ERROR(_("Failed to parse value of npiv_vports_inuse '%s'"),
>> +                      vports);
>> +            goto cleanup;
>> +        }
>> +    }
>> +
>>       ret = 0;
>>   cleanup:
>>       if (ret == -1) {
>
> And again. I'd rewrite this condition as well. But you don't have to.
>
>> +        /* Clear the flags in case of producing confusing XML output */
>> +        d->scsi_host.flags = 0;
>
> I don't think so. Shouldn't we be just clearing those two flags and
> don't touch the others?

Agreed. Though there are only the two flags. I will post a v2.

>
>> +
>>           VIR_FREE(d->scsi_host.wwnn);
>>           VIR_FREE(d->scsi_host.wwpn);
>>           VIR_FREE(d->scsi_host.fabric_wwn);
>>       }
>> +    VIR_FREE(max_vports);
>> +    VIR_FREE(vports);
>>       return ret;
>>   }
>>
>>
>
> Michal




More information about the libvir-list mailing list