virNodeDeviceObjListRemove(virNodeDeviceObjListPtr devs,
virNodeDeviceObjPtr obj)
{
- virNodeDeviceDefPtr def;
-
if (!obj)
return;
- def = obj->def;
virObjectRef(obj);
virObjectUnlock(obj);
virObjectRWLockWrite(devs);
virObjectLock(obj);
- virHashRemoveEntry(devs->objs, def->name);
+ virNodeDeviceObjListRemoveLocked(devs, obj);
virObjectUnlock(obj);
virObjectUnref(obj);
virObjectRWUnlock(devs);
}
+/* The caller must hold lock on 'devs' */
+void
+virNodeDeviceObjListRemoveLocked(virNodeDeviceObjList *devs,
+ virNodeDeviceObj *dev)
+{
+ virHashRemoveEntry(devs->objs, dev->def->name);
+}
+
+
/*
* Return the NPIV dev's parent device name
*/
{
obj->persistent = persistent;
}
+
+
+struct virNodeDeviceObjListRemoveHelperData
+{
+ virNodeDeviceObjListRemoveIterator callback;
+ void *opaque;
+};
+
+static int virNodeDeviceObjListRemoveHelper(void *key G_GNUC_UNUSED,
+ void *value,
+ void *opaque)
+{
+ struct virNodeDeviceObjListRemoveHelperData *data = opaque;
+
+ return data->callback(value, data->opaque);
+}
+
+
+/**
+ * virNodeDeviceObjListForEachRemove
+ * @devs: Pointer to object list
+ * @callback: function to call for each device object
+ * @opaque: Opaque data to use as argument to helper
+ *
+ * For each object in @devs, call the @callback helper using @opaque as
+ * an argument. If @callback returns true, that item will be removed from the
+ * object list.
+ */
+void
+virNodeDeviceObjListForEachRemove(virNodeDeviceObjList *devs,
+ virNodeDeviceObjListRemoveIterator callback,
+ void *opaque)
+{
+ struct virNodeDeviceObjListRemoveHelperData data = {
+ .callback = callback,
+ .opaque = opaque
+ };
+
+ virObjectRWLockWrite(devs);
+ g_hash_table_foreach_remove(devs->objs,
+ virNodeDeviceObjListRemoveHelper,
+ &data);
+ virObjectRWUnlock(devs);
+}
virNodeDeviceObjListRemove(virNodeDeviceObjListPtr devs,
virNodeDeviceObjPtr dev);
+void
+virNodeDeviceObjListRemoveLocked(virNodeDeviceObjList *devs,
+ virNodeDeviceObj *dev);
+
int
virNodeDeviceObjListGetParentHost(virNodeDeviceObjListPtr devs,
virNodeDeviceDefPtr def);
void
virNodeDeviceObjSetPersistent(virNodeDeviceObj *obj,
bool persistent);
+
+typedef bool (*virNodeDeviceObjListRemoveIterator)(virNodeDeviceObj *obj,
+ const void *opaque);
+
+void virNodeDeviceObjListForEachRemove(virNodeDeviceObjList *devs,
+ virNodeDeviceObjListRemoveIterator callback,
+ void *opaque);
virNodeDeviceObjListFindBySysfsPath;
virNodeDeviceObjListFindMediatedDeviceByUUID;
virNodeDeviceObjListFindSCSIHostByWWNs;
+virNodeDeviceObjListForEachRemove;
virNodeDeviceObjListFree;
virNodeDeviceObjListGetNames;
virNodeDeviceObjListGetParentHost;
virNodeDeviceObjListNew;
virNodeDeviceObjListNumOfDevices;
virNodeDeviceObjListRemove;
+virNodeDeviceObjListRemoveLocked;
virNodeDeviceObjSetActive;
virNodeDeviceObjSetPersistent;