Linux内核 get_fs_type()

函数:get_fs_type()

get_fs_type()函数用于根据输入参数的名字*name,获取对应文件系统类型的描述符信息,文件系统类型的描述符信息保存在函数的返回结果struct file_system_type中。

文件包含:

#include <linux/fs.h>

函数定义:

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

函数定义格式:

struct file_system_type *get_fs_type(const char *name)

输入参数说明:

  • name:是字符串型指针变量,表示文件系统的类型名。

返回参数说明:

  • 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.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所示的结果。

Linux内核 get_fs_type()

结果分析:

在get_fs_type()函数测试过程中,传入的参数分别是“ext3”、 “ext4” 、“ecryptfs”,由输出结果可以判断以上几种文件系统类型是存在的。

扩展分析:

去掉对文件系统名为“kernel_API”的注释,重新编译模块,执行如下命令,出现如图B所示的结果。

Linux内核 get_fs_type()

结果分析:

从图B可以看出,名为kernel_API的文件系统在笔者的系统中不存在。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!