Меню Рубрики

Struct inode linux kernel

Объект inode

Объект inode содержит всю информацию, которая необходима ядру для манипуляций с файлами и каталогами. В файловых системах в стиле Unix вся информация просто считывается из дисковых индексов и помещается в объект inode подсистемы VFS. Если файловые системы не имеют индексов, то эту информацию необходимо получить из других дисковых структур[70].

Объект индекса файла представляется с помощью структуры struct inode , которая определена в файле
. Эта структура с комментариями, описывающими назначение каждого поля, имеет следующий вид.

struct hlist_node i_hash; /* хешированный список */

struct list_head i_list; /* связанный список индексов */

struct list_head i_dentry; /* связанный список объектов dentry */

unsigned long i_ino; /* номер индекса */

atomic_t i_count; /* счетчик ссылок */

umode_t i_mode; /* права доступа */

unsigned int i_nlink; /* количество жестких ссылок */

uid_t i_uid; /* идентификатор пользователя-владельца */

gid_t i_gid; /* идентификатор группы-владельца */

kdev_t i_rdev; /* связанное устройство */

loff_t i_size; /* размер файла в байтах */

struct timespec i_atime; /* время последнего доступа к файлу */

struct timespec i_mtime; /* время последнего изменения файла */

struct timespec i_ctime; /* время изменения индекса */

unsigned int i_blkbits; /* размер блока в битах */

unsigned long i_blksize; /* размер блока в байтах */

unsigned long i_version; /* номер версии */

unsigned long i_blocks; /* размер файла в блоках */

unsigned short i_bytes; /* количество использованных байтов */

spinlock_t i_lock; /* блокировка для защиты полей */

struct rw_semaphore i_alloc_sem /* вложенные блокировки при

struct semaphore i_sem; /* семафор индекса */

struct inode_operations *i_op; /* таблица операций с индексом */

struct file_operations *i_fop; /* файловые операции */

struct super_block *i_sb; /* связанный суперблок */

struct file_lock *i_flock; /* список блокировок файлов */

struct address_space *i_mapping; /* соответствующее адресное

struct address_space i_data; /* адресное пространство устройства */

struct dquot *i_dquot[MAXQUOTAS]; /* дисковые квоты

struct list_head i_devices; /* список блочных устройств */

struct pipe_inode_info *i_pipe; /* информация конвейера */

struct block_device *i_bdev; /* драйвер блочного устройства */

unsigned long i_dnotify_mask; /* события каталога */

struct dnotify_struct *i_dnotify; /* информация о событиях каталога */

unsigned long i_state; /* флаги состояния */

unsigned long dirtied_when /* время первого изменения */

unsigned int i_flags; /* флаги файловой системы */

unsigned char i_sock; /* сокет или нет? */

atomic_t i_writecount; /* счетчик использования

void *i_security; /* модуль безопасности */

__u32 i_generation; /* номер версии индекса */

