mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
udev-builtin-path_id: SAS wide ports must have num_phys > 1
Some kernel SAS drivers (e.g. smartpqi) expose ports with num_phys = 0. udev shouldn't treat these ports as wide ports. SAS wide ports always have num_phys > 1. See comments for sas_port_add_phy() in the kernel sources. Sample data from a smartpqi system to illustrate the issue below. Here the phy device is attached to port 0:0, which has no end devices attached and the SAS end device (where sda is attached) is associated with SAS port 0:1, which has no associated phy device. Thus num_phys for port-0:1 is 0. This is arguably wrong, but it's how smartpqi has always set up its devices in sysfs. /sys/class/sas_phy/phy-0:0 -> ../../devices/pci0000:46/0000:46:02.0/0000:47:00.0/host0/scsi_host/host0/phy-0:0/sas_phy/phy-0:0 /sys/devices/pci0000:46/0000:46:02.0/0000:47:00.0/host0/scsi_host/host0/port-0:0/phy-0:0 -> ../phy-0:0 /sys/devices/pci0000:46/0000:46:02.0/0000:47:00.0/host0/scsi_host/host0/phy-0:0/port -> ../port-0:0 /sys/class/sas_device/end_device-0:1 -> ../../devices/pci0000:46/0000:46:02.0/0000:47:00.0/host0/scsi_host/host0/port-0:1/end_device-0:1/sas_device/end_device-0:1 /sys/class/block/sda -> ../../devices/pci0000:46/0000:46:02.0/0000:47:00.0/host0/scsi_host/host0/port-0:1/end_device-0:1/target0:0:0/0:0:0:0/block/sda Signed-off-by: Martin Wilck <mwilck@suse.com> (cherry picked from commit 7f6674624eedc95db2a9877edc6ff424f4453531)
This commit is contained in:
parent
f7d52524a7
commit
852e38edd0
@ -15,6 +15,7 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "device-private.h"
|
||||
#include "device-util.h"
|
||||
#include "dirent-util.h"
|
||||
#include "fd-util.h"
|
||||
@ -159,7 +160,8 @@ static sd_device *handle_scsi_sas(sd_device *parent, char **path) {
|
||||
_cleanup_(sd_device_unrefp) sd_device *target_sasdev = NULL, *expander_sasdev = NULL, *port_sasdev = NULL;
|
||||
const char *sas_address = NULL;
|
||||
const char *phy_id;
|
||||
const char *phy_count, *sysname;
|
||||
const char *sysname;
|
||||
unsigned num_phys;
|
||||
_cleanup_free_ char *lun = NULL;
|
||||
|
||||
assert(parent);
|
||||
@ -182,11 +184,10 @@ static sd_device *handle_scsi_sas(sd_device *parent, char **path) {
|
||||
/* Get port device */
|
||||
if (sd_device_new_from_subsystem_sysname(&port_sasdev, "sas_port", sysname) < 0)
|
||||
return NULL;
|
||||
if (sd_device_get_sysattr_value(port_sasdev, "num_phys", &phy_count) < 0)
|
||||
if (device_get_sysattr_unsigned(port_sasdev, "num_phys", &num_phys) < 0)
|
||||
return NULL;
|
||||
|
||||
/* Check if we are simple disk */
|
||||
if (!streq(phy_count, "1"))
|
||||
/* Check if this is a wide port (i.e. num_phys is 2 or higher) */
|
||||
if (num_phys > 1)
|
||||
return handle_scsi_sas_wide_port(parent, path);
|
||||
|
||||
/* Get connected phy */
|
||||
|
Loading…
x
Reference in New Issue
Block a user