我试图获取内核模块中的所有挂载点。以下是我提出的建议。它因为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;
}
答案 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, ¤t->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没有持有安装锁。