Linux内核API __mnt_is_readonly

__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,会出现如图所示的结果。

Linux内核API __mnt_is_readonly

结果分析:

由于传入的结构体是当前进程下文件系统中的vfsmount结构体,一定是可读可写的。而__mnt_is_readonly()函数返回值为0,说明该vfsmount并非是只读的。然后又经过mnt_want_write()(注:此函数的具体说明参考极客笔记中的mnt_want_write()函数说明)判断,返回值为0,表示该传入的结构体是可写的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程