发现了吗,最特别的复制了 rdev 这个值,在 Linux 下设备都有设备号,分为 major 和 minor ,其实我们可以认为就是一串数字,它只是用于区分每一个设备,现在又要考你了,如何从一串数字到一个数据结构呢?我们学的哈希,学的数组,是不是都可以,只要想办法把数字作为索引是不是就可以了?最笨的办法就是建立一个设备号为下标的全局数组,那么直接用设备号就得到目标数据结构了。
static struct block_device *bd_acquire(struct inode *inode)
{
struct block_device *bdev;
// 如果 bdev 字段非空,我们增加计数就可以退出
spin_lock(&bdev_lock);
bdev = inode->i_bdev;
if (bdev) {
ihold(bdev->bd_inode);
spin_unlock(&bdev_lock);
return bdev;
}
spin_unlock(&bdev_lock);
// 这是块设备第一次打开的情况,还没有初始化 bdev
bdev = bdget(inode->i_rdev);
if (bdev) {
spin_lock(&bdev_lock);
if (!inode->i_bdev) {
/*
* We take an additional reference to bd_inode,
* and it's released in clear_inode() of inode.
* So, we can access it via ->i_mapping always
* without igrab().
*/
ihold(bdev->bd_inode);
inode->i_bdev = bdev;
inode->i_mapping = bdev->bd_inode->i_mapping;
list_add(&inode->i_devices, &bdev->bd_inodes);
}
spin_unlock(&bdev_lock);
}
return bdev;
}