[ 3.5.y.z extended stable ] Patch "HID: input: return ENODATA if reading battery attrs fails" has been added to staging queue

Luis Henriques luis.henriques at canonical.com
Fri Sep 20 19:35:08 UTC 2013


This is a note to let you know that I have just added a patch titled

    HID: input: return ENODATA if reading battery attrs fails

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Luis

------

>From bbe25e2aec7fc59448dba6e2c9dc84625cf0f76b Mon Sep 17 00:00:00 2001
From: David Herrmann <dh.herrmann at gmail.com>
Date: Mon, 13 May 2013 17:01:30 +0200
Subject: [PATCH] HID: input: return ENODATA if reading battery attrs fails

commit d0a934b764c67b4bf626f5b7cf725a6e3066afd2 upstream.

power_supply core has the bad habit of calling our battery callbacks
from within power_supply_register(). Furthermore, if the callbacks
fail with an unhandled error code, it will skip any uevent that it
might currently process.
So if HID-core registers battery devices, an "add" uevent is generated
and the battery callbacks are called. These will gracefully fail due
to timeouts as they might still hold locks on event processing. One
could argue that this should be fixed in power_supply core, but the
least we can do is to signal ENODATA so power_supply core will just
skip the property and continue with the uevent.

This fixes a bug where "add" and "remove" uevents are skipped for
battery devices. upower is unable to track these devices and currently
needs to ignore them.

This patch also overwrites any other error code. I cannot see any reason
why we should forward protocol- or I/O-errors to the power_supply core.
We handle these errors in hid_ll_driver later, anyway, so just skip
them. power_supply core cannot do anything useful with them, anyway,
and we avoid skipping important uevents and confusing user-space.

Thanks a lot to Daniel Nicoletti for pushing and investigating
on this.

Cc: Jiri Kosina <jkosina at suse.cz>
Cc: Anton Vorontsov <cbou at mail.ru>
Cc: David Woodhouse <dwmw2 at infradead.org>
Reported-by: Daniel Nicoletti <dantti12 at gmail.com>
Signed-off-by: David Herrmann <dh.herrmann at gmail.com>
Signed-off-by: Jiri Kosina <jkosina at suse.cz>
[ luis: 3.5.y-prereq for:
  6c2794a HID: battery: don't do DMA from stack ]
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
 drivers/hid/hid-input.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 5301006..73f2f7c 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -339,10 +339,10 @@ static int hidinput_get_battery_property(struct power_supply *psy,
 					      dev->battery_report_type);

 		if (ret != 2) {
-			if (ret >= 0)
-				ret = -EINVAL;
+			ret = -ENODATA;
 			break;
 		}
+		ret = 0;

 		if (dev->battery_min < dev->battery_max &&
 		    buf[1] >= dev->battery_min &&
--
1.8.3.2





More information about the kernel-team mailing list