引用计数的理解
Add_disk 调用blk_register_region,传入exact_lock。
而exact_lock会调用get_disk增加模块的引用计数。
Add_disk之后调用register_disk,它会调用blkdev_get,最终调用do_open尝试打开盘,增加引用计数,然后调用blkdev_put来减少引用计数。
add_disk
blk_register_region(传入exact_lock,而exact_lock会调用get_disk增加模块的引用计数, 引用计数哪里减的了? )
register_disk
blkdev_get
do_open (增加模块的引用计数)
blkdev_put(减小模块的引用计数))
blk_register_queue
最终: add_disk 不会增加模块的引用计数
open_by_devnum
blkdev_get
__blkdev_get
Do_open
Get_gendisk
Kobj_lookup
Try_module_get
p->lock(exact_lock)
get_disk
try_module_get
module_put
这个可以解释打开块设备,系统会增加模块的引用计数。
第二次(或以上)打开相同的块设备, 模块的引用计数是不增加的。 因为后面又有一次module_put
注销设备的理解
设备被注销,有两方面的含义:
一: 不接受新的请求。
二: 已有的请求全部返回
del_gendisk
invalidate_partition
fsync_bdev(保证第二点)
关于第二点 “已有的请求全部返回”, 是指哪一层给我(指块设备)请求, 我del_gendisk可以保证请求全部返回给哪一层。“那一层再向它的上层的同步,我无法保证!”
谁是请求的发起者, 谁就要去做请求回来的同步!!