Linux 块驱动程序如何确保所有 I/O 在卸载之前已完成

问题描述 投票:0回答:1

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
清理函数可能会阻塞,直到设备或其分区的所有打开文件句柄都被关闭。代码在哪里?

linux linux-kernel linux-device-driver block-device
1个回答
0
投票

blkdev_close
是等待所有未完成的 I/O 的更高级别调用。它调用
__sync_blockdev
将所有内容写出来。 https://elixir.bootlin.com/linux/v4.20.17/source/fs/block_dev.c#L457

© www.soinside.com 2019 - 2024. All rights reserved.