]> xenbits.xensource.com Git - libvirt.git/commitdiff
nodedev: Move the sysfs-related cap handling to node_device_conf.c
authorErik Skultety <eskultet@redhat.com>
Fri, 12 Jan 2018 12:14:26 +0000 (13:14 +0100)
committerErik Skultety <eskultet@redhat.com>
Mon, 29 Jan 2018 14:34:30 +0000 (15:34 +0100)
The capabilities are defined/parsed/formatted/queried from this module,
no reason for 'update' not being part of the module as well. This also
involves some module-specific prefix changes.
This patch also drops the node_device_linux_sysfs module from the repo
since:
a) it only contained the capability handlers we just moved
b) it's only linked with the driver (by design) and thus unreachable to
other modules
c) we touch sysfs across all the src/util modules so the module being
deleted hasn't been serving its original intention for some time already.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
src/Makefile.am
src/conf/node_device_conf.c
src/conf/node_device_conf.h
src/libvirt_private.syms
src/node_device/node_device_driver.c
src/node_device/node_device_hal.c
src/node_device/node_device_linux_sysfs.c [deleted file]
src/node_device/node_device_linux_sysfs.h [deleted file]
src/node_device/node_device_udev.c

index 289b037472127d40b8726b5a6715ba53d3d293bc..b0ddfdfb750613ee49c191fc5c14e46520ab65fd 100644 (file)
@@ -1168,9 +1168,7 @@ ACCESS_DRIVER_POLKIT_POLICY = \
 
 NODE_DEVICE_DRIVER_SOURCES = \
                node_device/node_device_driver.c \
-               node_device/node_device_driver.h \
-               node_device/node_device_linux_sysfs.c \
-               node_device/node_device_linux_sysfs.h
+               node_device/node_device_driver.h
 
 NODE_DEVICE_DRIVER_HAL_SOURCES = \
                node_device/node_device_hal.c \
index a72a742bc84f0ea6634fae4442da0fe1b5003d79..d3c3618281c18452d304e95a4c898ae5ea6f5db7 100644 (file)
 #include "virstring.h"
 #include "node_device_conf.h"
 #include "device_conf.h"
+#include "dirname.h"
 #include "virxml.h"
 #include "virbuffer.h"
 #include "viruuid.h"
 #include "virrandom.h"
 #include "virlog.h"
+#include "virfcp.h"
 
 #define VIR_FROM_THIS VIR_FROM_NODEDEV
 
@@ -2514,10 +2516,160 @@ virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr scsi_host)
     return ret;
 }
 
