2017-10-05 3 views
1

カーネルモジュール内のすべてのマウントポイントを取得しようとしています。以下は私が思いついたものです。それはstrcatのためにsegfaultsです。これはマウントポイントを取得する正しい方法ですか?これは使えますか?もしそうなら、私はsegfaultをどのように修正するのですか?もしそうでなければ、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

はい私は持っています。 Iveは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

システムのすべてのdentryをチェックすることなく、すべてのマウントポイントを取得するには、以下の方法が最適です。

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を通して繰り返し処理の結果は保証されません。しかし、IMHOは、マウントロックを保持していないすべての歯列を横断するのと同じくらい、それほど正確ではありません。

関連する問題