On 06/03/2010 12:04 AM, David Allan wrote:
* It appears that the udev event for HBA creation arrives before the
associated sysfs data is fully populated, resulting in bogus data
for the nodedev entry until the entry is refreshed. This problem is
particularly troublesome when creating NPIV vHBAs because it results
in libvirt failing to find the newly created adapter and waiting for
the full timeout period before erroneously failing the create
operation. This patch forces an update before any attempt to use
any scsi_host nodedev entry.
---
src/node_device/node_device_driver.c | 19 +++----------------
1 files changed, 3 insertions(+), 16 deletions(-)
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index 8fb062c..f7e2f69 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -45,23 +45,9 @@ static int update_caps(virNodeDeviceObjPtr dev)
virNodeDevCapsDefPtr cap = dev->def->caps;
while (cap) {
- /* The only cap that currently needs updating is the WWN of FC HBAs. */
+ /* The only caps that currently need updating are FC related. */
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST) {
- if (cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
- if (read_wwn(cap->data.scsi_host.host,
- "port_name",
- &cap->data.scsi_host.wwpn) == -1) {
- VIR_ERROR(_("Failed to refresh WWPN for host%d"),
- cap->data.scsi_host.host);
- }
-
- if (read_wwn(cap->data.scsi_host.host,
- "node_name",
- &cap->data.scsi_host.wwnn) == -1) {
- VIR_ERROR(_("Failed to refresh WWNN for host%d"),
- cap->data.scsi_host.host);
- }
- }
+ check_fc_host(&dev->def->caps->data);
}
cap = cap->next;
}
@@ -239,6 +225,7 @@ nodeDeviceLookupByWWN(virConnectPtr conn,
while (cap) {
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST) {
+ check_fc_host(&cap->data);
if (cap->data.scsi_host.flags &
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
ACK
- Cole