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
所示的结果。
结果分析:
首先用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()。
注:在进行测试之前,要对文件进行备份。