100 Star 58 Fork 234

src-openEuler / kernel

 / 详情

【openEuler-1.0-LTS】 回归问题:add_disk 扫描分区不使能

已完成
任务
创建于  
2022-07-13 16:09

问题跟因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触发空指针引用

评论 (1)

Yu Kuai 创建了任务

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

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
5329419 openeuler ci bot 1632792936
1
https://gitee.com/src-openeuler/kernel.git
git@gitee.com:src-openeuler/kernel.git
src-openeuler
kernel
kernel

搜索帮助