Re: [PATCH v9 0/2] libsas: rediscover improvements for linkrate/sas_addr changes
yangxingui <[email protected]> Fri, 7 Aug 2026 16:35:32 +0800
| Newsgroups | gmane.linux.scsi,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi, John Kindly ping for review... On 2026/6/24 14:32, Xingui Yang wrote: > When a device attached to an expander phy experiences a linkrate change > (e.g., due to cable reconnection or negotiation), the current code in > sas_rediscover_dev() treats it as "broadcast flutter" and takes no action > if the SAS address and device type remain unchanged. > > This series is based on John Garry's suggestion [1] to check the linkrate > and mark the device as gone and rediscover when flutter occurs, replacing > the previous v2 patch series that used lldd callbacks. > > The previous v2 approach added lldd_dev_info_update callback which John > commented as "seem fragile and too specialized" [2]. This series adopts > a simpler approach that directly checks linkrate/sas_addr changes in > sas_rediscover_dev() and triggers rediscovery using libsas's standard > async discovery pattern. > > This aligns with Jason Yan's earlier work [3] which was verified to > solve the linkrate change issue. > > Additionally, per the discussion in v3 [4], the existing replace code > path also suffers from the same sysfs duplication issue: > sas_unregister_devs_sas_addr() only marks the device as gone, but the > actual sysfs cleanup happens later in sas_destruct_devices(). Calling > sas_discover_new() immediately after unregister causes sysfs_warn_dup() > errors. This series also optimizes the replace path to use the async > pattern, ensuring proper ordering for both flutter and replace cases. > > Changes from v8: > - In sas_dev_is_flutter(), call sas_ex_phy_discover() before > sas_ex_to_dev() to ensure PHY state is always updated and to avoid > use-after-free since the child device pointer is obtained after the > sleeping SMP request completes, eliminating the need for kref > - Addressed Sashiko AI review [5][6] feedback on PHY discovery bypass > and TOCTOU concerns > > Changes from v7: > Addressed issues identified by Sashiko AI review [5][6]: > - In sas_dev_is_flutter(), reorder sas_addr check before linkrate check > to ensure address restoration is not skipped when both change > simultaneously, preventing device leak > - In sas_ex_to_dev(), add defensive NULL check for ex_dev to guard > against callers passing a NULL device > > Not addressed (pre-existing subsystem design): > - sas_find_dev_by_rphy() returns unreferenced pointer: subsystem-wide > pattern used by 10+ call sites, should be a separate patch > - ex_phy->port TOCTOU: discovery path is serialized by disco_mutex, > no race occurs in practice > > Changes from v6: > - Add comment for restoring phy->attached_sas_addr to child_dev->sas_addr > - Optimize the conditional structure in sas_dev_is_flutter() > > Changes from v5: > - In sas_addr change handling, restore phy->attached_sas_addr to > child_dev->sas_addr before returning false, ensuring > sas_unregister_devs_sas_addr() can properly match the device via > sas_phy_match_dev_addr() for correct device unregistration > > Changes from v4: > - Rename sas_rediscover_phy to sas_rediscover_ex_phy for consistency > with expander phy symbol naming convention > - Rename sas_is_flutter to sas_dev_is_flutter per John's suggestion > - Check return value of sas_ex_phy_discover() for errors > - Factor out child_dev checks to improve code clarity > > Changes from v3: > - Also optimize the replace code path to use async discovery pattern > - Introduce sas_is_flutter() and sas_rediscover_phy() helpers > to encapsulate the flutter handling logic and avoid function bloat > - Fix replace code path sysfs duplication issue > > Changes from v2: > - Drop lldd_dev_info_update callback approach per John Garry's suggestion > - Drop hisi_sas specific changes (no longer needed without callback) > - Use libsas's async discovery pattern for rediscovery > - Add sas_addr change detection alongside linkrate change > > Changes from v1: > - Split into three patches > > [1] https://lore.kernel.org/linux-scsi/[email protected]/ > [2] https://lore.kernel.org/linux-scsi/[email protected]/ > [3] https://lore.kernel.org/linux-scsi/[email protected]/ > [4] https://lore.kernel.org/linux-scsi/[email protected]/ > [5] https://lore.kernel.org/linux-scsi/[email protected]/ > [6] https://lore.kernel.org/linux-scsi/[email protected]/ > > > Xingui Yang (2): > scsi: libsas: refactor sas_ex_to_ata() using new helper > sas_ex_to_dev() > scsi: libsas: Add linkrate and sas_addr change detection in rediscover > > drivers/scsi/libsas/sas_expander.c | 102 +++++++++++++++++++++++------ > drivers/scsi/libsas/sas_internal.h | 1 + > 2 files changed, 84 insertions(+), 19 deletions(-) >