block: always allocate genhd->ev if check_events is implemented
PATCH 1/1 block: always allocate genhd->ev if check_events is implemented
9fd097b149 (block: unexport DISK_EVENT_MEDIA_CHANGE for legacy/fringe drivers) removed DISK_EVENT_MEDIA_CHANGE from legacy/fringe block drivers which have inadequate ->check_events(). Combined with earlier change 7c88a168da (block: don't propagate unlisted DISK_EVENTs to userland), this enables using ->check_events() for internal processing while avoiding enabling in-kernel block event polling which can lead to infinite event loop.
Unfortunately, this made many drivers including floppy without any bit set in disk->events and ->async_events in which case disk_add_events() simply skipped allocation of disk->ev, which disables whole event handling. As ->check_events() is still used during open processing for revalidation, this can lead to open failure.
This patch always allocates disk->ev if ->check_events is implemented. In the long term, it would make sense to simply include the event structure inline into genhd as it's now used by virtually all block devices.
--- block/genhd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/genhd.c +1 -1
@@ -1728,7 +1728,7 @@ static void disk_add_events(struct gendisk *disk) {struct disk_events *ev; -if (!disk->fops->check_events || !(disk->events | disk->async_events)) +if (!disk->fops->check_events)return ; ev =kzalloc (sizeof (*ev),GFP_KERNEL );
Quoted 14 lines · Tejun Heo
9fd097b149(block: unexportDISK_EVENT_MEDIA_CHANGEfor legacy/fringe drivers) removedDISK_EVENT_MEDIA_CHANGEfrom legacy/fringe block drivers which have inadequate ->check_events(). Combined with earlier change7c88a168da(block: don't propagate unlistedDISK_EVENTsto userland), this enables using ->check_events() for internal processing while avoiding enabling in-kernel block event polling which can lead to infinite event loop.Unfortunately, this made many drivers including floppy without any bit set in
disk->eventsand ->async_events in which casedisk_add_events()simply skipped allocation ofdisk->ev, which disables whole event handling. As ->check_events() is still used during open processing for revalidation, this can lead to open failure.
Quoted 4 lines
This patch always allocates
disk->evif ->check_events is implemented. In the long term, it would make sense to simply include the event structure inline into genhd as it's now used by virtually all block devices.
Thanks, applied.
Signature · 1 line
Jens Axboe