Linux内核 I_BDEV()

函数:I_BDEV()

函数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字段,此字段在函数调用过程中并没有被初始化,只是为其分配了空间。

文件包含:

#include <linux/fs.h>

函数定义:

在内核源码中的位置:linux-3.19.3/fs/block_dev.c

函数定义格式:

inline struct block_device *I_BDEV(struct inode *inode)

输入参数说明:

  • inode:用于初始化结构体struct bdev_inode变量的inode字段的值。对于struct inode结构体,其定义及详细说明请参考酷客教程d_find_alias()函数的参数说明部分。

返回参数说明:

  • 函数I_BDEV()返回新构造的struct bdev_inode结构体变量的bdev字段的指针,此字段用于保存与字段vfs_inode相对应的block_device结构体变量的信息。结构体struct block_device的定义及详细解释请参考酷客教程函数get_super()分析文档的输入参数说明部分。

实例解析:

编写测试文件: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,会出现如图所示的结果。

Linux内核 I_BDEV()

结果分析:

返回结果为524288,说明block_device的大小为524288。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!