Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Alexander_Naumov:SLE12
systemd
1001-re-enable-by_path-links-for-ata-devices.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1001-re-enable-by_path-links-for-ata-devices.patch of Package systemd
From 5cf46aa4339670afac386b1b0e630b739f3621c7 Mon Sep 17 00:00:00 2001 From: Robert Milasan <rmilasan@suse.com> Date: Thu, 12 Jul 2012 15:56:34 +0000 Subject: [PATCH] Persistent by_path links for ata devices With newer kernel we have the 'port_no' attribute, which allows us to construct a valid ata by-path link. With this patch ATA links of the form ata-<port>.[01] (for master/slave devices) or ata-<port>.<pmp>.0 (for devices behind port multipliers) are generated. References: bnc#770910,FATE#317063 Signed-off-by: Robert Milasan <rmilasan@suse.com> Signed-off-by: Hannes Reinecke <hare@suse.de> --- src/udev/udev-builtin-path_id.c | 53 +++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c index 0599980..fbd3fda 100644 --- a/src/udev/udev-builtin-path_id.c +++ b/src/udev/udev-builtin-path_id.c @@ -339,6 +339,46 @@ static struct udev_device *handle_scsi_hyperv(struct udev_device *parent, char * return parent; } +static struct udev_device *handle_ata(struct udev_device *parent, char **path) +{ + struct udev *udev = udev_device_get_udev(parent); + struct udev_device *hostdev, *portdev; + int host, bus, target, lun, port_no; + const char *name, *atahost, *port; + + hostdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_host"); + if (hostdev == NULL) + return NULL; + + name = udev_device_get_sysname(parent); + if (sscanf(name, "%d:%d:%d:%d", &host, &bus, &target, &lun) != 4) + return NULL; + + /* The ata port is the parent of the SCSI host */ + hostdev = udev_device_get_parent(hostdev); + atahost = udev_device_get_sysname(hostdev); + if (strncmp(atahost, "ata", 3)) + return NULL; + + /* ATA port number is found in 'port_no' attribute */ + portdev = udev_device_new_from_subsystem_sysname(udev, "ata_port", + atahost); + port = udev_device_get_sysattr_value(portdev, "port_no"); + if (!port || sscanf(port, "%d", &port_no) != 1) { + hostdev = NULL; + goto out; + } + if (bus != 0) + /* Devices behind port multiplier have a bus != 0*/ + path_prepend(path, "ata-%u.%u.0", port_no, bus); + else + /* Master/slave are distinguished by target id */ + path_prepend(path, "ata-%u.%u", port_no, target); +out: + udev_device_unref(portdev); + return hostdev; +} + static struct udev_device *handle_scsi(struct udev_device *parent, char **path) { const char *devtype; @@ -375,19 +415,8 @@ static struct udev_device *handle_scsi(struct udev_device *parent, char **path) goto out; } - /* - * 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; + parent = handle_ata(parent, path); goto out; } -- 1.8.1.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor