`do_new_mount_fc()`はどのようにext4のような実際のファイルシステムをマウントしますか?

tyChen

比較的古いLinuxカーネルソースコードでは、はdo_new_mount()を呼び出しvfs_kern_mount()、最終的にはを実行しますmount_fs()そして、この関数は以下のように実際のファイルシステムの関数を呼び出します


struct dentry *
mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
{
    struct dentry *root;
    struct super_block *sb;
......
    root = type->mount(type, flags, name, data);
......
    sb = root->d_sb;
......
}

しかし、比較的新しいLinuxカーネルソースコードでは、代わりにdo_new_mount()が呼び出さdo_new_mount_fc()れ、この関数が上記のように実際のファイルシステムのマウント関数を呼び出す方法がわかりません。

今の仕組みを教えてください。

マルコ・ボネッリ

「ファイルシステムコンテキスト」を介し新しいファイルシステムマウントAPIへの最近の移行のため、「通常の」関数呼び出しは見つかりませんあなたは関連する(かなり大規模な)パッチワークでより多くの情報を見つけることができます

上でリンクしたカーネルのドキュメントはすでにかなり良い説明をしているはずなので、全体を説明するつもりはありません(そして、私はLinux FS内部の専門家でもありません)。

「ファイルシステムコンテキスト」は基本的に、必要に応じて渡され、段階的に更新される有用な情報を含む構造です。つまり、vfs_get_tree()関数はファイルシステムのマウント可能なルートを作成し、それをfs_context構造体に保存do_new_mount_fc()して、実際のマウントに渡されて使用されるようになります。

(*) int vfs_get_tree(struct fs_context *fc);

     Get or create the mountable root and superblock, using the parameters in
     the filesystem context to select/configure the superblock.  This invokes
     the ->get_tree() method.

だから今do_new_mount()あなたはその関数が直前 に呼び出されているのを見るdo_new_mount_fc()

    fc = fs_context_for_mount(type, sb_flags);
    put_filesystem(type);
    if (IS_ERR(fc))
        return PTR_ERR(fc);

    if (subtype)
        err = vfs_parse_fs_string(fc, "subtype",
                      subtype, strlen(subtype));
    if (!err && name)
        err = vfs_parse_fs_string(fc, "source", name, strlen(name));
    if (!err)
        err = parse_monolithic_mount_data(fc, data);
    if (!err && !mount_capable(fc))
        err = -EPERM;
    if (!err)
        err = vfs_get_tree(fc); // <<<<<<<<<<<<<<<<<<<<<<< HERE
    if (!err)
        err = do_new_mount_fc(fc, path, mnt_flags);

    put_fs_context(fc);
    return err;
}

vfs_get_tree()関数呼び出しfc->ops->get_tree()の作成を担当する方法であるroot(それが存在しない場合)とに割り当てますfc->root

    error = fc->ops->get_tree(fc); // Here fc->root gets assigned.
    if (error < 0)
        return error;

この新しいAPIへの移行は、まだすべてのファイルシステムで完了しているわけではありません。まだ(たとえば、ext4のための)古いAPIを使用するファイルシステムについては、fs_context_for_mount()(で最初に呼び出される関数はdo_new_mount())を介してファイルシステムのコンテキストを作成し、alloc_fs_context()それはファイルシステムが新しいAPIをサポートしているかどうかをどのチェックし、そうでない場合、デフォルトのレガシーを使用していますファイルシステムコンテキスト操作のバージョン(実際、この最後のリンクには、「TODO:すべてのファイルシステムがこれを無条件にサポートするようにする」というコメントも表示されます)。

の場合get_tree()、レガシーバージョンはですlegacy_get_tree()。これ、実際に、呼び出すと予想されることを正確に実行しますfc->fs_type->mount(...)

/*
 * Get a mountable root with the legacy mount command.
 */
static int legacy_get_tree(struct fs_context *fc)
{
    struct legacy_fs_context *ctx = fc->fs_private;
    struct super_block *sb;
    struct dentry *root;

    root = fc->fs_type->mount(fc->fs_type, fc->sb_flags,
                      fc->source, ctx->legacy_data);
    if (IS_ERR(root))
        return PTR_ERR(root);

    sb = root->d_sb;
    BUG_ON(!sb);

    fc->root = root;
    return 0;
}

遅かれ早かれ、すべてのファイルシステムは、ファイルシステムコンテキストで新しいAPIを使用するように更新され、それらのlegacy_*関数は完全に削除さinit_fs_contextれ、ext4にfile_system_typeメソッドが表示されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ファイルシステム(ext4)はTRIM情報をどのように「保存」しますか?

分類Dev

ext4:ファイルシステムスペースをどのように説明しますか?

分類Dev

ext4:ファイルシステムスペースをどのように説明しますか?

分類Dev

initramfsはどのようにルートファイルシステムをマウントしますか?

分類Dev

個別のext4ブートパーティションを使用してext4からzfsルートファイルシステムに移行するにはどうすればよいですか?

分類Dev

ext4ファイルシステムのジャーナルにはどのようなデータが保存されていますか?

分類Dev

ext4ファイルシステムのオフセットを見つけるにはどうすればよいですか?

分類Dev

データを失うことなく、ext4パーティションをbtrfs(または他のファイルシステム)に変換するにはどうすればよいですか?

分類Dev

ext4およびbtrfsファイルシステムのブロックサイズを決定するにはどうすればよいですか?

分類Dev

Ubuntuにext4形式のファイルシステムをマウントするのが難しい

分類Dev

パーティション(ext4)のイメージを作成し、後でそれをマウントしてファイルを参照/復元するにはどうすればよいですか?

