leds: Extends disk trigger for reads and writes
authorLinus Walleij <linus.walleij@linaro.org>
Sat, 24 Feb 2018 22:45:56 +0000 (23:45 +0100)
committerJacek Anaszewski <jacek.anaszewski@gmail.com>
Sun, 11 Mar 2018 19:01:55 +0000 (20:01 +0100)
This adds two new disk triggers for triggering on reads
and writes respectively, named "disk-read" and "disk-write".

The use case comes from working on the D-Link DNS-313 NAS
box. This features an RGB LED for disk activity. with
these two triggers I can couple the green LED to read
activity and the red LED to write activity, which gives
the appropriate user feedback about what is happening
on the disk. When tested it gave exactly the feedback
desired.

The in-kernel interface is simply changed to pass a bool
indicating if the activity is write activity and update
each trigger (and the composite "disk-activity" trigger)
depending on what is passed in.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
drivers/ata/libata-core.c
drivers/ide/ide-disk.c
drivers/leds/trigger/ledtrig-disk.c
include/linux/leds.h

index 3c09122bf03825b6489a16b8f116bd05485aa1b4..fa75de6abbf191df23aef0f3992923c5ab271bbe 100644 (file)
@@ -5219,7 +5219,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
        struct ata_port *ap = qc->ap;
 
        /* Trigger the LED (if available) */
-       ledtrig_disk_activity();
+       ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE));
 
        /* XXX: New EH and old EH use different mechanisms to
         * synchronize EH with regular execution path.
index 188d1b03715d3f95e2ef1ca9e2ebd68c317f3926..67bc72d78fbf09729238ea9872a0c9eed221b2d8 100644 (file)
@@ -187,7 +187,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
        BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED);
        BUG_ON(blk_rq_is_passthrough(rq));
 
-       ledtrig_disk_activity();
+       ledtrig_disk_activity(rq_data_dir(rq) == WRITE);
 
        pr_debug("%s: %sing: block=%llu, sectors=%u\n",
                 drive->name, rq_data_dir(rq) == READ ? "read" : "writ",
index cd525b4125ebe0f96d908bb7cbb4e63e744541cf..9816b0d60270b4a7d5e312e8fe2cc4fba19c2dda 100644 (file)
 #define BLINK_DELAY 30
 
 DEFINE_LED_TRIGGER(ledtrig_disk);
+DEFINE_LED_TRIGGER(ledtrig_disk_read);
+DEFINE_LED_TRIGGER(ledtrig_disk_write);
 DEFINE_LED_TRIGGER(ledtrig_ide);
 
-void ledtrig_disk_activity(void)
+void ledtrig_disk_activity(bool write)
 {
        unsigned long blink_delay = BLINK_DELAY;
 
@@ -28,12 +30,20 @@ void ledtrig_disk_activity(void)
                                  &blink_delay, &blink_delay, 0);
        led_trigger_blink_oneshot(ledtrig_ide,
                                  &blink_delay, &blink_delay, 0);
+       if (write)
+               led_trigger_blink_oneshot(ledtrig_disk_write,
+                                         &blink_delay, &blink_delay, 0);
+       else
+               led_trigger_blink_oneshot(ledtrig_disk_read,
+                                         &blink_delay, &blink_delay, 0);
 }
 EXPORT_SYMBOL(ledtrig_disk_activity);
 
 static int __init ledtrig_disk_init(void)
 {
        led_trigger_register_simple("disk-activity", &ledtrig_disk);
+       led_trigger_register_simple("disk-read", &ledtrig_disk_read);
+       led_trigger_register_simple("disk-write", &ledtrig_disk_write);
        led_trigger_register_simple("ide-disk", &ledtrig_ide);
 
        return 0;
index 5579c64c8fd62e63d4e6a28dfd29fc6418dfcfe9..b7e82550e655bc8da99480138703721d442f6a79 100644 (file)
@@ -346,9 +346,9 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
 
 /* Trigger specific functions */
 #ifdef CONFIG_LEDS_TRIGGER_DISK
-extern void ledtrig_disk_activity(void);
+extern void ledtrig_disk_activity(bool write);
 #else
-static inline void ledtrig_disk_activity(void) {}
+static inline void ledtrig_disk_activity(bool write) {}
 #endif
 
 #ifdef CONFIG_LEDS_TRIGGER_MTD