X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudev-builtin-path_id.c;h=763f3c3113be024ec72c0d18011b09ca4b320be3;hb=5c11fbe3a75e8015f2c26736787d4279c091f091;hp=c2c9161c940f52310d34f9f72b908861f4c2e2a8;hpb=f274ece0f76b5709408821e317e87aef76123db6;p=elogind.git diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c index c2c9161c9..763f3c311 100644 --- a/src/udev/udev-builtin-path_id.c +++ b/src/udev/udev-builtin-path_id.c @@ -83,7 +83,7 @@ static struct udev_device *skip_subsystem(struct udev_device *dev, const char *s const char *subsystem; subsystem = udev_device_get_subsystem(parent); - if (subsystem == NULL || strcmp(subsystem, subsys) != 0) + if (subsystem == NULL || !streq(subsystem, subsys)) break; dev = parent; parent = udev_device_get_parent(parent); @@ -345,7 +345,7 @@ static struct udev_device *handle_scsi(struct udev_device *parent, char **path) const char *id; devtype = udev_device_get_devtype(parent); - if (devtype == NULL || strcmp(devtype, "scsi_device") != 0) + if (devtype == NULL || !streq(devtype, "scsi_device")) return parent; /* firewire */ @@ -356,7 +356,7 @@ static struct udev_device *handle_scsi(struct udev_device *parent, char **path) goto out; } - /* lousy scsi sysfs does not have a "subsystem" for the transport */ + /* scsi sysfs does not have a "subsystem" for the transport */ name = udev_device_get_syspath(parent); if (strstr(name, "/rport-") != NULL) { @@ -375,12 +375,15 @@ static struct udev_device *handle_scsi(struct udev_device *parent, char **path) } /* - * We do not support the ATA transport class, it creates duplicated link - * names as the fake SCSI host adapters are all separated, they are all - * re-based as host == 0. ATA should just stop faking two duplicated - * hierarchies for a single topology and leave the SCSI stuff alone; - * until that happens, there are no by-path/ links for ATA devices behind - * an ATA transport class. + * We do not support the ATA transport class, it uses global counters + * to name the ata devices which numbers spread across multiple + * controllers. + * + * The real link numbers are not exported. Also, possible chains of ports + * behind port multipliers cannot be composed that way. + * + * Until all that is solved at the kernel level, there are no by-path/ + * links for ATA devices. */ if (strstr(name, "/ata") != NULL) { parent = NULL; @@ -435,7 +438,7 @@ static struct udev_device *handle_usb(struct udev_device *parent, char **path) devtype = udev_device_get_devtype(parent); if (devtype == NULL) return parent; - if (strcmp(devtype, "usb_interface") != 0 && strcmp(devtype, "usb_device") != 0) + if (!streq(devtype, "usb_interface") && !streq(devtype, "usb_device")) return parent; str = udev_device_get_sysname(parent); @@ -449,6 +452,19 @@ static struct udev_device *handle_usb(struct udev_device *parent, char **path) return parent; } +static struct udev_device *handle_bcma(struct udev_device *parent, char **path) +{ + const char *sysname; + unsigned int core; + + sysname = udev_device_get_sysname(parent); + if (sscanf(sysname, "bcma%*u:%u", &core) != 1) + return NULL; + + path_prepend(path, "bcma-%u", core); + return parent; +} + static struct udev_device *handle_ccw(struct udev_device *parent, struct udev_device *dev, char **path) { struct udev_device *scsi_dev; @@ -495,39 +511,43 @@ static int builtin_path_id(struct udev_device *dev, int argc, char *argv[], bool subsys = udev_device_get_subsystem(parent); if (subsys == NULL) { ; - } else if (strcmp(subsys, "scsi_tape") == 0) { + } else if (streq(subsys, "scsi_tape")) { handle_scsi_tape(parent, &path); - } else if (strcmp(subsys, "scsi") == 0) { + } else if (streq(subsys, "scsi")) { parent = handle_scsi(parent, &path); some_transport = true; - } else if (strcmp(subsys, "cciss") == 0) { + } else if (streq(subsys, "cciss")) { parent = handle_cciss(parent, &path); some_transport = true; - } else if (strcmp(subsys, "usb") == 0) { + } else if (streq(subsys, "usb")) { parent = handle_usb(parent, &path); some_transport = true; - } else if (strcmp(subsys, "serio") == 0) { + } else if (streq(subsys, "bcma")) { + parent = handle_bcma(parent, &path); + some_transport = true; + } else if (streq(subsys, "serio")) { path_prepend(&path, "serio-%s", udev_device_get_sysnum(parent)); parent = skip_subsystem(parent, "serio"); - } else if (strcmp(subsys, "pci") == 0) { + } else if (streq(subsys, "pci")) { path_prepend(&path, "pci-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "pci"); - } else if (strcmp(subsys, "platform") == 0) { + } else if (streq(subsys, "platform")) { path_prepend(&path, "platform-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "platform"); some_transport = true; - } else if (strcmp(subsys, "acpi") == 0) { + } else if (streq(subsys, "acpi")) { path_prepend(&path, "acpi-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "acpi"); - } else if (strcmp(subsys, "xen") == 0) { + } else if (streq(subsys, "xen")) { path_prepend(&path, "xen-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "xen"); - } else if (strcmp(subsys, "virtio") == 0) { + } else if (streq(subsys, "virtio")) { path_prepend(&path, "virtio-pci-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "virtio"); - } else if (strcmp(subsys, "scm") == 0) { + } else if (streq(subsys, "scm")) { path_prepend(&path, "scm-%s", udev_device_get_sysname(parent)); parent = skip_subsystem(parent, "scm"); + some_transport = true; } parent = udev_device_get_parent(parent);