获取内核模块中的所有挂载点

时间:2017-10-05 17:05:42

标签: c linux linux-kernel kernel-module

我试图获取内核模块中的所有挂载点。以下是我提出的建议。它因为strcat而段错误。这是获取挂载点的正确方法吗?这会有用吗?如果是这样我如何修复段错误?如果没有,如何在linux内核模块中获取挂载点?

我已经尝试了cycle the whole namespace looking for mountpoint roots that match,但是从2003年开始,内核发生了很大的变化,所以它基本没用。还尝试了get filesystem mount point in kernel module,但是从2012年开始,它已经过时了。

static int __init misc_init(void)
{
    struct path path;
    struct dentry *thedentry;
    struct dentry *curdentry;

    kern_path("/", LOOKUP_FOLLOW, &path);
    thedentry = path.dentry;
    list_for_each_entry(curdentry, &thedentry->d_subdirs, d_child)
    {
        kern_path(strncat("/", curdentry->d_name.name, strlen(curdentry->d_name.name)), LOOKUP_FOLLOW, &path);
        if (path_is_mountpoint(&path))
        {
            printk("%s: is a mountpoint", curdentry->d_name.name);
        }
        else
            printk("%s: is not a mountpoint", curdentry->d_name.name);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

dentry结构中有标志。 d_flags。并且有一个标志DCACHED_MOUNTED。获取当前指针。那里的fs_struct。然后是根。这为您提供了当前文件系统的根目录。从那里循环通过所有子目录和如果d_flags&然后,DCACHE_MOUNTED传递它是一个挂载点。

ssize_t read_proc(struct file *filp, char *buf, size_t len, loff_t *offp )
{
    struct dentry *curdentry;

    list_for_each_entry(curdentry, &current->fs->root.mnt->mnt_root->d_subdirs, d_child)
    {
        if ( curdentry->d_flags & DCACHE_MOUNTED)
            printk("%s is mounted", curdentry->d_name.name);
    }
    return 0;
}

答案 1 :(得分:0)

以下是获得所有挂载点的更优化方法,无需检查系统的所有dentries。

struct mnt_namespace *ns = current->nsproxy->mnt_ns;
struct mount *mnt;

list_for_each_entry(mnt, &ns->list, mnt_list) {
...do something with each mnt...
}

请注意,此代码不会保留namespace_sem,因此不能保证通过mnt_list迭代的结果。然而,恕我直言,它是最小的并不比没有更少的正确,而不是遍历所有dentries没有持有安装锁。