get_fs_type()函数用于根据输入参数的名字*name
,获取对应文件系统类型的描述符信息,文件系统类型的描述符信息保存在函数的返回结果struct file_system_type中。
get_fs_type文件包含
#include <linux/fs.h>
get_fs_type函数定义
在内核源码中的位置:linux-3.19.3/fs/_filesystems.c
函数定义格式:
struct file_system_type *get_fs_type(const char *name)
get_fs_type输入参数说明
name
:是字符串型指针变量,表示文件系统的类型名。
get_fs_type返回参数说明
get_fs_type()
函数的返回值是一个file_system_type结构体类型的变量,保存文件系统类型的描述符信息,其定义如下:
struct file_system_type {
const char *name; /*文件系统名*/
int fs_flags; /*文件系统类型标志*/
#define FS_REQUIRES_DEV 1
#define FS_BINARY_MOUNTDATA 2
#define FS_HAS_SUBTYPE 4
#define FS_USERNS_MOUNT 8
#define FS_USERNS_DEV_MOUNT 16
#define FS_RENAME_DOES_D_MOVE 32768
struct dentry *(*mount) (struct file_system_type *, int, const char *, void *);
/* 挂载文件系统的方法*/
void (*kill_sb) (struct super_block *); /*删除超级块的方法*/
struct module *owner; /*指向实现文件系统的模块的指针*/
struct file_system_type * next; /*指向文件系统类型链表下一个元素的指针*/
struct list_head fs_supers; /*具有相同文件系统类型的超级块对象链表的头*/
……
};
get_fs_type实例解析
编写测试文件:get_fs_type.c
头文件声明如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
模块初始化函数:
int get_fs_type_init(void)
{
const char *name1="ext3", *name2="ext4", *name3="ecryptfs", *name4="kernel_API";
struct file_system_type *fs1=get_fs_type(name1); //查找的文件系统类型名为“ext3”
if(fs1==NULL)
printk("Get filesystem type ext3 failed\n");
else
printk("The filesystem's name is :%s\n", fs1->name);
// 显示查找结果中的文件系统类型名
struct file_system_type *fs2=get_fs_type(name2); //查找的文件系统类型名为“ext4”
if(fs2==NULL)
printk("Get filesystem type ext4 failed\n");
else
printk("The filesystem's name is :%s\n", fs2->name);
// 显示查找结果中的文件系统类型名
struct file_system_type *fs3=get_fs_type(name3); //查找的文件系统类型名为“ecryptfs”
if(fs3==NULL)
printk("Get filesystem type ecrytfs failed\n");
else
printk("The filesystem's name is :%s\n", fs3->name);
// 显示查找结果中的文件系统类型名
/*
struct file_system_type *fs4=get_fs_type(name4);
// 查找的文件系统类型名为“kernel_API”
if(fs4==NULL)
printk("Get filesystem type kernel_API failed\n");
else
printk("The filesystem's name is :%s\n", fs4->name);
// 显示查找结果中的文件系统类型名
*/
return 0;
}
模块退出函数:
void get_fs_type_exit(void)
{
printk("Goodbye get_fs_type\n");
}
模块初始化及退出函数调用:
module_init(get_fs_type_init);
module_exit(get_fs_type_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod get_fs_type.ko插入模块,然后执行命令dmesg -c,会出现如图A
所示的结果。
结果分析:
在get_fs_type()函数测试过程中,传入的参数分别是“ext3”、 “ext4” 、“ecryptfs”,由输出结果可以判断以上几种文件系统类型是存在的。
扩展分析:
去掉对文件系统名为“kernel_API”的注释,重新编译模块,执行如下命令,出现如图B
所示的结果。
结果分析:
从图B
可以看出,名为kernel_API的文件系统在笔者的系统中不存在。