Для университетского задания мы должны изменить файловую систему ext2 для хранения файлов в указателях блоков inode, если они меньше 60 байт, и перейти в обычное хранилище блоков, как только файл станет больше этого.
Я скопировал код ext2 из исходного кода ядра Linux 2.6 (в соответствии с инструкциями) и пошел оттуда.
Когда размер файла превышает 60 байт, мне нужно скопировать все данные, которые в настоящее время находятся в массиве указателей блока inode, в реальные блоки. Итак, мне нужно записать память ядра в блоки 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 байт. Если это быстрая символическая ссылка, данные сохраняются в указателях блоков. Это легко сделать, и я уже реализовал это для обычных файлов. Если ссылка не является быстрой символической ссылкой, данные обрабатываются так же, как и обычные файлы. Думаю, я вернулся на круги своя.