获取内核模块中的所有挂载点
问题描述:
我正在尝试获取内核模块中的所有挂载点。以下是我想到的。它由于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;
}
答
在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;
}
答
可能是以下更优化的方式来获取所有挂载点w/o检查系统的所有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是不能保证的结果。但是,恕我直言,它至少不比正在穿越所有没有固定安装锁的细节更正确。
你有没有读过'man strncat'?你会感到惊讶。 –
是的,我有。我试过strjoin,strlcat,strncat,strcat。 – testfile
...和'strlen(curdentry-> d_name.name)),'根本没有意义,要么 – wildplasser