与えられたinodeからパス名やdentryやstructファイルを取得する方法は?

与えられたinodeからパス名またはdentryを取得する方法を知る必要があります。または struct file

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

3

2 答え

このサンプルコードはLinuxカーネルバージョン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);
}

このファイルにハードリンクがある場合は、各iノードオブジェクトに1つ以上のdentriesオブジェクトがあります。

2
追加された

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

inodeは何千ものパス名を持つことがあります。すべての名前は同じように "有効"です。複数のリンクをサポートしていないファイルシステムであっても、ファイルはシステム内の他の場所に何千回もバインドマウントできます。

AppArmor TOMOYO 必須アクセス制御システムはパス名に依存していますしかし、巨大な違いがあります:アクセス制御は特定の名前で開かれた特定のファイル記述子で実行され、 em>特定の名前。

aa_get_name()または security/tomoyo/file.c 関数 tomoyo_get_realpath() security/apparmor/path.c は、追加のサポート情報が与えられた場合に、iノードからパス名を見つける方法の詳細を示します。単純なinodeオブジェクトから、あなたはおそらく運がないと思う。

1
追加された
この説明で元の質問を編集する方がいいでしょう。コメントボックスに収まるコンテンツを書くことは非常に難しく、読みやすいです。 :)
追加された 著者 sarnold,
私の仕事は、ファイルの読み書きをブロックするシステムコールを作成することです。私は以下を実装しています:filp_open関数(path、O_CREAT、00777)によって作成されたinodeを捕まえたシステムコールのPathパラメータ)、リンクリストを追加します。次に、このファイルのパスを取ったinodeをパラメータとする関数を作成し、それ以外の場合は0を返します。この関数をopen()システムコール内に配置しますが、filp​​_open(path、FLAG、x )に続いてfilp_close()が発生すると、次のエラーが発生します。
追加された 著者 Leonardo,
O_CREAT FLAG = x = 00777 - >カーネル・メモリがすぐにカーネル・ブートを満たします。FLAG = 0およびx = O_RDONLY - >カーネル・ブート時のカーネル・パニック
追加された 著者 Leonardo,