函数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,出现如图所示的结果。
结果分析:
由图中可以看出函数vfs_statfs()返回结果是0,说明函数成功获取文件系统的信息,由输出结果可以看出当前文件系统的块大小定义为4096,文件系统的块总数是75761252,可用的块数目为66886048,当前文件总数是19251200,文件的名字长度最长为255个字符等信息。