Linux内核API inode_sub_bytes

inode_sub_bytes()函数的功能是减少inode节点的字节数,减少的量由参数loff_t bytes决定。函数执行过程是首先把减少的量右移9位与inode->i_blocks相减,实现先减去大于一个扇区部分的字节数,然后将不足一个扇区的字节与inode->i_bytes相减,这样就完成了节点字节数的减少。

inode_sub_bytes文件包含

#include <linux/fs.h>

inode_sub_bytes函数定义

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

函数定义格式:

void inode_sub_bytes(struct inode *inode, loff_t bytes)

inode_sub_bytes输入参数说明

  • inode:要被减少字节的struct inode结构体变量,其定义及详细说明参考极客笔记中d_find_alias()函数的参数说明部分。

bytes:要减少的字节数,其定义如下:

typedef __kernel_loff_t            loff_t;

其中__kernel_loff_t定义如下:

typedef long long __kernel_loff_t;

inode_sub_bytes返回参数说明

  • inode_sub_bytes()函数无返回值。

inode_sub_bytes实例解析

编写测试文件:inode_sub_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_sub_bytes_init(void)
{
    struct dentry *dentry;
    struct inode *inode;
    loff_t num = 1024;
    dentry = current->fs->pwd.dentry;     //获取当前文件的入口目录
    inode = dentry->d_inode;              //获取当前文件对应的inode节点

    // 获取inode所占的字节数
    unsigned long data6 = inode_get_bytes(inode);
    printk("The result of \"inode_get_bytes\" is :%ld\n", data6);
                                          // 显示inode节点的字节数

    // 将inode减少1024个字节
    inode_sub_bytes(inode, num);
    printk("Exec \"inode_sub_bytes\" begins:\n");

    /*显示函数调用之后inode节点的字节数*/
    printk("After Exec, The result is :%ld\n", inode_get_bytes(inode));
    return 0;
}

模块退出函数:

void inode_ sub_bytes_exit(void)
{
    printk("Goodbye inode_sub_bytes\n");
}

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

module_init(inode_ sub_bytes_init);
module_exit(inode_ sub_bytes_exit);

实例运行结果及分析:

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

Linux内核API inode_sub_bytes

结果分析:

由图可以看出函数inode_sub_bytes()执行之前文件的inode大小是4096字节,函数执行后,文件的inode节点大小变为3072字节,减少了1024字节,正好与函数的第二个参数相同,说明函数inode_sub_bytes()能够减少文件的inode大小。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API inode_sub_bytes
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址