[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20260105093516.2645397-1-yilun.xu@linux.intel.com>
Date: Mon, 5 Jan 2026 17:35:16 +0800
From: Xu Yilun <yilun.xu@...ux.intel.com>
To: linux-coco@...ts.linux.dev,
linux-pci@...r.kernel.org,
dan.j.williams@...el.com
Cc: yilun.xu@...el.com,
yilun.xu@...ux.intel.com,
baolu.lu@...ux.intel.com,
zhenzhong.duan@...el.com,
linux-kernel@...r.kernel.org,
yi1.lai@...el.com,
helgaas@...nel.org
Subject: [PATCH v2] PCI/IDE: Fix duplicate stream symlink names for TSM class devices
The name streamH.R.E is used for 2 symlinks:
1. TSM class devices: /sys/class/tsm/tsmN/streamH.R.E
2. host bridge devices: /sys/devices/pciDDDD:BB/streamH.R.E
The first usage is broken cause streamH.R.E is only unique within a
specific host bridge but not across the system. Error occurs e.g. when
creating the first stream on a second host bridge:
sysfs: cannot create duplicate filename '/devices/faux/tdx_host/tsm/tsm0/stream0.0.0'
Fix this by adding host bridge name into symlink name for TSM class
devices so they show up as:
/sys/class/tsm/tsmN/pciDDDD:BB:streamH.R.E
It should be OK to change the uAPI since it's new and has few users.
The symlink name for host bridge devices keeps unchanged. Keep concise
as it is already in host bridge context.
Internally in the IDE library, store the full name in struct pci_ide
so TSM symlinks can use it directly as before, while host bridge
symlinks use only the streamH.R.E portion to preserve the existing name.
Fixes: a4438f06b1db ("PCI/TSM: Report active IDE streams")
Reported-by: Yi Lai <yi1.lai@...el.com>
Signed-off-by: Xu Yilun <yilun.xu@...ux.intel.com>
---
v2: Changelog improvements
v1: https://lore.kernel.org/linux-coco/20251223085601.2607455-1-yilun.xu@linux.intel.com/
---
Documentation/ABI/testing/sysfs-class-tsm | 2 +-
drivers/pci/ide.c | 12 +++++++++---
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-class-tsm b/Documentation/ABI/testing/sysfs-class-tsm
index 6fc1a5ac6da1..eff71e42c60e 100644
--- a/Documentation/ABI/testing/sysfs-class-tsm
+++ b/Documentation/ABI/testing/sysfs-class-tsm
@@ -8,7 +8,7 @@ Description:
link encryption and other device-security features coordinated
through a platform tsm.
-What: /sys/class/tsm/tsmN/streamH.R.E
+What: /sys/class/tsm/tsmN/pciDDDD:BB:streamH.R.E
Contact: linux-pci@...r.kernel.org
Description:
(RO) When a host bridge has established a secure connection via
diff --git a/drivers/pci/ide.c b/drivers/pci/ide.c
index f0ef474e1a0d..58fbe9cfd68c 100644
--- a/drivers/pci/ide.c
+++ b/drivers/pci/ide.c
@@ -425,6 +425,7 @@ int pci_ide_stream_register(struct pci_ide *ide)
struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
struct pci_ide_stream_id __sid;
u8 ep_stream, rp_stream;
+ const char *short_name;
int rc;
if (ide->stream_id < 0 || ide->stream_id > U8_MAX) {
@@ -441,13 +442,16 @@ int pci_ide_stream_register(struct pci_ide *ide)
ep_stream = ide->partner[PCI_IDE_EP].stream_index;
rp_stream = ide->partner[PCI_IDE_RP].stream_index;
- const char *name __free(kfree) = kasprintf(GFP_KERNEL, "stream%d.%d.%d",
+ const char *name __free(kfree) = kasprintf(GFP_KERNEL, "%s:stream%d.%d.%d",
+ dev_name(&hb->dev),
ide->host_bridge_stream,
rp_stream, ep_stream);
if (!name)
return -ENOMEM;
- rc = sysfs_create_link(&hb->dev.kobj, &pdev->dev.kobj, name);
+ /* Strip host bridge name in the host bridge context */
+ short_name = name + strlen(dev_name(&hb->dev)) + 1;
+ rc = sysfs_create_link(&hb->dev.kobj, &pdev->dev.kobj, short_name);
if (rc)
return rc;
@@ -471,8 +475,10 @@ void pci_ide_stream_unregister(struct pci_ide *ide)
{
struct pci_dev *pdev = ide->pdev;
struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
+ const char *short_name;
- sysfs_remove_link(&hb->dev.kobj, ide->name);
+ short_name = ide->name + strlen(dev_name(&hb->dev)) + 1;
+ sysfs_remove_link(&hb->dev.kobj, short_name);
kfree(ide->name);
ida_free(&hb->ide_stream_ids_ida, ide->stream_id);
ide->name = NULL;
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
--
2.25.1
Powered by blists - more mailing lists