[systemd-devel] [PATCH] udevd: SAS: use SAS addr + PHY id in by-path whenever possible.

Tom Gundersen teg at jklm.no
Mon Sep 22 07:58:27 PDT 2014


Hi Maurizio,

On Mon, Sep 22, 2014 at 11:48 AM, Maurizio Lombardi <mlombard at redhat.com> wrote:
> This patch changes the naming scheme for sas disks. The original names used
> disk's sas address and lun, the new scheme uses sas address of the
> nearest expander (if available) and a phy id of the used connection.
> If no expander is used, the phy id of hba phy is used.
> Note that names that refer to RAID or other abstract devices are
> unchanged.

What's the problem with the current scheme, what's the benefit of the
new one? Will this break backwards compatibility, if so, why is this
justifiable?

Cheers,

Tom

> Name in raid configuration:
> hba_pci_address-sas-raid_sas_address-lunY-partZ
>
> Name in expander bare disk configuration:
> hba_pci_address-sas-expander_sas_address-phyX-lunY-partZ
>
> Name format without expanders:
> hba_pci_address-sas-phyX-lunY-partZ
>
> Signed-off-by: Maurizio Lombardi <mlombard at redhat.com>
> ---
>  src/udev/udev-builtin-path_id.c | 96 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 95 insertions(+), 1 deletion(-)
>
> diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c
> index 073f05a..7a97411 100644
> --- a/src/udev/udev-builtin-path_id.c
> +++ b/src/udev/udev-builtin-path_id.c
> @@ -118,7 +118,7 @@ out:
>          return parent;
>  }
>
> -static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path) {
> +static struct udev_device *handle_scsi_sas_wide_port(struct udev_device *parent, char **path) {
>          struct udev *udev  = udev_device_get_udev(parent);
>          struct udev_device *targetdev;
>          struct udev_device *target_parent;
> @@ -154,6 +154,100 @@ out:
>          return parent;
>  }
>
> +static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path)
> +{
> +        struct udev *udev  = udev_device_get_udev(parent);
> +        struct udev_device *targetdev;
> +        struct udev_device *target_parent;
> +        struct udev_device *port;
> +        struct udev_device *expander;
> +        struct udev_device *target_sasdev = NULL;
> +        struct udev_device *expander_sasdev = NULL;
> +        struct udev_device *port_sasdev = NULL;
> +        const char *sas_address = NULL;
> +        const char *phy_id;
> +        const char *phy_count;
> +        char *lun = NULL;
> +
> +        targetdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_target");
> +        if (targetdev == NULL)
> +                return NULL;
> +
> +        target_parent = udev_device_get_parent(targetdev);
> +        if (target_parent == NULL)
> +                return NULL;
> +
> +        /* Get sas device */
> +        target_sasdev = udev_device_new_from_subsystem_sysname(udev,
> +                          "sas_device", udev_device_get_sysname(target_parent));
> +        if (target_sasdev == NULL)
> +                return NULL;
> +
> +        /* The next parent is sas port */
> +        port = udev_device_get_parent(target_parent);
> +        if (port == NULL) {
> +                parent = NULL;
> +                goto out;
> +        }
> +
> +        /* Get port device */
> +        port_sasdev = udev_device_new_from_subsystem_sysname(udev,
> +                          "sas_port", udev_device_get_sysname(port));
> +
> +        phy_count = udev_device_get_sysattr_value(port_sasdev, "num_phys");
> +        if (phy_count == NULL) {
> +               parent = NULL;
> +               goto out;
> +        }
> +
> +        /* Check if we are simple disk */
> +        if (strncmp(phy_count, "1", 2) != 0) {
> +                 parent = handle_scsi_sas_wide_port(parent, path);
> +                 goto out;
> +        }
> +
> +        /* Get connected phy */
> +        phy_id = udev_device_get_sysattr_value(target_sasdev, "phy_identifier");
> +        if (phy_id == NULL) {
> +                parent = NULL;
> +                goto out;
> +        }
> +
> +        /* The port's parent is either hba or expander */
> +        expander = udev_device_get_parent(port);
> +        if (expander == NULL) {
> +                parent = NULL;
> +                goto out;
> +        }
> +
> +        /* Get expander device */
> +        expander_sasdev = udev_device_new_from_subsystem_sysname(udev,
> +                          "sas_device", udev_device_get_sysname(expander));
> +        if (expander_sasdev != NULL) {
> +                 /* Get expander's address */
> +                 sas_address = udev_device_get_sysattr_value(expander_sasdev,
> +                                                    "sas_address");
> +                 if (sas_address == NULL) {
> +                        parent = NULL;
> +                        goto out;
> +                 }
> +        }
> +
> +        format_lun_number(parent, &lun);
> +        if (sas_address)
> +                 path_prepend(path, "sas-exp%s-phy%s-%s", sas_address, phy_id, lun);
> +        else
> +                 path_prepend(path, "sas-phy%s-%s", phy_id, lun);
> +
> +        if (lun)
> +                free(lun);
> +out:
> +        udev_device_unref(target_sasdev);
> +        udev_device_unref(expander_sasdev);
> +        udev_device_unref(port_sasdev);
> +        return parent;
> +}
> +
>  static struct udev_device *handle_scsi_iscsi(struct udev_device *parent, char **path) {
>          struct udev *udev  = udev_device_get_udev(parent);
>          struct udev_device *transportdev;
> --
> Maurizio Lombardi
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


More information about the systemd-devel mailing list