Как получить путь или файл dentry или struct из данного inode? - PullRequest
3 голосов
/ 19 декабря 2011

Мне нужно знать, как получить путь или dentry или struct file из заданного индекса.

Я использовал file_open для получения struct file из пути, но всегда вызывал панику в ядре. Мне нужен способ сравнить инод из моего списка инодов с инодом из пути или сравнить все иноды на диске, чтобы найти соответствующие пути, а затем сравнить с моим списком инодов.

Ответы [ 2 ]

2 голосов
/ 04 июля 2017

Этот пример кода будет хорошо работать в ядре Linux версии 2.6.xx

struct dentry *sample_dentry = NULL;
struct inode *tmp_inode = &inode_need_to_get;
struct list_head *tmp_list = NULL;
list_for_each(tmp_list, &(tmp_inode->i_dentry))
{
    sample_dentry = list_entry(tmp_list, struct dentry, d_alias);
    printk(KERN_EMERG, "name of file is %s\n", sample_dentry->d_iname);
}

Каждый объект inode будет иметь один или несколько объектов dentries, если этот файл имеет жесткую ссылку.

1 голос
/ 19 декабря 2011

В общем, это чрезвычайно сложно сделать.

Инод может иметь тысячи путей. Все имена одинаково «действительны». Даже в файловых системах, которые не поддерживают множественные ссылки, файл может быть подключен тысячи раз в любом месте системы.

Обе AppArmor и TOMOYO системы обязательного контроля доступа системы используют имена путей, но с гигантским различием: средства управления доступом выполняется для определенного файлового дескриптора, который был открыт с определенным именем, и оба инструмента используют , что определенное имя.

Посмотрите на функцию security/apparmor/path.c aa_get_name() или security/tomoyo/file.c, функцию tomoyo_get_realpath() для получения подробной информации о поиске путей из inode - с учетом дополнительной вспомогательной информации. Я полагаю, что вам просто не повезло из простого простого объекта.

...