All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Asleson <tasleson@redhat.com>
To: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org,
	linux-ide@vger.kernel.org
Subject: [v5 04/12] scsi: Add durable_name for dev_printk
Date: Fri, 25 Sep 2020 11:19:21 -0500	[thread overview]
Message-ID: <20200925161929.1136806-5-tasleson@redhat.com> (raw)
In-Reply-To: <20200925161929.1136806-1-tasleson@redhat.com>

Add the needed functions to fill out the durable_name function
call back for scsi based storage devices.  This allows calls
into dev_printk for scsi devices to have a persistent id
associated with them.

Signed-off-by: Tony Asleson <tasleson@redhat.com>
---
 drivers/scsi/scsi_lib.c    |  9 +++++++++
 drivers/scsi/scsi_sysfs.c  | 35 ++++++++++++++++++++++++++++-------
 drivers/scsi/sd.c          |  2 ++
 include/scsi/scsi_device.h |  3 +++
 4 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 06056e9ec333..aa5601733763 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -3151,3 +3151,12 @@ int scsi_vpd_tpg_id(struct scsi_device *sdev, int *rel_id)
 	return group_id;
 }
 EXPORT_SYMBOL(scsi_vpd_tpg_id);
+
+int scsi_durable_name(struct scsi_device *sdev, char *buf, size_t len)
+{
+	int vpd_len = scsi_vpd_lun_id(sdev, buf, len);
+	if (vpd_len > 0 && vpd_len < len)
+		return vpd_len + 1;
+	return 0;
+}
+EXPORT_SYMBOL(scsi_durable_name);
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 163dbcb741c1..c4840bc80b47 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -504,15 +504,19 @@ static struct class sdev_class = {
 	.dev_release	= scsi_device_cls_release,
 };
 
+static struct scsi_device *dev_to_scsi_device(const struct device *dev)
+{
+	return dev->type == &scsi_dev_type ? to_scsi_device(dev) : NULL;
+}
+
 /* all probing is done in the individual ->probe routines */
 static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
 {
-	struct scsi_device *sdp;
+	struct scsi_device *sdp = dev_to_scsi_device(dev);
 
-	if (dev->type != &scsi_dev_type)
+	if (!sdp)
 		return 0;
 
-	sdp = to_scsi_device(dev);
 	if (sdp->no_uld_attach)
 		return 0;
 	return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0;
@@ -520,13 +524,11 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
 
 static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
-	struct scsi_device *sdev;
+	struct scsi_device *sdev = dev_to_scsi_device(dev);
 
-	if (dev->type != &scsi_dev_type)
+	if (!sdev)
 		return 0;
 
-	sdev = to_scsi_device(dev);
-
 	add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type);
 	return 0;
 }
@@ -1582,6 +1584,24 @@ static struct device_type scsi_dev_type = {
 	.groups =	scsi_sdev_attr_groups,
 };
 
