2016-06-13 4 views
-1

Как выглядит процесс создания файла в файловой системе ext2?Ext2 - как создается файл

Я пытаюсь сделать простой syscall, который берет путь и создает заданный файл - как прикосновение.

Например, код:

int main(void) 
{ 
    syscall(MY_SYSCALL_NUMBER, "/tmp/file"); 
} 

Если создать файл с именем "файл" в/TMP.

Теперь, как должен работать самоцвет?

Моя работа до сих пор (я опущен проверки для readibility здесь ошибка):

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); 
} 

Это похоже на работу (я могу увидеть в журналах, что выделяется индексный дескриптор), однако, когда я звоню ls на Я не вижу файл там.

Моя идея состояла в том, чтобы добавить новый индексные struct dentry каталога, поэтому я добавил этот код:

struct dentry *new_dentry; 

new_dentry = d_alloc(path.dentry->d_parent, &qname); 
d_instantiate(new_dentry, new_inode); 

Однако, это все еще, кажется, не работает (я не могу увидеть файл, используя ls).

Как правильно реализовать этот системный стол, что мне не хватает?

РЕДАКТИРОВАТЬ: Что касается ответа на R .., то этот пульт должен работать с ext2 и узнавать о его дизайне, поэтому мы можем предположить, что путь всегда действителен, файловая система действительно ext2 и так далее.

+0

Не пересылайте вопрос, если у вас нет ответа или вопрос был закрыт! Вместо этого отредактируйте оригинал и попросите повторно открыть, если он теперь соответствует правилам сайта. См. [Ask]. – Olaf

+0

Добавление системных вызовов Linux - это не способ «поиграть с ext2 и узнать его дизайн». Если вы хотите это сделать, напишите автономную утилиту, которая может обрабатывать файловые системы ext2 (либо как файлы изображений, либо напрямую обращаться к блочному устройству). То, что вы, похоже, пытаетесь сделать, - это вытащить на внутренние интерфейсы программирования ядра для реализации ext2 fs в ядре *, что больше связано с тем, как работает слой vfs ядра, чем работает ext2. Это не полезно. –

ответ

1

Вы полностью смешиваете вовлеченные слои абстракции. Если что-то вроде вашего кода может даже работать вообще (не уверен, что он может), он сильно взорвется и сбой ядра или приведет к бегству от неправильного выполнения кода, если кто-то сделал этот syscall на пути, который фактически не соответствовал к файловой системе ext2.

В абстракции fs ядра тот факт, что базовая файловая система является ext2 (или что бы то ни было), не имеет отношения к задаче создания файла на нем. Скорее всего, это должно пройти через агностические слои fs-типа, которые, в свою очередь, заканчиваются использованием специфичных для fs-бэкендов для fs, установленных на пути.

+0

Кроме того, предполагая, что путь всегда ext2 - почему что-то подобное не работает и как заставить его работать? – Josh

+1

@Josh: «Почему что-то подобное не работает, и как заставить его работать» - заявление и наоборот в том же предложении. Вы даже читали, что вы написали здесь? – Olaf

Смежные вопросы