| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- From patchwork Tue Jul 30 19:26:42 2024
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 7bit
- X-Patchwork-Submitter: Daniel Golle <[email protected]>
- X-Patchwork-Id: 13747817
- Date: Tue, 30 Jul 2024 20:26:42 +0100
- From: Daniel Golle <[email protected]>
- To: Rob Herring <[email protected]>, Krzysztof Kozlowski <[email protected]>,
- Conor Dooley <[email protected]>, Jens Axboe <[email protected]>,
- Daniel Golle <[email protected]>, Christian Brauner <[email protected]>,
- Al Viro <[email protected]>, Li Lingfeng <[email protected]>,
- Ming Lei <[email protected]>, Christian Heusel <[email protected]>,
- =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <[email protected]>,
- Felix Fietkau <[email protected]>, John Crispin <[email protected]>,
- Chad Monroe <[email protected]>, Yangyu Chen <[email protected]>,
- Tianling Shen <[email protected]>, Chuanhong Guo <[email protected]>,
- Chen Minqiang <[email protected]>, [email protected],
- [email protected], [email protected]
- Subject: [PATCH v5 3/4] block: add support for notifications
- Message-ID:
- <ca0022886e8f211a323a716653a1396a3bc91653.1722365899.git.daniel@makrotopia.org>
- References: <[email protected]>
- Precedence: bulk
- X-Mailing-List: [email protected]
- List-Id: <linux-block.vger.kernel.org>
- List-Subscribe: <mailto:[email protected]>
- List-Unsubscribe: <mailto:[email protected]>
- MIME-Version: 1.0
- Content-Disposition: inline
- In-Reply-To: <[email protected]>
- Add notifier block to notify other subsystems about the addition or
- removal of block devices.
- Signed-off-by: Daniel Golle <[email protected]>
- ---
- block/Kconfig | 6 +++
- block/Makefile | 1 +
- block/blk-notify.c | 87 ++++++++++++++++++++++++++++++++++++++++++
- include/linux/blkdev.h | 11 ++++++
- 4 files changed, 105 insertions(+)
- create mode 100644 block/blk-notify.c
- --- a/block/Kconfig
- +++ b/block/Kconfig
- @@ -208,6 +208,12 @@ config BLK_INLINE_ENCRYPTION_FALLBACK
- by falling back to the kernel crypto API when inline
- encryption hardware is not present.
-
- +config BLOCK_NOTIFIERS
- + bool "Enable support for notifications in block layer"
- + help
- + Enable this option to provide notifiers for other subsystems
- + upon addition or removal of block devices.
- +
- source "block/partitions/Kconfig"
-
- config BLK_MQ_PCI
- --- a/block/Makefile
- +++ b/block/Makefile
- @@ -40,3 +40,4 @@ obj-$(CONFIG_BLK_INLINE_ENCRYPTION) += b
- blk-crypto-sysfs.o
- obj-$(CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK) += blk-crypto-fallback.o
- obj-$(CONFIG_BLOCK_HOLDER_DEPRECATED) += holder.o
- +obj-$(CONFIG_BLOCK_NOTIFIERS) += blk-notify.o
- --- /dev/null
- +++ b/block/blk-notify.c
- @@ -0,0 +1,87 @@
- +// SPDX-License-Identifier: GPL-2.0-or-later
- +/*
- + * Notifiers for addition and removal of block devices
- + *
- + * Copyright (c) 2024 Daniel Golle <[email protected]>
- + */
- +
- +#include <linux/list.h>
- +#include <linux/mutex.h>
- +#include <linux/notifier.h>
- +
- +#include "blk.h"
- +
- +struct blk_device_list {
- + struct device *dev;
- + struct list_head list;
- +};
- +
- +static RAW_NOTIFIER_HEAD(blk_notifier_list);
- +static DEFINE_MUTEX(blk_notifier_lock);
- +static LIST_HEAD(blk_devices);
- +
- +void blk_register_notify(struct notifier_block *nb)
- +{
- + struct blk_device_list *existing_blkdev;
- +
- + mutex_lock(&blk_notifier_lock);
- + raw_notifier_chain_register(&blk_notifier_list, nb);
- +
- + list_for_each_entry(existing_blkdev, &blk_devices, list)
- + nb->notifier_call(nb, BLK_DEVICE_ADD, existing_blkdev->dev);
- +
- + mutex_unlock(&blk_notifier_lock);
- +}
- +EXPORT_SYMBOL_GPL(blk_register_notify);
- +
- +void blk_unregister_notify(struct notifier_block *nb)
- +{
- + mutex_lock(&blk_notifier_lock);
- + raw_notifier_chain_unregister(&blk_notifier_list, nb);
- + mutex_unlock(&blk_notifier_lock);
- +}
- +EXPORT_SYMBOL_GPL(blk_unregister_notify);
- +
- +static int blk_call_notifier_add(struct device *dev)
- +{
- + struct blk_device_list *new_blkdev;
- +
- + new_blkdev = kmalloc(sizeof(*new_blkdev), GFP_KERNEL);
- + if (!new_blkdev)
- + return -ENOMEM;
- +
- + new_blkdev->dev = dev;
- + mutex_lock(&blk_notifier_lock);
- + list_add_tail(&new_blkdev->list, &blk_devices);
- + raw_notifier_call_chain(&blk_notifier_list, BLK_DEVICE_ADD, dev);
- + mutex_unlock(&blk_notifier_lock);
- + return 0;
- +}
- +
- +static void blk_call_notifier_remove(struct device *dev)
- +{
- + struct blk_device_list *old_blkdev, *tmp;
- +
- + mutex_lock(&blk_notifier_lock);
- + list_for_each_entry_safe(old_blkdev, tmp, &blk_devices, list) {
- + if (old_blkdev->dev != dev)
- + continue;
- +
- + list_del(&old_blkdev->list);
- + kfree(old_blkdev);
- + }
- + raw_notifier_call_chain(&blk_notifier_list, BLK_DEVICE_REMOVE, dev);
- + mutex_unlock(&blk_notifier_lock);
- +}
- +
- +static struct class_interface blk_notifications_bus_interface __refdata = {
- + .class = &block_class,
- + .add_dev = &blk_call_notifier_add,
- + .remove_dev = &blk_call_notifier_remove,
- +};
- +
- +static int __init blk_notifications_init(void)
- +{
- + return class_interface_register(&blk_notifications_bus_interface);
- +}
- +device_initcall(blk_notifications_init);
- --- a/include/linux/blkdev.h
- +++ b/include/linux/blkdev.h
- @@ -1567,4 +1567,15 @@ struct io_comp_batch {
-
- #define DEFINE_IO_COMP_BATCH(name) struct io_comp_batch name = { }
-
- +
- +#define BLK_DEVICE_ADD 1
- +#define BLK_DEVICE_REMOVE 2
- +#if defined(CONFIG_BLOCK_NOTIFIERS)
- +void blk_register_notify(struct notifier_block *nb);
- +void blk_unregister_notify(struct notifier_block *nb);
- +#else
- +static inline void blk_register_notify(struct notifier_block *nb) { };
- +static inline void blk_unregister_notify(struct notifier_block *nb) { };
- +#endif
- +
- #endif /* _LINUX_BLKDEV_H */
|