void *generic_ip; /* специфическая информация

Для каждого файла в системе существует представляющий его индекс (хотя объект файлового индекса создается в памяти только тогда, когда к файлу осуществляется доступ). Это справедливо и для специальных файлов, таких как файлы устройств или конвейеры. Следовательно, некоторые из полей структуры struct inode относятся к этим специальным файлам. Например, поле i_pipe указывает на структуру данных именованного конвейера. Если индекс не относится к именованному конвейеру, то это поле просто содержит значение NULL Другие поля, связанные со специальными файлами, — это i_devices , i_bdev , i_cdev .

Может оказаться, что та или иная файловая система не поддерживает тех свойств, которые присутствуют в объекте inode . Например, некоторые файловые системы не поддерживают такого атрибута, как время создания файла. В этом случае файловая система может реализовать это свойство как угодно. Например, поле i_ctime можно сделать нулевым или равным значению поля i_mtime .

Похожие главы из других книг:

11.3. Запрос и изменение информации inode

11.3. Запрос и изменение информации inode 11.3.1. Поиск информации inode В начале этой главы информационный узел файла (inode) был представлен как структура данных, которая отслеживает информацию о файле, независимо от представления ее для процесса. Например, размер файла является

11.3.1. Поиск информации inode

11.3.1. Поиск информации inode В начале этой главы информационный узел файла (inode) был представлен как структура данных, которая отслеживает информацию о файле, независимо от представления ее для процесса. Например, размер файла является константой в любой момент времени — он

Объект File

Объект File Объект File обеспечивает доступ ко всем свойствам файла. Создать этот объект можно с помощью метода GetFile объекта FileSystemObject следующим образом:var FSO, F;//Создаем объект FileSystemObjectFSO=WScript.CreateObject(«Scripting.FileSystemObject»);//Создаем объект FileF=FSO.GetFile(«С:Мои документахletter.txt»);Также

Объект TextStream

Объект TextStream Объект TextStream обеспечивает последовательный (строка за строкой) доступ к текстовому файлу. Методы этого объекта позволяют читать информацию из файла и записывать ее в него.Создать объект TextStream можно с помощью следующих методов:? CreateTextFile объектов FileSystemObject и

Объект Array

Объект Array Новый объект встроенного класса Array можно создать с помощью оператора new следующими способами:? new Array() — создание массива нулевой длины;? new Array(N) — создание массива длины N;? new Array(а0, a1, . aN) — создание массива длины N+1 c элементами а0, a1, . aN.Например:var A1, А2, A3;A1 = new

Объект Date

Объект Date Для создания нового объекта встроенного класса Date используется один из трех конструкторов.Конструктор первого вида позволяет создать объект, в котором хранится информация о текущих дате и времени:var d;d = new Date();Здесь время задается по Гринвичу, т.е. с

Объект Enumerator

Объект Enumerator С помощью объекта Enumerator можно получить доступ к любому элементу коллекции (в VBScript для этого служит цикл For…Each). Коллекцией в языке JScript называется множество элементов, которое отличается от массива тем, что к элементам коллекции нельзя получить прямой доступ

Объект Math

Объект Math Встроенный класс Math применяется для математических вычислений и содержит основные математические константы и функции. Замечание Объект Math создается сервером сценариев автоматически и не может быть создан при помощи оператора new, как другие встроенные

Объект String

Объект String Встроенный объект String предназначен для выполнения различных операций над текстовыми строками. Обычно объекты класса String создаются просто с помощью записи в переменную текстового литерала:var s1, s2;s1 = «Это строка»;s2 = «Это тоже строка»;Также можно создавать такие

Объект CompositeElementLite

Объект CompositeElementLite Вернемся в начало этой главы и вспомним, как мы получали доступ к нужному нам элементу Web-страницы.Мы можем получить доступ к одному элементу Web-страницы:var elCMain = Ext.get(«cmain»);Или сразу к нескольким:var clContainers = Ext.select(«DIV»);Мы помним, что метод select объекта Ext

Объект document

Объект document Прежде всего надо отметить, что объект document существует в единственном экземпляре для всего HTML-документа. Он присутствует всегда, если существует HTML-документ, поэтому специально создавать его не требуется.activeElementИспользуется в сценарии для получения ссылки

Объект location

Объект location Объект location содержит информацию о местонахождении текущего документа, т.е. его интернет-адрес. Его также можно использовать для перехода на другой документ и перезагрузки текущего документа.Свойства объекта locationМетоды объекта locationПользуясь объектом location,

Объект style

Объект style Как и все остальные объекты, style поддерживает ряд свойств и методов. Их можно разделить на две группы:иСвойства первой группы в целом аналогичны соответствующим атрибутам стиля и имеют почти такие же имена за тем исключением, что символы «-» убираются, т.к. не

Объект window

Объект window Объект window представляет текущее окно Web-обозревателя или отдельный фрейм, если окно разделено на фреймы.closedВозвращает true, если текущее окно закрыто. Может быть использовано при работе с несколькими окнами.defaultStatusСообщение по умолчанию, отображаемое в строке

Составной объект

Составной объект Составной объект (composite object) или объект-контейнер предназначен для представления объекта, имеющего собственную структуру и внутренние потоки (нити) управления. Составной объект является экземпляром составного класса (класса-контейнера), который связан

Объект

Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин «объект» обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность

Источник

Retrieving inode struct given the path to a file

I’ve seen lots of questions about getting a file’s path from it’s inode, but almost none about doing the reverse. My kernel module needs to do this to get further information about the subjects of requests passed to open() , such as its file flags or whether or not it’s a device. From what I was able to scrounge together from mailing lists, manual pages, and the Linux source code, I came up with this small function:

Trying to use it in my replacement system call makes kernel messages get printed to the console, though:

Is there a better way to do this? I’m almost positive my way is wrong.

2 Answers 2

You can use the kern_path kernel API to get the inode information from the path string. This function in turn calls the do_path_lookup() function which performs the path look up operation. You can verify the results of the kern_path function by printing the inode number ( i_ino field of the inode structure) of the inode you get from your get_inode_from_pathname function and matching it with the inode number from an ls command ( ls -i

I made the following kernel module and it’s not crashing the kernel. I am using 2.6.39 kernel.

Can you send the crash stack trace?

I guess the author has already fixed his problem, but this question was the first link in google’s search results, so I’ll explain it further.

The problem with the code from the question was using __user pointer. When you hook a function that deals with __user pointers, first thing you have to make is to copy content to your own kernel buffer where you will deal with it or make sure that pointer won’t become invalid while you are dealing with it.

To copy it to your buffer you could use copy_from_user function

If you hook sys_open, you can use getname/putname functions, as it is done in do_sys_open function:

ps: code from S_S’s answer won’t crash because in fact it allocated buffer for path inside kernel, so it couldn’t become invalid while the module is working with it.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • При подготовке к установке произошла ошибка mac os el capitan
  • При переустановки mac os пишет этот объект временно недоступен
  • При переустановке mac os на диске установлена защита
  • При обновлении mac os данные остаются
  • Преферанс для mac os