FAILED: patch "[PATCH] usb: typec: altmodes/displayport: create sysfs nodes as" failed to apply to 6.1-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 165376f6b23e9a779850e750fb2eb06622e5a531
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024032758-thesaurus-rabid-563c@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
165376f6b23e ("usb: typec: altmodes/displayport: create sysfs nodes as driver's default device attribute group") 001b0c780eac ("usb: typec: altmodes/displayport: Add hpd sysfs attribute")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 165376f6b23e9a779850e750fb2eb06622e5a531 Mon Sep 17 00:00:00 2001
From: RD Babiera <[email protected]>
Date: Thu, 29 Feb 2024 00:11:02 +0000
Subject: [PATCH] usb: typec: altmodes/displayport: create sysfs nodes as
driver's default device attribute group
The DisplayPort driver's sysfs nodes may be present to the userspace before typec_altmode_set_drvdata() completes in dp_altmode_probe. This means that a sysfs read can trigger a NULL pointer error by deferencing dp->hpd in hpd_show or dp->lock in pin_assignment_show, as dev_get_drvdata() returns NULL in those cases.
Remove manual sysfs node creation in favor of adding attribute group as default for devices bound to the driver. The ATTRIBUTE_GROUPS() macro is not used here otherwise the path to the sysfs nodes is no longer compliant with the ABI.
drivers/usb/typec/altmodes/displayport.c +9 -9
@@ -559,16 +559,21 @@ static ssize_t hpd_show(struct device *dev, struct device_attribute *attr, char }static DEVICE_ATTR_RO (hpd); -static struct attribute *dp_altmode_attrs[] = { +static struct attribute *displayport_attrs[] = { &dev_attr_configuration.attr, &dev_attr_pin_assignment.attr, &dev_attr_hpd.attr,NULL }; -static const struct attribute_group dp_altmode_group = { +static const struct attribute_group displayport_group = { .name ="displayport" , - .attrs = dp_altmode_attrs, + .attrs = displayport_attrs, +}; + +static const struct attribute_group *displayport_groups[] = { + &displayport_group, +NULL , };int dp_altmode_probe (struct typec_altmode *alt)
@@ -576,7 +581,6 @@ int dp_altmode_probe(struct typec_altmode *alt)const struct typec_altmode *port =typec_altmode_get_partner (alt);struct fwnode_handle *fwnode;struct dp_altmode *dp; -int ret;/* FIXME: Port can only be DFP_U. */
@@ -587,10 +591,6 @@ int dp_altmode_probe(struct typec_altmode *alt) DP_CAP_PIN_ASSIGN_DFP_D(alt->vdo)))return -ENODEV ; - ret =sysfs_create_group (&alt->dev.kobj, &dp_altmode_group); -if (ret) -return ret; - dp =devm_kzalloc (&alt->dev,sizeof (*dp),GFP_KERNEL );if (!dp)return -ENOMEM ;
@@ -624,7 +624,6 @@ void dp_altmode_remove(struct typec_altmode *alt) {struct dp_altmode *dp =typec_altmode_get_drvdata (alt); -sysfs_remove_group (&alt->dev.kobj, &dp_altmode_group);cancel_work_sync (&dp->work);if (dp->connector_fwnode) {
@@ -649,6 +648,7 @@ static struct typec_altmode_driver dp_altmode_driver = { .driver = { .name = "typec_displayport", .owner = THIS_MODULE, + .dev_groups = displayport_groups, }, };module_typec_altmode_driver (dp_altmode_driver);