+int dev_to_scsi_durable_name(const struct device *dev, char *buf, size_t len)
+{
+	/*
+	 * When we go through dev_printk in the scsi layer, dev is embedded
+	 * in a struct scsi_device.  When we go through the block layer,
+	 * dev is embedded in struct genhd, thus we need different paths to
+	 * retrieve the struct scsi_device to call scsi_durable_name.
+	 */
+	struct scsi_device *sdev = dev_to_scsi_device(dev);
+	if (!sdev)
+		sdev = dev_to_scsi_device(dev->parent);
+	if (!sdev)
+		return 0;
+
+	return scsi_durable_name(sdev, buf, len);
+}
+EXPORT_SYMBOL(dev_to_scsi_durable_name);
+
 void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 {
 	unsigned long flags;
@@ -1591,6 +1611,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 	device_initialize(&sdev->sdev_gendev);
 	sdev->sdev_gendev.bus = &scsi_bus_type;
 	sdev->sdev_gendev.type = &scsi_dev_type;
+	sdev->sdev_gendev.durable_name = dev_to_scsi_durable_name;
 	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
 		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
 
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index d90fefffe31b..69ff339fa5ea 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3386,6 +3386,8 @@ static int sd_probe(struct device *dev)
 	gd->private_data = &sdkp->driver;
 	gd->queue = sdkp->device->request_queue;
 
+	disk_to_dev(gd)->durable_name = dev_to_scsi_durable_name;
+
 	/* defaults, until the device tells us otherwise */
 	sdp->sector_size = 512;
 	sdkp->capacity = 0;
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index bc5909033d13..7b6cff11d502 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -464,6 +464,9 @@ extern void sdev_disable_disk_events(struct scsi_device *sdev);
 extern void sdev_enable_disk_events(struct scsi_device *sdev);
 extern int scsi_vpd_lun_id(struct scsi_device *, char *, size_t);
 extern int scsi_vpd_tpg_id(struct scsi_device *, int *);
+extern int dev_to_scsi_durable_name(const struct device *dev, char *buf,
+					size_t len);
+extern int scsi_durable_name(struct scsi_device *sdev, char *buf, size_t len);
 
 #ifdef CONFIG_PM
 extern int scsi_autopm_get_device(struct scsi_device *);
-- 
2.26.2


  parent reply	other threads:[~2020-09-25 16:19 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-25 16:19 [v5 00/12] Add persistent durable identifier to storage log messages Tony Asleson
2020-09-25 16:19 ` [v5 01/12] struct device: Add function callback durable_name Tony Asleson
2020-09-26  9:08   ` Sergei Shtylyov
2020-09-27 14:22     ` Tony Asleson
2020-09-27 16:15       ` Sergei Shtylyov
2020-09-29 17:51   ` Christoph Hellwig
2020-09-29 18:04     ` Greg Kroah-Hartman
2020-09-29 22:04       ` Tony Asleson
2020-09-30  7:38         ` Greg Kroah-Hartman
2020-09-30  7:40           ` Greg Kroah-Hartman
2020-09-30 14:35           ` Tony Asleson
2020-10-01 11:48             ` Greg Kroah-Hartman
2020-10-07 20:10               ` Tony Asleson
2020-10-08  4:48                 ` Greg Kroah-Hartman
2020-10-08 20:49                   ` Martin K. Petersen
2020-10-08  5:54                 ` Hannes Reinecke
2020-10-08  6:22                 ` Finn Thain
2020-09-25 16:19 ` [v5 02/12] create_syslog_header: Add durable name Tony Asleson
2020-09-25 16:19 ` [v5 03/12] dev_vprintk_emit: Increase hdr size Tony Asleson
2020-09-25 16:19 ` Tony Asleson [this message]
2020-09-25 16:19 ` [v5 05/12] nvme: Add durable name for dev_printk Tony Asleson
2020-09-25 16:19 ` [v5 06/12] libata: Add ata_scsi_durable_name Tony Asleson
2020-09-25 16:19 ` [v5 07/12] libata: Make ata_scsi_durable_name static Tony Asleson
2020-09-26  8:40   ` Sergei Shtylyov
2020-09-26 14:17     ` Tony Asleson
2020-09-26 15:57       ` James Bottomley
2020-09-28 20:35     ` Tony Asleson
2020-09-25 16:19 ` [v5 08/12] Add durable_name_printk Tony Asleson
2020-09-26 23:53   ` Randy Dunlap
2020-09-28 15:52     ` Tony Asleson
2020-09-28 17:32       ` Randy Dunlap
2020-09-25 16:19 ` [v5 09/12] libata: use durable_name_printk Tony Asleson
2020-09-25 16:19 ` [v5 10/12] Add durable_name_printk_ratelimited Tony Asleson
2020-09-25 16:19 ` [v5 11/12] print_req_error: Use durable_name_printk_ratelimited Tony Asleson
2020-09-25 16:19 ` [v5 12/12] buffer_io_error: " Tony Asleson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200925161929.1136806-5-tasleson@redhat.com \
    --to=tasleson@redhat.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.