Linux 块设备驱动程序分配
struct gendisk
和任何关联的元数据,并提供队列或 submit_bio
函数的某些实现来处理来自操作系统的传入 I/O
请求。
当磁盘被移除时,它会调用:
del_gendisk(brd->brd_disk);
blk_cleanup_disk(brd->brd_disk);
...
kfree(brd);
例如,参见
ramdisk 驱动程序的
brd_cleanup
例程。
驱动程序如何知道不再运行任何可能访问
submit_bio
或元数据结构的代码(在 bio_end_io
或 gendisk
函数中)(在上面的示例中由 kfree(brd)
释放) .
我看到了
del_gendisk
等。等人。冻结队列并不允许更多I/O
,但从仔细阅读源代码来看,这似乎只是停止了对submit_bio
的新提交。它不会跟踪实际 submit_bio
调用之后的任何内容。
_disk
清理函数可能会阻塞,直到设备或其分区的所有打开文件句柄都被关闭。代码在哪里?
blkdev_close
是等待所有未完成的 I/O 的更高级别调用。它调用 __sync_blockdev
将所有内容写出来。 https://elixir.bootlin.com/linux/v4.20.17/source/fs/block_dev.c#L457