Linux内核之获取文件系统超级块:sget用法实例(六十八)

发布于:2024-05-08 ⋅ 阅读:(25) ⋅ 点赞:(0)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🌻1.前言

本篇目的:Linux内核之获取文件系统超级块:sget用法实例

🌻2.Linux内核sget函数介绍

  • sget 函数是 Linux 内核中的一个重要函数,用于获取文件系统的超级块结构。超级块是文件系统的关键数据结构,包含有关文件系统的重要信息,如块大小、inode 结构、挂载点等。

  • 该函数的作用是根据指定的文件系统类型、测试函数和设置函数,以及其他参数,尝试获取文件系统的超级块。具体来说,它的作用包括:

  • 文件系统超级块的获取:通过指定的文件系统类型,函数尝试获取与之对应的超级块。这使得在进行文件系统相关操作之前能够获取到必要的文件系统信息。

  • 超级块的匹配和创建:函数通过调用提供的测试函数来测试现有的超级块是否满足调用者的特定条件。如果找到匹配的超级块,则返回该超级块;如果没有找到匹配的超级块,则调用设置函数来创建新的超级块。

  • 权限检查:在尝试获取超级块之前,函数会进行权限检查,确保调用者具有适当的权限。如果调用者没有足够的权限,函数将返回相应的错误码,表示权限不足。

  • 用户命名空间的处理:函数会获取当前进程的用户命名空间,并根据情况进行处理。如果指定了子挂载标志,函数会使用初始用户命名空间来覆盖当前用户命名空间,以确保正确的权限检查。

  • sget 函数在 Linux 内核中扮演着关键的角色,为文件系统操作提供了必要的基础支持,包括超级块的获取、匹配和创建,以及权限检查等功能。

🌻3.代码实例

🐓3.1 挂载新文件系统驱动

#include <linux/fs.h>

// 定义文件系统类型
extern struct file_system_type my_fs_type;

// 在驱动初始化函数中挂载文件系统
static int __init my_fs_init(void)
{
    struct super_block *sb;

    // 尝试挂载文件系统
    sb = sget(&my_fs_type, my_fs_test, my_fs_set, 0, NULL);
    if (IS_ERR(sb)) {
        printk(KERN_ERR "Failed to mount my_fs: %ld\n", PTR_ERR(sb));
        return PTR_ERR(sb);
    }

    printk(KERN_INFO "my_fs mounted successfully!\n");
    return 0;
}
module_init(my_fs_init);

🐓3.2 获取已挂载文件系统的超级块

#include <linux/fs.h>
extern struct file_system_type my_fs_type;

// 在某个驱动函数中获取已挂载文件系统的超级块
static void some_driver_function(void)
{
    struct super_block *sb;

    // 尝试获取已挂载文件系统的超级块
    sb = sget(&my_fs_type, NULL, NULL, 0, NULL);
    if (IS_ERR(sb)) {
        printk(KERN_ERR "Failed to get superblock of my_fs: %ld\n", PTR_ERR(sb));
        return;
    }

    // 获取超级块成功,可以使用 sb 进行操作

    // 释放超级块
    deactivate_locked_super(sb);
}

🐓3.3 在已挂载文件系统上进行子挂载

#include <linux/fs.h>
extern struct file_system_type my_fs_type;

// 在某个驱动函数中进行子挂载
static void some_driver_function(void)
{
    struct super_block *sb;

    // 尝试在已挂载的文件系统上进行子挂载
    sb = sget(&my_fs_type, NULL, NULL, SB_SUBMOUNT, NULL);
    if (IS_ERR(sb)) {
        printk(KERN_ERR "Failed to do submount on my_fs: %ld\n", PTR_ERR(sb));
        return;
    }
    deactivate_locked_super(sb);
}