Linux内核API make_bad_inode

make_bad_inode()函数的作用是将参数inode标记为坏节点。函数首先是将该inode从inode的hash表中移除,用到的是remove_inode_hash()函数;接下来将inode结构体中的i_mode字段设为S_IFREG,将inode结构体中的i_atime、i_mtime、i_ctime字段全部通过current_fs_time()函数赋值,意思是修改时间为当前时间,然后将bad_inode_ops赋值给inode结构体中的i_op字段。

注:S_IFREG宏定义在linux-3.19.3/include/uapi/linux/stat.h中,值为0100000。current_fs_time()函数的作用就是获得当前时间,是以秒来表示的,表示为当前时间与1970年1月1日00:00:00相差的秒数。bad_inode_ops是指被标记为坏节点的操作。

make_bad_inode文件包含

#include <linux/fs.h>

make_bad_inode函数定义

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

函数定义格式:

void make_bad_inode(struct inode *inode)

make_bad_inode输入参数说明

  • inode:输入要使之成为坏节点struct inode结构体,其定义及详细说明参考极客笔记中d_find_alias()函数的参数说明部分。

make_bad_inode返回参数说明

  • make_bad_inode()函数无返回值。

make_bad_inode实例解析

编写测试文件:make_bad_inode.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");

模块初始化函数:

static int make_bad_inode_init (void)
{
    struct inode *inode;
    inode = current->fs->pwd.dentry->d_inode;       //获取当前文件的inode节点
    int resBefore = is_bad_inode(inode);

    // 判断是不是坏节点
    if(resBefore == 1)                              //判断结果显示
        printk(“It is a bad inode.\n”);
    else
        printk(“It is not a bad inode.\n”);

    make_bad_inode(inode);                          //将传入的inode设置为坏节点

    // 再次判断是不是坏节点
    int resAfter = is_bad_inode(inode);
    if(resAfter == 1)                               //判断结果显示
        printk(“It is a bad inode.\n”);
    else
        printk(“It is not a bad inode.\n”);
    return 0;
}

模块退出函数:

static void make_bad_inode_exit (void)
{
    printk("Goodbye fs_mod\n");
}

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

module_init(make_bad_inode_init);
module_exit(make_bad_inode_exit);

实例运行结果及分析:

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

Linux内核API make_bad_inode

Linux内核API make_bad_inode

结果分析:

首先用is_bad_inode函数判断当前工作目录下的节点是不是坏节点,返回值为0,说明不是坏节点,然后经过函数make_bad_inode(),将inode节点标记为坏节点,再次用is_bad_inode判断该节点,返回值为1,说明该节点已经被标记为坏节点了。

执行完make_bad_inode()函数之后,执行命令“ls”“cd ..”都会报错,如图A所示。重新打开一个终端,执行命令“ls -al make_bad_inode”,结果如图B所示。以上结果都说明,函数make_bad_inode()将文件夹“make_bad_inode”破坏,无法再访问,所以不要轻易对文件执行make_bad_inode()。

注:在进行测试之前,要对文件进行备份。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程