ext2 ファイル システムでファイルを作成するプロセスはどのようなものですか?
touch のように、パスを取得して特定のファイルを作成する単純なシステムコールを作成しようとしています。
たとえば、コードは次のとおりです。
int main(void)
{
syscall(MY_SYSCALL_NUMBER, "/tmp/file");
}
/tmp に「file」というファイルを作成する必要があります。
では、syscall 自体はどのように機能するのでしょうか?
これまでの私の作業 (ここでは読みやすさのためにエラーチェックを省略しました):
asmlinkage long sys_ccp(const char __user *arg)
{
struct path path;
struct inode *new_inode;
struct qstring qname;
//ommited copy from user for simplicity
qname.name = arg;
qname.len = length(arg);
kern_path(src, LOOKUP_FOLLOW, &path);
new_inode = ext2_new_inode(path.dentry->d_parent->d_inode, S_IFREG, &qname);
}
これは機能しているように見えます (inode が割り当てられていることをログで確認できます) がls
、ディレクトリを呼び出すと、そこにファイルが表示されません。
私の考えは、新しい i ノードをstruct dentry
ディレクトリに追加することだったので、次のコードを追加しました。
struct dentry *new_dentry;
new_dentry = d_alloc(path.dentry->d_parent, &qname);
d_instantiate(new_dentry, new_inode);
ただし、これはまだ機能していないようです (を使用してファイルを表示できませんls
)。
このシステムコールを正しく実装する方法、何が欠けていますか?
編集: R.. についての回答 - この syscall の目的は、ext2 をいじってその設計について学ぶことです。そのため、パスは常に有効であり、ファイルシステムは実際には ext2 などであると想定できます。