struct fc_contextを介して完全なマウントポイントパス名を取得する方法

struct fc_contextを介して完全なマウントポイントパス名を取得する方法

fsconfig私のカーネルモジュールは、読み取り専用のマウントポイントの再マウントに関連するタスクを管理するシステムコールフックを実装しました。たとえば、ユーザーが実行した場合は、フック内の文字列を抽出する必要がありますmount /dev/sda /tmp/mytest -o remount,ro/tmp/mytestfsconfig

これを達成するために、ファイル記述子を介して構造にアクセスするカーネルfs_contextの方法を調べました。私の目標は、fsconfigシステムコール中にこの構造を介してマウントポイントパスを取得することです。

dentry_path_raw最初はstart fromのような関数を試してみましたが、結果のfc_context->dentry文字列は単純で、"/"私の要件に合っていませんでした。また、を使用してナビゲートしたがシステムコールからアクセスできないとを含む構造がd_path必要なので、このアプローチは実用的ではありません。pathdentryvfsmountvfsmountfsconfig

__is_local_mountpoint最後に、カーネルのソースコードでこの関数を見つけました。(fs/namespace.c)。この関数は現在を介して現在のジョブの名前空間にアクセスし、すべてのマウントポイントを繰り返すことを提案します。このコードを適用して、各マウントポイントの mnt_root を fs_context ルートと比較し、そのマウントを正常に識別しました。コードはここにあります。

ns =  current->nsproxy->mnt_ns;
lock_ns_list(ns);
list_for_each_entry(mnt, &ns->list, mnt_list) {
    if (fc->root == mnt->mnt.mnt_root) {
        target_dentry = mnt->mnt.mnt_root;
        path.dentry = target_dentry;
        path.mnt = &mnt->mnt;
        break;
    }
}
unlock_ns_list(ns);

namespace_semしかし、名前空間.cでの使用には深刻な問題があります。namespace_semstatic( ) と宣言すると、static DECLARE_RWSEM(namespace_sem);モジュールの内部に直接アクセスできず、潜在的なリスクがあることを意味します。

今私の主な質問は次のとおりです。

  1. fs_contextカーネルコードを変更せずにマウントポイントパスを取得する安全な方法はありますか? (fs_context常にマウントされたファイルシステムに対応すると仮定します。)
  2. マウントポイントの繰り返しに制限されている場合、セマフォに安全にアクセスできないという問題をどのように解決しますか?

(カーネルバージョン> = 6.6と仮定できます。)

関連情報