2011-12-19 4 views
2

パス名を取得する方法、または特定のinodeからdentryまたはstruct fileを取得する必要があります。特定のiノードからパス名またはdentryまたはstructファイルを取得する方法はありますか?

私はパス名からstruct fileを得るためにfile_openを使用していましたが、常にカーネルパニックを与えました。私は自分のinodeリストからのinodeをパス名から比較したり、ディスク内のすべてのinodeを比較して対応するパス名を見つけたり、自分のinodeリストと比較する方法が必要です。

答えて

0

これは一般的には非常に困難です。

iノードには何千ものパス名が含まれている場合があります。すべての名前は同じように "有効"です。複数のリンクをサポートしていないファイルシステムであっても、ファイルはシステム内の他の場所に何千回もバインドマウントできます。どちらもAppArmorTOMOYOmandatory access controlシステム

は、パス名に依存している - しかし、で巨大差異:アクセス制御は、特定の名前で開かれた特定ファイルディスクリプタ、上で実行され、両方のツールはを使用しています特定の名前。

iノードのパス名を見つける方法の詳細については、aa_get_name()またはsecurity/tomoyo/file.cファンクションtomoyo_get_realpath()を参照してください。追加のサポート情報があります。単純なinodeオブジェクトから、あなたはおそらく運がないと思う。

+0

私の仕事は、ブロックが与えられたファイル を読み書きするために、私は、次の実装だということをシステムコールすることです:、filp​​_open機能(パス、O_CREATによって作成されたinodeをキャッチシステムコールのPathパラメータに ステップを00777)(この作品)とリンクリストを追加します。 次に、このファイルのパスを取得したinodeをパラメータとして受け取り、それ以外の場合は1を返した場合はリストをチェックする関数を作成しました。 この関数をopen()システムコール内に配置しますが、filp​​_open FLAG、x)に続いてfilp_close()を実行すると、次のエラーが発生します。 – Leonardo

+0

O_CREAT FLAG = x = 00777 - >カーネルのメモリがすぐにカーネルブートを満たしています FLAG = 0およびx = O_RDONLY - >カーネルブート時のカーネルパニック – Leonardo

+0

おそらく元の質問をこの説明で編集するほうがよいでしょう - コメントボックスに収まる内容を書くことは非常に難しく、読みやすいです。 :) – sarnold

1

このサンプルコードは、各iノードオブジェクトは、1つまたは複数のdentriesはハードリンクを持っている場合には、このオブジェクトファイルを持つことになります2.6.xx

struct dentry *sample_dentry = NULL; 
struct inode *tmp_inode = &inode_need_to_get; 
struct list_head *tmp_list = NULL; 
list_for_each(tmp_list, &(tmp_inode->i_dentry)) 
{ 
    sample_dentry = list_entry(tmp_list, struct dentry, d_alias); 
    printk(KERN_EMERG, "name of file is %s\n", sample_dentry->d_iname); 
} 

Linuxカーネルのバージョンではうまく動作します。

関連する問題