[libvirt] [PATCH v13 04/49] add virhostdev files to maintain global state of host devices

Chunyan Liu cyliu at suse.com
Sat Mar 1 06:28:59 UTC 2014


Signed-off-by: Chunyan Liu <cyliu at suse.com>
---
 po/POTFILES.in           |    1 +
 src/Makefile.am          |    1 +
 src/libvirt_private.syms |    4 ++
 src/util/virhostdev.c    |  103 ++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virhostdev.h    |   44 +++++++++++++++++++
 5 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 src/util/virhostdev.c
 create mode 100644 src/util/virhostdev.h

diff --git a/po/POTFILES.in b/po/POTFILES.in
index c565771..bcc0ee0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -164,6 +164,7 @@ src/util/vireventpoll.c
 src/util/virfile.c
 src/util/virhash.c
 src/util/virhook.c
+src/util/virhostdev.c
 src/util/viridentity.c
 src/util/virinitctl.c
 src/util/viriptables.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 6ef32ee..25d0370 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -104,6 +104,7 @@ UTIL_SOURCES =							\
 		util/virhash.c util/virhash.h			\
 		util/virhashcode.c util/virhashcode.h		\
 		util/virhook.c util/virhook.h			\
+		util/virhostdev.c util/virhostdev.h		\
 		util/viridentity.c util/viridentity.h		\
 		util/virinitctl.c util/virinitctl.h		\
 		util/viriptables.c util/viriptables.h		\
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 3d8f2e3..bc048a1 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1291,6 +1291,10 @@ virHookInitialize;
 virHookPresent;
 
 
+#util/virhostdev.h
+virHostdevManagerGetDefault;
+
+
 # util/viridentity.h
 virIdentityGetAttr;
 virIdentityGetCurrent;
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
new file mode 100644
index 0000000..83124e9
--- /dev/null
+++ b/src/util/virhostdev.c
@@ -0,0 +1,103 @@
+/* virhostdev.c: hostdev management
+ *
+ * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ *
+ * 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/>.
+ *
+ * Author: Chunyan Liu <cyliu at suse.com>
+ */
+
+#include <config.h>
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "virhostdev.h"
+#include "viralloc.h"
+#include "virstring.h"
+#include "virfile.h"
+#include "virerror.h"
+#include "virlog.h"
+#include "virutil.h"
+#include "configmake.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+#define HOSTDEV_STATE_DIR LOCALSTATEDIR "/run/libvirt/hostdevmgr"
+
+static virHostdevManagerPtr hostdevMgr;
+
+static void
+virHostdevManagerCleanup(void)
+{
+    if (!hostdevMgr)
+        return;
+
+    virObjectUnref(hostdevMgr->activePciHostdevs);
+    virObjectUnref(hostdevMgr->inactivePciHostdevs);
+    virObjectUnref(hostdevMgr->activeUsbHostdevs);
+    VIR_FREE(hostdevMgr->stateDir);
+
+    VIR_FREE(hostdevMgr);
+}
+
+static int
+virHostdevOnceInit(void)
+{
+    if (VIR_ALLOC(hostdevMgr) < 0)
+        goto error;
+
+    if ((hostdevMgr->activePciHostdevs = virPCIDeviceListNew()) == NULL)
+        goto error;
+
+    if ((hostdevMgr->activeUsbHostdevs = virUSBDeviceListNew()) == NULL)
+        goto error;
+
+    if ((hostdevMgr->inactivePciHostdevs = virPCIDeviceListNew()) == NULL)
+        goto error;
+
+    if ((hostdevMgr->activeScsiHostdevs = virSCSIDeviceListNew()) == NULL)
+        goto error;
+
+    if (VIR_STRDUP(hostdevMgr->stateDir, HOSTDEV_STATE_DIR) < 0)
+        goto error;
+
+    if (virFileMakePath(hostdevMgr->stateDir) < 0) {
+        virReportError(VIR_ERR_OPERATION_FAILED,
+                       _("Failed to create state dir '%s'"),
+                       hostdevMgr->stateDir);
+        goto error;
+    }
+
+    return 0;
+
+error:
+    virHostdevManagerCleanup();
+    return -1;
+}
+
+VIR_ONCE_GLOBAL_INIT(virHostdev)
+
+virHostdevManagerPtr
+virHostdevManagerGetDefault(void)
+{
+    if (virHostdevInitialize() < 0)
+        return NULL;
+    return hostdevMgr;
+}
diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h
new file mode 100644
index 0000000..dba5e3e
--- /dev/null
+++ b/src/util/virhostdev.h
@@ -0,0 +1,44 @@
+/* virhostdev.h: hostdev management
+ *
+ * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ *
+ * 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/>.
+ *
+ * Author: Chunyan Liu <cyliu at suse.com>
+ */
+
+#ifndef __VIR_HOSTDEV_H__
+# define __VIR_HOSTDEV_H__
+
+# include "internal.h"
+
+# include "virpci.h"
+# include "virusb.h"
+# include "virscsi.h"
+
+typedef struct _virHostdevManager virHostdevManager;
+typedef virHostdevManager *virHostdevManagerPtr;
+struct _virHostdevManager{
+    char *stateDir;
+
+    virPCIDeviceListPtr activePciHostdevs;
+    virPCIDeviceListPtr inactivePciHostdevs;
+    virUSBDeviceListPtr activeUsbHostdevs;
+    virSCSIDeviceListPtr activeScsiHostdevs;
+};
+
+virHostdevManagerPtr virHostdevManagerGetDefault(void);
+
+#endif /* __VIR_HOSTDEV_H__ */
-- 
1.6.0.2




More information about the libvir-list mailing list