/* device/<typename>/<name> */ static int xenbus_probe_frontend(const char *type, const char *name) { char *nodename; int err; nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", xenbus_frontend.root, type, name); if (!nodename) return -ENOMEM; DPRINTK("%s", nodename); err = xenbus_probe_node(&xenbus_frontend, type, nodename); kfree(nodename); return err; }
/* device/<typename>/<name> */ static int xenbus_probe_frontend(struct xen_bus_type *bus, const char *type, const char *name) { char *nodename; int err; nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", bus->root, type, name); if (!nodename) return -ENOMEM; DPRINTK("%s", nodename); err = xenbus_probe_node(bus, type, nodename); kfree(nodename); return err; }
/* backend/<typename>/<frontend-uuid>/<name> */ static int xenbus_probe_backend_unit(const char *dir, const char *type, const char *name) { char *nodename; int err; nodename = kasprintf(GFP_KERNEL, "%s/%s", dir, name); if (!nodename) return -ENOMEM; DPRINTK("%s\n", nodename); err = xenbus_probe_node(&xenbus_backend, type, nodename); kfree(nodename); return err; }
/* device/<typename>/<name> */ static int xenbus_probe_frontend(struct xen_bus_type *bus, const char *type, const char *name) { char *nodename; int err; /* ignore console/0 */ if (!strncmp(type, "console", 7) && !strncmp(name, "0", 1)) { DPRINTK("Ignoring buggy device entry console/0"); return 0; } nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", bus->root, type, name); if (!nodename) return -ENOMEM; DPRINTK("%s", nodename); err = xenbus_probe_node(bus, type, nodename); kfree(nodename); return err; }
void xenbus_dev_changed(const char *node, struct xen_bus_type *bus) { int exists, rootlen; struct xenbus_device *dev; char type[XEN_BUS_ID_SIZE]; const char *p, *root; if (char_count(node, '/') < 2) return; exists = xenbus_exists(XBT_NIL, node, ""); if (!exists) { xenbus_cleanup_devices(node, &bus->bus); return; } /* backend/<type>/... or device/<type>/... */ p = strchr(node, '/') + 1; snprintf(type, XEN_BUS_ID_SIZE, "%.*s", (int)strcspn(p, "/"), p); type[XEN_BUS_ID_SIZE-1] = '\0'; rootlen = strsep_len(node, '/', bus->levels); if (rootlen < 0) return; root = kasprintf(GFP_KERNEL, "%.*s", rootlen, node); if (!root) return; dev = xenbus_device_find(root, &bus->bus); if (!dev) xenbus_probe_node(bus, type, root); else put_device(&dev->dev); kfree(root); }