Я видел много вопросов о том, как получить путь к файлу из его inode, но почти никто не делает обратное. Моему модулю ядра необходимо сделать это, чтобы получить дополнительную информацию о предметах запросов, переданных в open()
, например, о ее флагах файлов или о том, является ли это устройством. Из того, что я был в состоянии раздобыть вместе из списков рассылки, справочных страниц, а также исходного кода Linux, я пришел с этой маленькой функцией:Извлечение структуры inode с указанием пути к файлу
struct inode* get_inode_from_pathname(const char *pathname) {
struct path path;
kern_path(pathname, LOOKUP_FOLLOW, &path);
return path.dentry->d_inode;
}
Попытки использовать его в моей системе замены вызова делает сообщение ядра получить печатные к консоли:
struct inode *current_inode;
...
asmlinkage int custom_open(char const *__user file_name, int flags, int mode) {
current_inode = get_inode_from_pathname(file_name);
printk(KERN_INFO "intercepted: open(\"%s\", %X, %X)\n", file_name, flags, mode);
printk(KERN_INFO "i_mode of %s:%hu\n", file_name, current_inode->i_mode);
return real_open(file_name, flags, mode);
}
Есть ли лучший способ сделать это? Я почти уверен, что мой путь неправильный.
Это то, что делает мой код в настоящее время, но это приводит к сбою моего модуля. – Melab
Я добавил свой модуль, чтобы получить номер inode в своем ответе выше. –
Я использую минимальную настройку на виртуальной машине, поэтому мне придется выяснить способ захвата трассировки стека аварий (что конкретно?). Я запускаю версию ядра 3.16.7, и это, вероятно, связано с тем, что это используется в захваченном системном вызове, но я увижу, что получаю. – Melab