Linux内核 inode_get_bytes()

函数:inode_get_bytes()

inode_get_bytes()函数的功能是得到整个inode节点的总字节数。函数工作原理是将文件的扇区(即inode->i_blocks)通过位运算左移9位(即扇区数乘以512),再加上本身inode的字节数(即inode->i_bytes),得到整个inode节点的总字节数。

注:在ext3文件系统中,i_blocks是以扇区为单位的,每个扇区大小为512字节,因此单个文件的最大限制是232×512B=2TB。在ext3文件系统中,数据块大小为4KB,由于i_blocks可以以数据块大小为单位,其总文件系统大小可以扩充到16TB。

在本例中,文件系统是ext4,它虽然将块地址增加到48位,但是其兼容ext3文件系统。因此文件占用磁盘空间的大小还可以用512字节为单位的i_blocks来表示,所以这里是扇区数乘以512字节。

文件包含:

#include <linux/fs.h>

函数定义:

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

函数定义格式:

loff_t inode_get_bytes(struct inode *inode)

输入参数说明:

  • inode:进行操作的struct inode结构体变量。对于struct inode结构体,其定义及详细说明参考酷客教程d_find_alias()函数的参数说明部分。

返回参数说明:

  • inode_get_bytes()函数的返回值是loff_t型的数,即整个inode节点的字节数,其定义如下:
typedef __kernel_loff_t        loff_t;

其中__kernel_loff_t定义如下:

typedef long long __kernel_loff_t;

实例解析:

编写测试文件:inode_get_bytes.c

头文件声明如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");

模块初始化函数:

int inode_get_bytes_init(void)
{
    struct dentry *dentry;
    struct inode *inode;
    dentry = current->fs->pwd.dentry;
    inode = dentry->d_inode;

    // 输出文件所占的扇区数inode->i_blocks
    printk("The result of   \"inode->i_blocks\" is :%ld\n", inode->i_blocks);

    // 输出文件inode本身的字节数
    printk("The result of   \"inode->i_bytes\" is :%ld\n", inode->i_bytes);

    // 获得文件所占的总字节数
    unsigned long data1 = inode_get_bytes(inode);
    printk("The result of   \"inode_get_bytes\" is :%ld\n", data1);
    return 0;
}

模块退出函数:

void inode_get_bytes_exit(void)
{
    printk("Goodbye inode_get_bytes\n");
}

模块初始化及退出函数调用:

module_init(inode_get_bytes_init);
module_exit(inode_get_bytes_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod inode_get_bytes.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核 inode_get_bytes()

结果分析:

从图中可以看出,文件所占的扇区数inode->i_blocks等于8,通过位运算左移9位(即扇区数乘以512),再加上文件inode本身的字节数(inode->i_bytes)0,得到整个inode节点所占的总字节数为4096。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!