函数I_BDEV()在实现过程中调用了函数BDEV_I(),首先申请一个结构体struct bdev_inode变量,然后用参数inode初始化结构体struct bdev_inode变量的vfs_inode字段,此结构体的定义见文件linux-3.19.3/fs/block_dev.c,如下:
struct bdev_inode
{
struct block_device bdev; //inode节点对应的block_device
struct inode vfs_inode; //inode节点
};
结构体构造完之后,返回结构体的bdev字段,此字段在函数调用过程中并没有被初始化,只是为其分配了空间。
I_BDEV文件包含
#include <linux/fs.h>
I_BDEV函数定义
在内核源码中的位置:linux-3.19.3/fs/block_dev.c
函数定义格式:
inline struct block_device *I_BDEV(struct inode *inode)
I_BDEV输入参数说明
inode
:用于初始化结构体struct bdev_inode变量的inode字段的值。对于struct inode结构体,其定义及详细说明请参考极客笔记中d_find_alias()函数的参数说明部分。
I_BDEV返回参数说明
- 函数
I_BDEV()
返回新构造的struct bdev_inode结构体变量的bdev字段的指针,此字段用于保存与字段vfs_inode相对应的block_device结构体变量的信息。结构体struct block_device的定义及详细解释请参考极客笔记函数get_super()分析文档的输入参数说明部分。
I_BDEV实例解析
编写测试文件:I_BDEV.c
头文件声明如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
#include <linux/fs.h>
MODULE_LICENSE("GPL");
模块初始化函数:
int I_BDEV_init(void)
{
struct inode *inode;
inode = current->fs->pwd.dentry->d_inode; //获取当前文件的inode节点
blkdev = *I_BDEV(inode); //调用函数
if(blkdev==NULL)
printk("I_BDEV failed\n");
else
printk("the size of the block device is %d\n", blkdev->bd_block_size);
//显示block_device的大小
return 0;
}
模块退出函数:
// 模块退出函数定义
void I_BDEV_exit(void)
{
printk("Goodbye I_BDEV\n");
}
模块初始化及退出函数调用:
module_init(I_BDEV_init);
module_exit(I_BDEV_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod I_BDEV.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
结果分析:
返回结果为524288,说明block_device的大小为524288。