+
+int
+virNodeDeviceGetSCSITargetCaps(const char *sysfsPath,
+                               virNodeDevCapSCSITargetPtr scsi_target)
+{
+    int ret = -1;
+    char *dir = NULL, *rport = NULL;
+
+    VIR_DEBUG("Checking if '%s' is an FC remote port", scsi_target->name);
+
+    /* /sys/devices/[...]/host0/rport-0:0-0/target0:0:0 -> rport-0:0-0 */
+    if (!(dir = mdir_name(sysfsPath)))
+        return -1;
+
+    if (VIR_STRDUP(rport, last_component(dir)) < 0)
+        goto cleanup;
+
+    if (!virFCIsCapableRport(rport))
+        goto cleanup;
+
+    VIR_FREE(scsi_target->rport);
+    VIR_STEAL_PTR(scsi_target->rport, rport);
+
+    if (virFCReadRportValue(scsi_target->rport, "port_name",
+                            &scsi_target->wwpn) < 0) {
+        VIR_WARN("Failed to read port_name for '%s'", scsi_target->rport);
+        goto cleanup;
+    }
+
+    scsi_target->flags |= VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
+    ret = 0;
+
+ cleanup:
+    if (ret < 0) {
+        VIR_FREE(scsi_target->rport);
+        VIR_FREE(scsi_target->wwpn);
+        scsi_target->flags &= ~VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
+    }
+    VIR_FREE(rport);
+    VIR_FREE(dir);
+
+    return ret;
+}
+
+
+static int
+virNodeDeviceGetPCISRIOVCaps(const char *sysfsPath,
+                             virNodeDevCapPCIDevPtr pci_dev)
+{
+    size_t i;
+    int ret;
+
+    /* this could be a refresh, so clear out the old data */
+    for (i = 0; i < pci_dev->num_virtual_functions; i++)
+       VIR_FREE(pci_dev->virtual_functions[i]);
+    VIR_FREE(pci_dev->virtual_functions);
+    pci_dev->num_virtual_functions = 0;
+    pci_dev->max_virtual_functions = 0;
+    pci_dev->flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
+    pci_dev->flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
+
+    ret = virPCIGetPhysicalFunction(sysfsPath,
+                                    &pci_dev->physical_function);
+    if (ret < 0)
+        goto cleanup;
+
+    if (pci_dev->physical_function)
+        pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
+
+    ret = virPCIGetVirtualFunctions(sysfsPath, &pci_dev->virtual_functions,
+                                    &pci_dev->num_virtual_functions,
+                                    &pci_dev->max_virtual_functions);
+    if (ret < 0)
+        goto cleanup;
+
+    if (pci_dev->num_virtual_functions > 0 ||
+        pci_dev->max_virtual_functions > 0)
+        pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
+
+ cleanup:
+    return ret;
+}
+
+
+static int
+virNodeDeviceGetPCIIOMMUGroupCaps(virNodeDevCapPCIDevPtr pci_dev)
+{
+    size_t i;
+    int tmpGroup, ret = -1;
+    virPCIDeviceAddress addr;
+
+    /* this could be a refresh, so clear out the old data */
+    for (i = 0; i < pci_dev->nIommuGroupDevices; i++)
+       VIR_FREE(pci_dev->iommuGroupDevices[i]);
+    VIR_FREE(pci_dev->iommuGroupDevices);
+    pci_dev->nIommuGroupDevices = 0;
+    pci_dev->iommuGroupNumber = 0;
+
+    addr.domain = pci_dev->domain;
+    addr.bus = pci_dev->bus;
+    addr.slot = pci_dev->slot;
+    addr.function = pci_dev->function;
+    tmpGroup = virPCIDeviceAddressGetIOMMUGroupNum(&addr);
+    if (tmpGroup == -1) {
+        /* error was already reported */
+        goto cleanup;
+    }
+    if (tmpGroup == -2) {
+        /* -2 return means there is no iommu_group data */
+        ret = 0;
+        goto cleanup;
+    }
+    if (tmpGroup >= 0) {
+        if (virPCIDeviceAddressGetIOMMUGroupAddresses(&addr, &pci_dev->iommuGroupDevices,
+                                                      &pci_dev->nIommuGroupDevices) < 0)
+            goto cleanup;
+        pci_dev->iommuGroupNumber = tmpGroup;
+    }
+
+    ret = 0;
+ cleanup:
+    return ret;
+}
+
+
+/* virNodeDeviceGetPCIDynamicCaps() get info that is stored in sysfs
+ * about devices related to this device, i.e. things that can change
+ * without this device itself changing. These must be refreshed
+ * anytime full XML of the device is requested, because they can
+ * change with no corresponding notification from the kernel/udev.
+ */
+int
+virNodeDeviceGetPCIDynamicCaps(const char *sysfsPath,
+                               virNodeDevCapPCIDevPtr pci_dev)
+{
+    if (virNodeDeviceGetPCISRIOVCaps(sysfsPath, pci_dev) < 0)
+        return -1;
+    if (virNodeDeviceGetPCIIOMMUGroupCaps(pci_dev) < 0)
+        return -1;
+    return 0;
+}
+
 #else
 
 int
-virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr scsi_host ATTRIBUTE_UNUSED)
+virNodeDeviceGetPCIDynamicCaps(const char *sysfsPath ATTRIBUTE_UNUSED,
+                               virNodeDevCapPCIDevPtr pci_dev ATTRIBUTE_UNUSED)
+{
+    return -1;
+}
+
+
+int virNodeDeviceGetSCSITargetCaps(const char *sysfsPath ATTRIBUTE_UNUSED,
+                                   virNodeDevCapSCSITargetPtr scsi_target ATTRIBUTE_UNUSED)
 {
     return -1;
 }
