大学の課題では、ext2ファイルシステムを変更して、ファイルが60バイト未満の場合はiノードのブロックポインターにファイルを保存し、ファイルがそれより大きくなると通常のブロックストレージに移動する必要があります。
2.6 linuxカーネルソースからext2コードをコピーし(指示どおり)、そこから移動しました。
ファイルが60バイトより大きくなると、現在iノードのブロックポインタ配列にあるデータを実際のブロックにコピーする必要があります。したがって、カーネルメモリをext2ブロックに書き込む必要があります。の単純な呼び出しdo_sync_write
は、ユーザースペースのメモリを必要とするため、ここでは機能しません。
私はの実装を見てきましたがdo_sync_write
、それが何をするのかを実際に複製する方法はわかりませんが、代わりにカーネルメモリを使用します。
これは、この特定の部分の現在の実装です(機能しません):
ssize_t extmod_write(struct file *filp, const char *buf,
size_t len, loff_t *ppos)
{
...
printk(KERN_INFO "Switching to regular file");
temp = kmalloc(inode->i_size, GFP_KERNEL);
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size);
/* Need to clear the block pointers before they are allocated by kernel */
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data));
if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) {
printk(KERN_INFO "DAMN! Writing current buffer failed");
return -EINVAL;
}
kfree(temp);
return do_sync_write(filp, buf, len, ppos);
編集:
シンボリックリンクを見ました。基本的に、ext2には「高速シンボリックリンク」の概念があります。つまり、リンク名の長さは60バイト未満です。高速シンボリックリンクの場合、データはブロックポインタに格納されます。これは簡単に実行でき、通常のファイルにはすでに実装しています。リンクが高速シンボリックリンクでない場合、データは通常のファイルと同じ方法で処理されます。私は正方形に戻ったと思います。