From patchwork Wed Jan 16 12:14:12 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Reinecke X-Patchwork-Id: 1987651 Return-Path: X-Original-To: patchwork-dm-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by patchwork1.kernel.org (Postfix) with ESMTP id 31FCF3FDD1 for ; Wed, 16 Jan 2013 12:19:08 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0GCFkA2018453; Wed, 16 Jan 2013 07:15:46 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0GCEVNE005667 for ; Wed, 16 Jan 2013 07:14:31 -0500 Received: from mx1.redhat.com (ext-mx15.extmail.prod.ext.phx2.redhat.com [10.5.110.20]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0GCEVZP000997 for ; Wed, 16 Jan 2013 07:14:31 -0500 Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0GCEN5v020049 for ; Wed, 16 Jan 2013 07:14:23 -0500 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id A0D60A4F28; Wed, 16 Jan 2013 13:14:21 +0100 (CET) From: Hannes Reinecke To: Christophe Varoqui Date: Wed, 16 Jan 2013 13:14:12 +0100 Message-Id: <1358338456-1234-10-git-send-email-hare@suse.de> In-Reply-To: <1358338456-1234-1-git-send-email-hare@suse.de> References: <1358338456-1234-1-git-send-email-hare@suse.de> X-RedHat-Spam-Score: -6.901 (BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Scanned-By: MIMEDefang 2.68 on 10.5.110.20 X-loop: dm-devel@redhat.com Cc: dm-devel@redhat.com Subject: [dm-devel] [PATCH 09/13] Use transport identifiers when detecting devices X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com This patch stores the transport identifiers, allowing for a simplified dev_loss_tmo setting. Signed-off-by: Hannes Reinecke --- libmultipath/discovery.c | 59 ++++++++++++++++++++++++++------------------- libmultipath/structs.h | 17 +++++++++++- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index 8b6f74d..3fd33a3 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -207,6 +207,7 @@ sysfs_get_tgt_nodename (struct path *pp, char * node) { const char *targetid, *value; struct udev_device *parent, *tgtdev; + int host, channel, rport_id = -1; parent = udev_device_get_parent_with_subsystem_devtype(pp->udev, "scsi", "scsi_device"); if (!parent) @@ -214,6 +215,7 @@ sysfs_get_tgt_nodename (struct path *pp, char * node) /* Check for SAS */ value = udev_device_get_sysattr_value(parent, "sas_address"); if (value) { + pp->sg_id.proto_id = SCSI_PROTOCOL_SAS; strncpy(node, value, NODE_NAME_SIZE); return 0; } @@ -221,19 +223,30 @@ sysfs_get_tgt_nodename (struct path *pp, char * node) parent = udev_device_get_parent_with_subsystem_devtype(pp->udev, "scsi", "scsi_target"); if (!parent) return 1; - tgtdev = udev_device_new_from_subsystem_sysname(conf->udev, "fc_transport", udev_device_get_sysname(parent)); - /* Check if it's FibreChannel */ - if (tgtdev) { - const char *value; - - value = udev_device_get_sysattr_value(tgtdev, "node_name"); - if (value) { - strncpy(node, value, NODE_NAME_SIZE); - udev_device_unref(tgtdev); - return 0; + /* Check for FibreChannel */ + tgtdev = udev_device_get_parent(parent); + value = udev_device_get_sysname(tgtdev); + if (sscanf(value, "rport-%d:%d-%d", + &host, &channel, &rport_id) == 3) { + tgtdev = udev_device_new_from_subsystem_sysname(conf->udev, + "fc_remote_ports", value); + if (tgtdev) { + condlog(3, "SCSI target %d:%d:%d -> " + "FC rport %d:%d-%d", + pp->sg_id.host_no, pp->sg_id.channel, + pp->sg_id.scsi_id, host, channel, + rport_id); + value = udev_device_get_sysattr_value(tgtdev, + "node_name"); + if (value) { + pp->sg_id.proto_id = SCSI_PROTOCOL_FCP; + pp->sg_id.transport_id = rport_id; + strncpy(node, value, NODE_NAME_SIZE); + udev_device_unref(tgtdev); + return 0; + } else + udev_device_unref(tgtdev); } - else - udev_device_unref(tgtdev); } /* Check for iSCSI */ @@ -253,6 +266,7 @@ sysfs_get_tgt_nodename (struct path *pp, char * node) value = udev_device_get_sysattr_value(tgtdev, "targetname"); if (value) { + pp->sg_id.proto_id = SCSI_PROTOCOL_ISCSI; strncpy(node, value, NODE_NAME_SIZE); udev_device_unref(tgtdev); return 0; @@ -267,25 +281,20 @@ sysfs_get_tgt_nodename (struct path *pp, char * node) static void sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp) { - struct udev_device *parent = pp->udev; struct udev_device *rport_dev = NULL; char value[11]; - const char *rport_id = NULL; + char rport_id[32]; - while (parent) { - rport_id = udev_device_get_sysname(parent); - if (!strncmp(rport_id, "rport-", 6)) - break; - parent = udev_device_get_parent(parent); - rport_id = NULL; - } - if (!parent || !rport_id) { - condlog(0, "%s: rport id not found", pp->dev); + if (pp->sg_id.proto_id != SCSI_PROTOCOL_FCP) { + condlog(3, "%s: Not a FCP device", pp->dev); return; } - rport_dev = udev_device_new_from_subsystem_sysname(conf->udev, "fc_remote_ports", rport_id); + sprintf(rport_id, "rport-%d:%d-%d", + pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.transport_id); + rport_dev = udev_device_new_from_subsystem_sysname(conf->udev, + "fc_remote_ports", rport_id); if (!rport_dev) { - condlog(3, "%s: No fc_remote_port device for '%s'", pp->dev, + condlog(1, "%s: No fc_remote_port device for '%s'", pp->dev, rport_id); return; } diff --git a/libmultipath/structs.h b/libmultipath/structs.h index 4085900..ab05a78 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -113,6 +113,19 @@ enum detect_prio_states { DETECT_PRIO_ON, }; +enum scsi_protocol { + SCSI_PROTOCOL_FCP = 0, /* Fibre Channel */ + SCSI_PROTOCOL_SPI = 1, /* parallel SCSI */ + SCSI_PROTOCOL_SSA = 2, /* Serial Storage Architecture - Obsolete */ + SCSI_PROTOCOL_SBP = 3, /* firewire */ + SCSI_PROTOCOL_SRP = 4, /* Infiniband RDMA */ + SCSI_PROTOCOL_ISCSI = 5, + SCSI_PROTOCOL_SAS = 6, + SCSI_PROTOCOL_ADT = 7, /* Media Changers */ + SCSI_PROTOCOL_ATA = 8, + SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */ +}; + struct sg_id { int host_no; int channel; @@ -120,8 +133,8 @@ struct sg_id { int lun; short h_cmd_per_lun; short d_queue_depth; - int unused1; - int unused2; + enum scsi_protocol proto_id; + int transport_id; }; # ifndef HDIO_GETGEO