This is a significant rewrite of the patchset that I originally posted back on 28 July. It incorporates almost all of the suggestions that I received as feedback to my original patchset (largely because I was finally able to wrap my head around how complex LED triggers work). One thing that has not changed is that associations between block devices and LEDs are still set via an attribute on the device, rather than the LED. This is much simpler, as the device attribute only has to handle a single value (the name of the associated LED), rather than potentially handling multiple device names. More importantly, it avoids the need to iterate through all of the block devices on the system, searching by name. This was proposed fairly recently, and the reaction was not positive.[1][2] I have modeled the interface for the /sys/block/<DEVICE>/led attribute on the sysfs interface used for selecting a trigger. All available LEDs (all LEDs associated with the blkdev trigger) are shown when the attribute is read, with the currently selected LED enclosed in square brackets ([]). As before, this is all very new to me (particularly the RCU stuff), so I welcome feedback. Thanks! Changes from the original patchset: * Use a single complex LED trigger ("blkdev"), rather than multiple user-defined triggers. * Configurable blink time and interval for each LED: /sys/class/leds/<LED>/blink_{on,off} * Associated block devices linked from LED subdirectory: /sys/class/leds/<LED>/block_devices (Avoids violating the "one value per entry" sysfs rule.) * Device-LED associations set via /sys/block/<DEVICE>/led * Document all sysfs attributes in Documentation/ABI/testing (but also kept the overview doc) * Removed unnecessary [un]likely macros * Reduced number of "user error" log messages and changed level to INFO * More detailed commit messages * Add Kconfig option in final commit * Use RCU-protected pointer (rather than mutex) * No in-kernel APIs for now [1] https://www.spinics.net/lists/linux-leds/msg18256.html [2] https://www.spinics.net/lists/linux-leds/msg18261.html Ian Pilcher (10): docs: Add block device LED trigger documentation block: Add file (blk-ledtrig.c) for block device LED trigger implementation block: Add block device LED trigger fields to gendisk structure block: Add functions to set & clear block device LEDs block: Add block device sysfs attribute to set/clear/show LED block: Add activate and deactivate functions for block device LED trigger block: Add sysfs attributes to LEDs associated with blkdev trigger block: Add init function for block device LED trigger block: Blink device LED (if any) when request is sent to its driver block: Add config option to enable block device LED triggers Documentation/ABI/testing/sysfs-block | 16 + .../testing/sysfs-class-led-trigger-blkdev | 28 ++ Documentation/block/blk-ledtrig.rst | 79 +++ Documentation/block/index.rst | 1 + block/Kconfig | 8 + block/Makefile | 1 + block/blk-ledtrig.c | 469 ++++++++++++++++++ block/blk-ledtrig.h | 45 ++ block/blk-mq.c | 2 + block/genhd.c | 11 + include/linux/genhd.h | 4 + 11 files changed, 664 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-class-led-trigger-blkdev create mode 100644 Documentation/block/blk-ledtrig.rst create mode 100644 block/blk-ledtrig.c create mode 100644 block/blk-ledtrig.h -- 2.31.1