Запись памяти ядра в блок ext2

Для университетского задания нам нужно изменить файловую систему 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 байт. Если это быстрая символическая ссылка, данные сохраняются в указателях блоков. Это легко сделать, и я уже реализовал это для обычных файлов. Если ссылка не является быстрой символической ссылкой, данные обрабатываются так же, как и обычные файлы. Думаю, я вернулся к исходной точке.


person Anthony    schedule 26.10.2011    source источник
comment
Подсказка: взгляните на символические ссылки. IIRC они тоже хранятся в иноде, учитывая достаточно небольшой размер.   -  person wildplasser    schedule 26.10.2011
comment
Да, я вижу, где они просто memcpy называют ссылку на EXT2_I(inode)->i_data. Моя проблема в том, что если вы захотите скопировать эти данные в блок. Общий способ, которым модуль ext2 делает это, предполагает пользовательские данные.   -  person Anthony    schedule 26.10.2011
comment
Я не делаю вашу домашнюю работу или читаю, просто дать вам намек. Посмотрите, что делает код символической ссылки, когда полезная нагрузка становится слишком большой, чтобы поместиться в индексный дескриптор. Очевидно, что дисковый блок должен быть выделен, а указатели блоков inode должны быть инициализированы, чтобы указывать на него. Не упоминайте растровые изображения (не знаю, были ли они в ext2)   -  person wildplasser    schedule 26.10.2011
comment
Спасибо, дикий плассер, я и не ожидал! Я заметил, что символические ссылки ведут себя так, как я хочу, чтобы мои файлы, я просто думал, что все это было «конкретно для символических ссылок».   -  person Anthony    schedule 26.10.2011


Ответы (2)


Мне удалось разобраться. Требовалось получить struct buffer_head экземпляров и прочитать/записать в них данные. Перебирая номера логических блоков и используя to ext2_get_block для извлечения блоков (выделяя их при необходимости), а затем используя sb_getblk для извлечения реального буфера и записи в него. Я разместил реализацию в моем блоге.

person Anthony    schedule 04.11.2011

Тупое домашнее задание.

Код не работает. Попробуйте mmap() и умрите.

person Community    schedule 04.11.2011