index cf79773aa032327b9a0e2224d3c636b010bf4832..4e3154875e5c9b13b3efec19eaf085ae45e6eef1 100644 (file)
@@ -393,4 +393,11 @@ virNodeDeviceDeleteVport(virConnectPtr conn,
 int
 virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr scsi_host);
 
+int
+virNodeDeviceGetSCSITargetCaps(const char *sysfsPath,
+                               virNodeDevCapSCSITargetPtr scsi_target);
+
+int
+virNodeDeviceGetPCIDynamicCaps(const char *sysfsPath,
+                               virNodeDevCapPCIDevPtr pci_dev);
 #endif /* __VIR_NODE_DEVICE_CONF_H__ */
index f2a2c8650d975a13b1abd91ae23885f426c4745d..1467796d4b70c5e7d7d65fbb6520d4849648eacd 100644 (file)
@@ -707,7 +707,9 @@ virNodeDeviceDefParseNode;
 virNodeDeviceDefParseString;
 virNodeDeviceDeleteVport;
 virNodeDeviceGetParentName;
+virNodeDeviceGetPCIDynamicCaps;
 virNodeDeviceGetSCSIHostCaps;
+virNodeDeviceGetSCSITargetCaps;
 virNodeDeviceGetWWNs;
 
 
index a2f687942fa1de3266ed4f03323581bbbd1d520c..2e42d35274e944ce7a485927cc992a02422a95a8 100644 (file)
@@ -38,7 +38,6 @@
 #include "node_device_event.h"
 #include "node_device_driver.h"
 #include "node_device_hal.h"
-#include "node_device_linux_sysfs.h"
 #include "virvhba.h"
 #include "viraccessapicheck.h"
 #include "virnetdev.h"
@@ -59,7 +58,7 @@ nodeDeviceUpdateCaps(virNodeDeviceDefPtr def)
             virNodeDeviceGetSCSIHostCaps(&cap->data.scsi_host);
             break;
         case VIR_NODE_DEV_CAP_SCSI_TARGET:
