create_new_namespaces()めも

軽くめも。fork(2)の場合は親プロセスの名前空間を引き継ぐけど、clone(2)、unshare(2)、set_ns(2)などは名前空間に関するフラグが設定でき、これはカーネル内だとcreate_new_namespaces()にて行われる。

create_new_namespaces()の処理内容としてはcreate_nsproxy()で新しいnsproxy構造体のインスタンスを作って、各名前空間ごとの関数(copy_XXX(XXXは名前空間名))を呼んでいく形。

関数のプロトタイプはこのようになっていて、clone(2)の場合ならflagsはclone(2)に渡したclone_flags、tskは処理対象のプロセス、user_nsはtsk->real_cred->user_ns、new_fsはtsk->fsとなっていて、最後の2個は処理対象のtask_structにあるデータが使われている。

 59 static struct nsproxy *create_new_namespaces(unsigned long flags,
 60         struct task_struct *tsk, struct user_namespace *user_ns,
 61         struct fs_struct *new_fs)

copy_XXX()たちに共通な仕様としてはフラグが立っていない場合、例えばcopy_mnt_ns()ならCLONE_NEWNSを見る、単にその名前空間の構造体(ex. mnt_namespace)の参照カウンタとincrementするだけで、フラグが立っていた場合は新規に名前空間を作成する。