[RFC PATCH v3 03/18] ledtrig-blkdev: Add file (ledtrig-blkdev.c) for block device LED trigger
From: Ian Pilcher <hidden>
Date: 2021-08-19 02:51:14
Also in:
kernelnewbies, linux-leds, lkml
Subsystem:
led subsystem, the rest · Maintainers:
Lee Jones, Pavel Machek, Linus Torvalds
Add data types and global variables Signed-off-by: Ian Pilcher <redacted> --- drivers/leds/trigger/ledtrig-blkdev.c | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 drivers/leds/trigger/ledtrig-blkdev.c
diff --git a/drivers/leds/trigger/ledtrig-blkdev.c b/drivers/leds/trigger/ledtrig-blkdev.c
new file mode 100644
index 000000000000..28ccbd7946ba
--- /dev/null
+++ b/drivers/leds/trigger/ledtrig-blkdev.c@@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/* + * Block device LED triggers + * + * Copyright 2021 Ian Pilcher <arequipeno@gmail.com> + */ + +#include <linux/leds.h> +#include <linux/list.h> +#include <linux/mutex.h> + +/* Default blink time & polling interval (milliseconds) */ +#define LEDTRIG_BLKDEV_BLINK_MSEC 75 +#define LEDTRIG_BLKDEV_INTERVAL 100 + +/* Minimum VALUE for interval or blink_time */ +#define LEDTRIG_BLKDEV_MIN_TIME 25 + +enum ledtrig_blkdev_mode { + LEDTRIG_BLKDEV_MODE_RO = 0, /* blink for reads */ + LEDTRIG_BLKDEV_MODE_WO = 1, /* blink for writes */ + LEDTRIG_BLKDEV_MODE_RW = 2 /* blink for reads and writes */ +}; + +/* Trigger-specific info about a block device */ +struct ledtrig_blkdev_disk { + struct gendisk *gd; + struct kobject *dir; + struct hlist_head leds; + unsigned long read_ios; + unsigned long write_ios; + unsigned int generation; + bool read_act; + bool write_act; +}; + +/* For many-to-many relationships between "disks" (block devices) and LEDs */ +struct ledtrig_blkdev_link { + struct hlist_node disk_leds_node; + struct hlist_node led_disks_node; + struct ledtrig_blkdev_disk *disk; + struct ledtrig_blkdev_led *led; +}; + +/* Every LED associated with the blkdev trigger gets one of these */ +struct ledtrig_blkdev_led { + struct kobject *dir; /* block_devices dir */ + struct led_classdev *led_dev; + unsigned int blink_msec; + struct hlist_head disks; /* linked block devs */ + struct hlist_node leds_node; + enum ledtrig_blkdev_mode mode; +}; + +/* All LEDs associated with the trigger */ +static HLIST_HEAD(ledtrig_blkdev_leds); + +/* Must hold when changing trigger/LED/device associations */ +static DEFINE_MUTEX(ledtrig_blkdev_mutex); + +/* Total number of device-to-LED associations */ +static unsigned int ledtrig_blkdev_count; + +/* How often to check for drive activity - in jiffies */ +static unsigned int ledtrig_blkdev_interval;
--
2.31.1