From: Damien Le Moal dlemoal@kernel.org
[ Upstream commit 413e800cadbf67550d76c77c230b2ecd96bce83a ]
Modify ata_scsi_lpm_store() to return an error if a user attempts to set a link power management policy for a port that does not support LPM, that is, ports flagged with ATA_FLAG_NO_LPM.
Signed-off-by: Damien Le Moal dlemoal@kernel.org Reviewed-by: Niklas Cassel cassel@kernel.org Reviewed-by: Hannes Reinecke hare@suse.de Link: https://lore.kernel.org/r/20250701125321.69496-6-dlemoal@kernel.org Signed-off-by: Niklas Cassel cassel@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
Based on my analysis of the commit and the surrounding code context, here's my determination:
**Backport Status: YES**
This commit should be backported to stable kernel trees for the following reasons:
1. **Fixes a clear bug**: Without this check, users can attempt to change LPM policy on ports that don't support LPM (flagged with ATA_FLAG_NO_LPM), which could lead to undefined behavior or system issues. The code already prevents setting the policy but doesn't inform the user that the operation failed.
2. **User-visible issue**: The bug allows sysfs writes to succeed silently when they should fail with an error. This violates the principle of least surprise - users expect operations to either succeed or return an error, not silently fail.
3. **Small and contained fix**: The patch adds just 5 lines of code (lines 927-930) that perform a simple flag check and return -EOPNOTSUPP if the port doesn't support LPM. This is a minimal change with low risk of regression.
4. **Consistency with existing checks**: The function already has similar validation for device-level quirks (ATA_QUIRK_NOLPM at lines 934-937). This patch adds the missing port-level validation, making the code more consistent and complete.
5. **Related to recent fixes**: Looking at recent commits (65b2c92f69d3, 4edf1505b76d), there's been work to properly handle ports that don't support LPM. This patch completes that work by ensuring the sysfs interface properly rejects invalid operations.
6. **Prevents potential hardware issues**: Attempting to set LPM policies on hardware that doesn't support them could potentially cause hardware malfunctions or unexpected behavior. This fix prevents such attempts at the sysfs interface level.
The fix follows stable kernel rules: it's a clear bug fix, minimal in scope, doesn't introduce new features, and addresses a real user-facing issue where invalid operations appear to succeed when they should fail with an appropriate error code.
drivers/ata/libata-sata.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 04bdd53abf20..7cacb2bfc360 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -815,6 +815,11 @@ static ssize_t ata_scsi_lpm_store(struct device *device,
spin_lock_irqsave(ap->lock, flags);
+ if (ap->flags & ATA_FLAG_NO_LPM) { + count = -EOPNOTSUPP; + goto out_unlock; + } + ata_for_each_link(link, ap, EDGE) { ata_for_each_dev(dev, &ap->link, ENABLED) { if (dev->horkage & ATA_HORKAGE_NOLPM) {