Запись памяти ядра в блок ext2 - PullRequest
6 голосов
/ 26 октября 2011

Для университетского задания нам нужно изменить файловую систему 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);

Edit:

Я посмотрел на символические ссылки. По сути, ext2 имеет концепцию «быстрых символических ссылок»; имя ссылки имеет длину менее 60 байт. Если это быстрая символическая ссылка, данные сохраняются в указателях блоков. Это легко сделать, и я уже реализовал это для обычных файлов. Если ссылка не является быстрой символической ссылкой, данные обрабатываются так же, как и обычные файлы. Я думаю, что я вернулся к исходной точке.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

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

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

1 голос
/ 04 ноября 2011

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

...