| From 644d57a5bebe87828068d1349a81be1e713023e5 Mon Sep 17 00:00:00 2001 |
| From: Peter Rajnoha <prajnoha@redhat.com> |
| Date: Wed, 5 Dec 2018 12:27:44 +0100 |
| Subject: kobject: return error code if writing /sys/.../uevent fails |
| |
| [ Upstream commit df44b479654f62b478c18ee4d8bc4e9f897a9844 ] |
| |
| Propagate error code back to userspace if writing the /sys/.../uevent |
| file fails. Before, the write operation always returned with success, |
| even if we failed to recognize the input string or if we failed to |
| generate the uevent itself. |
| |
| With the error codes properly propagated back to userspace, we are |
| able to react in userspace accordingly by not assuming and awaiting |
| a uevent that is not delivered. |
| |
| Signed-off-by: Peter Rajnoha <prajnoha@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/base/bus.c | 12 ++++++++---- |
| drivers/base/core.c | 8 +++++++- |
| kernel/module.c | 6 ++++-- |
| 3 files changed, 19 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/base/bus.c b/drivers/base/bus.c |
| index 1cf1460f8c90..3464c49dad0d 100644 |
| --- a/drivers/base/bus.c |
| +++ b/drivers/base/bus.c |
| @@ -616,8 +616,10 @@ static void remove_probe_files(struct bus_type *bus) |
| static ssize_t uevent_store(struct device_driver *drv, const char *buf, |
| size_t count) |
| { |
| - kobject_synth_uevent(&drv->p->kobj, buf, count); |
| - return count; |
| + int rc; |
| + |
| + rc = kobject_synth_uevent(&drv->p->kobj, buf, count); |
| + return rc ? rc : count; |
| } |
| static DRIVER_ATTR_WO(uevent); |
| |
| @@ -833,8 +835,10 @@ static void klist_devices_put(struct klist_node *n) |
| static ssize_t bus_uevent_store(struct bus_type *bus, |
| const char *buf, size_t count) |
| { |
| - kobject_synth_uevent(&bus->p->subsys.kobj, buf, count); |
| - return count; |
| + int rc; |
| + |
| + rc = kobject_synth_uevent(&bus->p->subsys.kobj, buf, count); |
| + return rc ? rc : count; |
| } |
| static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store); |
| |
| diff --git a/drivers/base/core.c b/drivers/base/core.c |
| index fc5bbb2519fe..1c67bf24bc23 100644 |
| --- a/drivers/base/core.c |
| +++ b/drivers/base/core.c |
| @@ -991,8 +991,14 @@ out: |
| static ssize_t uevent_store(struct device *dev, struct device_attribute *attr, |
| const char *buf, size_t count) |
| { |
| - if (kobject_synth_uevent(&dev->kobj, buf, count)) |
| + int rc; |
| + |
| + rc = kobject_synth_uevent(&dev->kobj, buf, count); |
| + |
| + if (rc) { |
| dev_err(dev, "uevent: failed to send synthetic uevent\n"); |
| + return rc; |
| + } |
| |
| return count; |
| } |
| diff --git a/kernel/module.c b/kernel/module.c |
| index 2a44c515f0d7..94528b891027 100644 |
| --- a/kernel/module.c |
| +++ b/kernel/module.c |
| @@ -1201,8 +1201,10 @@ static ssize_t store_uevent(struct module_attribute *mattr, |
| struct module_kobject *mk, |
| const char *buffer, size_t count) |
| { |
| - kobject_synth_uevent(&mk->kobj, buffer, count); |
| - return count; |
| + int rc; |
| + |
| + rc = kobject_synth_uevent(&mk->kobj, buffer, count); |
| + return rc ? rc : count; |
| } |
| |
| struct module_attribute module_uevent = |
| -- |
| 2.19.1 |
| |