• D
    HID: input: return ENODATA if reading battery attrs fails · d0a934b7
    David Herrmann 提交于
    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@suse.cz>
    Cc: Anton Vorontsov <cbou@mail.ru>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Reported-by: NDaniel Nicoletti <dantti12@gmail.com>
    Signed-off-by: NDavid Herrmann <dh.herrmann@gmail.com>
    Signed-off-by: NJiri Kosina <jkosina@suse.cz>
    d0a934b7
hid-input.c 39.6 KB