分類Dev

ext4ファイルシステムのiノードの数を増やすにはどうすればよいですか?

分類Dev

ext2ファイルシステムのマウント数を確認するにはどうすればよいですか?

分類Dev

デュアルブートインストールを実行しようとしています:SCSI2(0、0、0)のパーティション#1にあるタイプext4のファイルシステムのテストで、未修正のエラーが見つかりました

分類Dev

Linuxのファイルマネージャーを使用して、ファイルは実際にどのようにマウントされますか?

分類Dev

ext4はファイルのブロック数をどのように決定しますか?

分類Dev

ext4ファイルシステムのディレクトリに多くのファイルがあるとどうなりますか?

分類Dev

ext4ファイルシステムでエクステントサイズを変更するにはどうすればよいですか?

分類Dev

Ubuntuのインストール:タイプext4のファイルシステムをマウントしようとしました/失敗しました

分類Dev

Windowsマシンでext4ファイルシステムのみのソースコードを取得するにはどうすればよいですか?

分類Dev

Windowsマシンでext4ファイルシステムのみのソースコードを取得するにはどうすればよいですか?

分類Dev

ユーティリティ「fio」は、ファイルシステムがない未加工のフォーマットされていないデバイスでVFSのような操作をどのように実行しますか?

分類Dev

ファイルシステムのHTMLCSSのフォントをどのように使用しますか

分類Dev

LivecCDでext4ファイルパーティションを作成する際にUbuntuがスタックするのを修正するにはどうすればよいですか?

分類Dev

最近のシステムで作成されたext4パーティションを10年前の2010CentOSシステムにマウントするにはどうすればよいですか?

分類Dev

debugfsのext4ファイルシステムで「filen / ame」(スラッシュ付き)という名前のファイルを削除するにはどうすればよいですか?

分類Dev

パーティションを作成するときにpartedがファイルシステムタイプを必要とするのはなぜですか?また、そのアクションはmkfs.ext4のようなユーティリティとどのように異なりますか?

分類Dev

USBドライブのext4パーティションにUbuntuをインストールするにはどうすればよいですか?

分類Dev

メンションはマークダウンファイル(* .md)またはその他のテキストでどのように機能しますか?

Related 関連記事

  1. 1

    ファイルシステム(ext4)はTRIM情報をどのように「保存」しますか?

  2. 2

    ext4:ファイルシステムスペースをどのように説明しますか?

  3. 3

    ext4:ファイルシステムスペースをどのように説明しますか?

  4. 4

    initramfsはどのようにルートファイルシステムをマウントしますか?

  5. 5

    個別のext4ブートパーティションを使用してext4からzfsルートファイルシステムに移行するにはどうすればよいですか?

  6. 6

    ext4ファイルシステムのジャーナルにはどのようなデータが保存されていますか?

  7. 7

    ext4ファイルシステムのオフセットを見つけるにはどうすればよいですか?

  8. 8

    データを失うことなく、ext4パーティションをbtrfs(または他のファイルシステム)に変換するにはどうすればよいですか?

  9. 9

    ext4およびbtrfsファイルシステムのブロックサイズを決定するにはどうすればよいですか?

  10. 10

    Ubuntuにext4形式のファイルシステムをマウントするのが難しい

  11. 11

    パーティション(ext4)のイメージを作成し、後でそれをマウントしてファイルを参照/復元するにはどうすればよいですか?

  12. 12

    ext4ファイルシステムのiノードの数を増やすにはどうすればよいですか?

  13. 13

    ext2ファイルシステムのマウント数を確認するにはどうすればよいですか?

  14. 14

    デュアルブートインストールを実行しようとしています:SCSI2(0、0、0)のパーティション#1にあるタイプext4のファイルシステムのテストで、未修正のエラーが見つかりました

  15. 15

    Linuxのファイルマネージャーを使用して、ファイルは実際にどのようにマウントされますか?

  16. 16

    ext4はファイルのブロック数をどのように決定しますか?

  17. 17

    ext4ファイルシステムのディレクトリに多くのファイルがあるとどうなりますか?

  18. 18

    ext4ファイルシステムでエクステントサイズを変更するにはどうすればよいですか?

  19. 19

    Ubuntuのインストール:タイプext4のファイルシステムをマウントしようとしました/失敗しました

  20. 20

    Windowsマシンでext4ファイルシステムのみのソースコードを取得するにはどうすればよいですか?

  21. 21

    Windowsマシンでext4ファイルシステムのみのソースコードを取得するにはどうすればよいですか?

  22. 22

    ユーティリティ「fio」は、ファイルシステムがない未加工のフォーマットされていないデバイスでVFSのような操作をどのように実行しますか?

  23. 23

    ファイルシステムのHTMLCSSのフォントをどのように使用しますか

  24. 24

    LivecCDでext4ファイルパーティションを作成する際にUbuntuがスタックするのを修正するにはどうすればよいですか?

  25. 25

    最近のシステムで作成されたext4パーティションを10年前の2010CentOSシステムにマウントするにはどうすればよいですか?

  26. 26

    debugfsのext4ファイルシステムで「filen / ame」(スラッシュ付き)という名前のファイルを削除するにはどうすればよいですか?

  27. 27

    パーティションを作成するときにpartedがファイルシステムタイプを必要とするのはなぜですか?また、そのアクションはmkfs.ext4のようなユーティリティとどのように異なりますか?

  28. 28

    USBドライブのext4パーティションにUbuntuをインストールするにはどうすればよいですか?

  29. 29

    メンションはマークダウンファイル(* .md)またはその他のテキストでどのように機能しますか?

ホットタグ

アーカイブ