-            nodeDeviceSysfsGetSCSITargetCaps(def->sysfs_path,
+            virNodeDeviceGetSCSITargetCaps(def->sysfs_path,
                                              &cap->data.scsi_target);
             break;
         case VIR_NODE_DEV_CAP_NET:
@@ -70,8 +69,8 @@ nodeDeviceUpdateCaps(virNodeDeviceDefPtr def)
                 return -1;
             break;
         case VIR_NODE_DEV_CAP_PCI_DEV:
-           if (nodeDeviceSysfsGetPCIRelatedDevCaps(def->sysfs_path,
-                                                   &cap->data.pci_dev) < 0)
+            if (virNodeDeviceGetPCIDynamicCaps(def->sysfs_path,
+                                               &cap->data.pci_dev) < 0)
               return -1;
            break;
 
index 9fac5780e7a56d045fd36e93beae5db1b15f2fdd..26fcd7918c4a39e08f7d7a891f5e64596b9b61a3 100644 (file)
@@ -31,7 +31,6 @@
 #include "node_device_conf.h"
 #include "node_device_driver.h"
 #include "node_device_hal.h"
-#include "node_device_linux_sysfs.h"
 #include "virerror.h"
 #include "driver.h"
 #include "datatypes.h"
diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c
deleted file mode 100644 (file)
index b3f80a5..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * node_device_linux_sysfs.c: Linux specific code to gather device data
- * that is available from sysfs (but not from UDEV or HAL).
- *
- * Copyright (C) 2009-2015 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <config.h>
-
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <stdlib.h>
-
-#include "dirname.h"
-#include "node_device_driver.h"
-#include "node_device_hal.h"
-#include "node_device_linux_sysfs.h"
-#include "virerror.h"
-#include "viralloc.h"
-#include "virfcp.h"
-#include "virlog.h"
-#include "virfile.h"
-#include "virscsihost.h"
-#include "virstring.h"
-#include "virvhba.h"
-
-#define VIR_FROM_THIS VIR_FROM_NODEDEV
-
-#ifdef __linux__
-
-VIR_LOG_INIT("node_device.node_device_linux_sysfs");
-
-
-int
-nodeDeviceSysfsGetSCSITargetCaps(const char *sysfsPath,
-                                 virNodeDevCapSCSITargetPtr scsi_target)
-{
-    int ret = -1;
-    char *dir = NULL, *rport = NULL;
-
-    VIR_DEBUG("Checking if '%s' is an FC remote port", scsi_target->name);
-
-    /* /sys/devices/[...]/host0/rport-0:0-0/target0:0:0 -> rport-0:0-0 */
-    if (!(dir = mdir_name(sysfsPath)))
-        return -1;
-
-    if (VIR_STRDUP(rport, last_component(dir)) < 0)
-        goto cleanup;
-
-    if (!virFCIsCapableRport(rport))
-        goto cleanup;
-
-    VIR_FREE(scsi_target->rport);
-    VIR_STEAL_PTR(scsi_target->rport, rport);
-
-    if (virFCReadRportValue(scsi_target->rport, "port_name",
-                            &scsi_target->wwpn) < 0) {
-        VIR_WARN("Failed to read port_name for '%s'", scsi_target->rport);
-        goto cleanup;
-    }
-
-    scsi_target->flags |= VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
-    ret = 0;
-
- cleanup:
-    if (ret < 0) {
-        VIR_FREE(scsi_target->rport);
-        VIR_FREE(scsi_target->wwpn);
-        scsi_target->flags &= ~VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
-    }
-    VIR_FREE(rport);
-    VIR_FREE(dir);
-
-    return ret;
-}
-
-
-static int
-nodeDeviceSysfsGetPCISRIOVCaps(const char *sysfsPath,
-                               virNodeDevCapPCIDevPtr pci_dev)
-{
-    size_t i;
-    int ret;
-
-    /* this could be a refresh, so clear out the old data */
-    for (i = 0; i < pci_dev->num_virtual_functions; i++)
-       VIR_FREE(pci_dev->virtual_functions[i]);
-    VIR_FREE(pci_dev->virtual_functions);
-    pci_dev->num_virtual_functions = 0;
-    pci_dev->max_virtual_functions = 0;
-    pci_dev->flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
-    pci_dev->flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
-
-    ret = virPCIGetPhysicalFunction(sysfsPath,
-                                    &pci_dev->physical_function);
-    if (ret < 0)
-        goto cleanup;
-
-    if (pci_dev->physical_function)
-        pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
-
-    ret = virPCIGetVirtualFunctions(sysfsPath, &pci_dev->virtual_functions,
-                                    &pci_dev->num_virtual_functions,
-                                    &pci_dev->max_virtual_functions);
-    if (ret < 0)
-        goto cleanup;
-
-    if (pci_dev->num_virtual_functions > 0 ||
-        pci_dev->max_virtual_functions > 0)
-        pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
-
- cleanup:
-    return ret;
-}
-
-
-static int
-nodeDeviceSysfsGetPCIIOMMUGroupCaps(virNodeDevCapPCIDevPtr pci_dev)
-{
-    size_t i;
-    int tmpGroup, ret = -1;
-    virPCIDeviceAddress addr;
-
-    /* this could be a refresh, so clear out the old data */
-    for (i = 0; i < pci_dev->nIommuGroupDevices; i++)
-       VIR_FREE(pci_dev->iommuGroupDevices[i]);
-    VIR_FREE(pci_dev->iommuGroupDevices);
-    pci_dev->nIommuGroupDevices = 0;
-    pci_dev->iommuGroupNumber = 0;
-
-    addr.domain = pci_dev->domain;
-    addr.bus = pci_dev->bus;
-    addr.slot = pci_dev->slot;
-    addr.function = pci_dev->function;
-    tmpGroup = virPCIDeviceAddressGetIOMMUGroupNum(&addr);
-    if (tmpGroup == -1) {
-        /* error was already reported */
-        goto cleanup;
-    }
-    if (tmpGroup == -2) {
-        /* -2 return means there is no iommu_group data */
-        ret = 0;
-        goto cleanup;
-    }
-    if (tmpGroup >= 0) {
-        if (virPCIDeviceAddressGetIOMMUGroupAddresses(&addr, &pci_dev->iommuGroupDevices,
-                                                      &pci_dev->nIommuGroupDevices) < 0)
-            goto cleanup;
-        pci_dev->iommuGroupNumber = tmpGroup;
-    }
-
-    ret = 0;
- cleanup:
-    return ret;
-}
-
-
-/* nodeDeviceSysfsGetPCIRelatedCaps() get info that is stored in sysfs
- * about devices related to this device, i.e. things that can change
- * without this device itself changing. These must be refreshed
- * anytime full XML of the device is requested, because they can
- * change with no corresponding notification from the kernel/udev.
- */
-int
-nodeDeviceSysfsGetPCIRelatedDevCaps(const char *sysfsPath,
-                                    virNodeDevCapPCIDevPtr pci_dev)
-{
-    if (nodeDeviceSysfsGetPCISRIOVCaps(sysfsPath, pci_dev) < 0)
-        return -1;
-    if (nodeDeviceSysfsGetPCIIOMMUGroupCaps(pci_dev) < 0)
-        return -1;
-    return 0;
-}
-
-
-#else
-
-int nodeDeviceSysfsGetSCSITargetCaps(const char *sysfsPath ATTRIBUTE_UNUSED,
-                                     virNodeDevCapSCSITargetPtr scsi_target ATTRIBUTE_UNUSED)
-{
-    return -1;
-}
-
-int
-nodeDeviceSysfsGetPCIRelatedDevCaps(const char *sysfsPath ATTRIBUTE_UNUSED,
-                                    virNodeDevCapPCIDevPtr pci_dev ATTRIBUTE_UNUSED)
-{
-    return -1;
-}
-
-#endif /* __linux__ */
diff --git a/src/node_device/node_device_linux_sysfs.h b/src/node_device/node_device_linux_sysfs.h
deleted file mode 100644 (file)
index 9392d69..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * node_device_linux_sysfs.h: Linux specific code to gather device data
- * that is available from sysfs (but not from UDEV or HAL).
- *
- * Copyright (C) 2015 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __VIR_NODE_DEVICE_LINUX_SYSFS_H__
-# define __VIR_NODE_DEVICE_LINUX_SYSFS_H__
-
-# include "node_device_conf.h"
-
-int nodeDeviceSysfsGetSCSITargetCaps(const char *sysfsPath,
-                                     virNodeDevCapSCSITargetPtr scsi_target);
-int nodeDeviceSysfsGetPCIRelatedDevCaps(const char *sysfsPath,
-                                        virNodeDevCapPCIDevPtr pci_dev);
-
-#endif /* __VIR_NODE_DEVICE_LINUX_SYSFS_H__ */
index 4cc531d2c13cb54e5ed592ce7afb99e32021d28b..519b0bf6fa2ae137fedb350ea487e0cf22254ea8 100644 (file)
@@ -30,7 +30,6 @@
 #include "node_device_conf.h"
 #include "node_device_event.h"
 #include "node_device_driver.h"
-#include "node_device_linux_sysfs.h"
 #include "node_device_udev.h"
 #include "virerror.h"
 #include "driver.h"
@@ -558,7 +557,7 @@ udevProcessPCI(struct udev_device *device,
                             &pci_dev->numa_node, 10) < 0)
         goto cleanup;
 
-    if (nodeDeviceSysfsGetPCIRelatedDevCaps(def->sysfs_path, pci_dev) < 0)
+    if (virNodeDeviceGetPCIDynamicCaps(def->sysfs_path, pci_dev) < 0)
         goto cleanup;
 
     if (!(pciDev = virPCIDeviceNew(pci_dev->domain,
@@ -802,7 +801,7 @@ udevProcessSCSITarget(struct udev_device *device,
     if (VIR_STRDUP(scsi_target->name, sysname) < 0)
         return -1;
 
-    nodeDeviceSysfsGetSCSITargetCaps(def->sysfs_path, &def->caps->data.scsi_target);
+    virNodeDeviceGetSCSITargetCaps(def->sysfs_path, &def->caps->data.scsi_target);
 
     if (udevGenerateDeviceName(device, def, NULL) != 0)
         return -1;