2017-10-05 97 views
1

我正在尝试获取内核模块中的所有挂载点。以下是我想到的。它由于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; 
} 
+1

你有没有读过'man strncat'?你会感到惊讶。 –

+0

是的,我有。我试过strjoin,strlcat,strncat,strcat。 – testfile

+0

...和'strlen(curdentry-> d_name.name)),'根本没有意义,要么 – wildplasser

回答

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, &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; 
} 
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是不能保证的结果。但是,恕我直言,它至少不比正在穿越所有没有固定安装锁的细节更正确。