问题跟因1:
补丁 block: move the NEED_PART_SCAN flag to struct gendisk 引入了问题,
该补丁将flag从block_device挪到了gendisk,并且将访问block_device->flags
的位置适配为block_device->bd_disk->flags,但是并不能保证 bd_disk 一定初始化,
因此会导致空指针引用
问题跟因2:
补丁block: Fix warning in bd_link_disk_holder()引入的问题:
补丁合入前 part0 的 block_device初始化路径:
devcie_add_disk
disk->flags |= GENHD_FL_UP
register_disk
bdget_disk(disk, 0);
part = disk_get_part(disk, partno);
bdget() -> 申请block_device,内容还未初始化完成
set_bit(GD_NEED_PART_SCAN, &disk->state);
blkdev_get()
__blkdev_get
bdev_get_gendisk
get_gendisk
-> 如果GENHD_FL_UP没有置上,会返回失败
if(!bdev->bd_openers)
bd->bd_disk = disk; -> 初始化block_devcie内容
......
补丁将flagGENHD_FL_UP的设置挪到了blkdev_get的后面,
因此补丁合入后 part0 的 block_device无法在创建设备时初始,
而是延迟到了下一次调用blkdev_get.
但是有写驱动可能会绕过blkdev_get直接去访问part0的block_device,
例如zram可以在创建设备后,直接写/sys/block/zram/reset触发reset_store:
vfs_write
kernfs_fop_write
reset_restore
bdev = bdget_disk(zram->disk, 0);
-> bdev内容还未初始化完成,引用bdev->bd_disk触发空指针引用
Hi hailan94, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @Xie XiuQi , @YangYingliang , @成坚 (CHENG Jian) , @pi3orama , @jiaoff
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论