Linux内核API vfs_statfs

函数vfs_statfs()根据第一个参数dentry获取整个文件系统的一些基本信息,将其保存在函数的第二个参数buf中,此基本信息包括当前文件系统的类型、文件系统的块数目、文件系统的块大小、文件系统的文件数目、文件系统的文件名字长度等信息。

vfs_statfs文件包含

#include <linux/fs.h>

vfs_statfs函数定义

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

函数定义格式:

int vfs_statfs(struct path * path, struct kstatfs *buf)

vfs_statfs输入参数说明

  • 函数的第一个参数是struct dentry结构体类型的指针,保存当前文件系统的部分信息,对于dentry结构体,其定义说明参考极客笔记中d_alloc()函数的参数说明。
  • 函数的第二个参数是一个struct kstatfs结构体类型的指针,用于保存当前文件系统的一些信息,见文件linux-3.19.3/include/linux/statfs.h,格式如下:
struct kstatfs {
    long f_type;           /*文件系统的类型*/
    long f_bsize;          /*文件系统的块大小*/
    u64 f_blocks;          /*文件系统块的数目*/
    u64 f_bfree;
    u64 f_bavail;          /*文件系统中可用的块数目*/
    u64 f_files;           /*文件系统中文件的数目*/
    u64 f_ffree;
    __kernel_fsid_t f_fsid;
    long f_namelen;        /*文件系统的名字长度*/
    long f_frsize;
    long f_flags;
    long f_spare[4];
};

vfs_statfs返回参数说明

  • 此函数的返回结果是int型的变量,可能的取值是0和负数,返回0代表获取信息成功;返回负数代表获取当前文件系统的信息失败。

vfs_statfs实例解析

编写测试文件:vfs_statfs.c

头文件声明如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/statfs.h>
#include <linux/sched.h>
#include <linux/fs_struct.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

static int vfs_statfs_init(void)
{
    int result=0, i=0;
    struct path path;
    struct dentry *dentry=NULL;
    static struct kstatfs buf;
    // 输出当前的文件系统的基本信息
    printk("into vfs_statfs_init\n");
    dentry = current->fs->pwd.dentry;
    path.dentry = dentry;
    path.mnt = current->fs->pwd.mnt;

    printk("the f_bsize is :%ld\n", buf.f_bsize);
    printk("the f_frsize is :%ld\n", buf.f_frsize);
    printk("the f_type is :%ld\n", buf.f_type);
    printk("the f_blocks is :%lld\n", buf.f_blocks);
    printk("the f_bfree is :%lld\n", buf.f_bfree);
    printk("the f_bavail is :%lld\n", buf.f_bavail);
    printk("the f_files is :%lld\n", buf.f_files);
    printk("the f_ffree is :%lld\n", buf.f_ffree);
    printk("the f_fsid is :%ld\n", buf.f_fsid);
    printk("the f_namelen is :%ld\n", buf.f_namelen);
    for(i=0; i<4; i++)
        printk("the f_spare[%d] is :%ld\n", i, buf.f_spare[i]);

    // 获取文件系统的一些基本信息,将其保存在函数的第二个参数buf中
    result= vfs_statfs(&path, &buf);

    // 输出获取的文件系统的基本信息
    printk("The result of function vfs_statfs is :%d\n", result);
    printk("the new value of the buf after vfs_statfs:\n");
    printk("the new f_bsize is :%ld\n", buf.f_bsize);
    printk("the new f_frsize is :%ld\n", buf.f_frsize);
    printk("the new f_type is :%ld\n", buf.f_type);
    printk("the new f_blocks is :%lld\n", buf.f_blocks);
    printk("the new f_bfree is :%lld\n", buf.f_bfree);
    printk("the new f_bavail is :%lld\n", buf.f_bavail);
    printk("the new f_files is :%lld\n", buf.f_files);
    printk("the new f_ffree is :%lld\n", buf.f_ffree);
    printk("the new f_fsid is :%ld\n", buf.f_fsid);
    printk("the new f_namelen is :%ld\n", buf.f_namelen);
    for(i=0; i<4; i++)
        printk("the new f_spare[%d] is :%ld\n", i, buf.f_spare[i]);
    printk("out vfs_statfs_init\n");
    return 0;
}

模块卸载函数定义:

static void vfs_statfs_exit(void)
{
    printk("Goodbye vfs_statfs\n");
}

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

module_init(vfs_statfs_init);
module_exit(vfs_statfs_exit);

实例运行结果及分析:

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

Linux内核API vfs_statfs

结果分析:

由图中可以看出函数vfs_statfs()返回结果是0,说明函数成功获取文件系统的信息,由输出结果可以看出当前文件系统的块大小定义为4096,文件系统的块总数是75761252,可用的块数目为66886048,当前文件总数是19251200,文件的名字长度最长为255个字符等信息。

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

评论 抢沙发

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