__mnt_is_readonly()函数的功能是检查一个虚拟文件系统装载点结构体(vfsmount结构体)是否是只读的。该函数是分别通过mnt->mnt_flags
字段与宏MNT_READONLY相“与”, mnt->mnt_sb->s_flags
和MS_RDONLY相“与”,若结果为正,则返回值1,即该vfsmount结构体是只读的。反之,返回值为0表示权限为非只读。
__mnt_is_readonly文件包含
#include <linux/mount.h>
__mnt_is_readonly函数定义
在内核源码中的位置:linux-3.19.3/fs/namespace.c
函数定义格式:
int __mnt_is_readonly(struct vfsmount *mnt)
注:宏MNT_READONLY定义在linux-3.19.3/include/linux/mount.h中,值为0x40。宏MS_RDONLY定义在linux-3.19.3/include/linux/fs.h中,值为1。
__mnt_is_readonly输入参数说明
mnt
:需要被判断是否只读的vfsmount结构体,定义见文件linux-3.19.3/include/linux/mount.h,格式如下:
struct vfsmount {
struct dentry *mnt_root; //指向这个文件系统根目录的dentry
struct super_block *mnt_sb; //指向这个文件系统的超级块对象
int mnt_flags; //标志
};
__mnt_is_readonly返回参数说明
__mnt_is_readonly()
函数有两种返回结果,0和1。如果该vfsmount结构体是只读的,返回值为1;否则,返回值为0。
__mnt_is_readonly实例解析
编写测试文件:__mnt_is_readonly.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>
#include <linux/fdtable.h>
#include <linux/mount.h>
#include <linux/seq_file.h>
MODULE_LICENSE("GPL");
模块初始化函数:
int __mnt_is_readonly_init(void)
{
int data1, data2;
struct vfsmount *mnt;
mnt = current->fs->pwd.mnt;
data1=__mnt_is_readonly(mnt); //只读权限判断
if(data1) //测试返回结果
printk("Current mntfs is read only. \n");
else
printk("Current mntfs is not only read. \n");
data2=mnt_want_write(mnt); //写权限判断
if(data2)
printk("Current mntfs is not en_write. \n");
else
printk("Current mntfs is enable write. \n");
return 0;
}
模块退出函数:
void __mnt_is_readonly_exit(void)
{
printk("Goodbye __mnt_is_readonly\n");
}
模块初始化及退出函数调用:
module_init(__mnt_is_readonly_init);
module_exit(__mnt_is_readonly_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod __mnt_is_readonly.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
结果分析:
由于传入的结构体是当前进程下文件系统中的vfsmount结构体,一定是可读可写的。而__mnt_is_readonly()函数返回值为0,说明该vfsmount并非是只读的。然后又经过mnt_want_write()(注:此函数的具体说明参考极客笔记中的mnt_want_write()函数说明)判断,返回值为0,表示该传入的结构体是可写的。