Операции с файловыми индексами

Операции с файловыми индексами

Так же как и в случае операций суперблока, важным является поле inode_operations, в котором описаны функции файловой системы, которые могут быть вызваны подсистемой VFS для объекта файлового индекса. Как и для суперблока, операции с файловыми индексами могут быть вызваны следующим образом.

i->i_op->truncate(i);

где переменная i содержит указатель на определенный объект файлового индекса. В данном случае для индекса i выполняется операция truncate(), которая определена для файловой системы, в которой находится указанный файловый индекс i. Структура inode_operations определена в файле <linux/fs.h>, как показано ниже.

struct inode_operations {

 int (*create)(struct inode*, struct dentry*, int);

 struct dentry* (*lookup)(struct inode*, struct dentry*);

 int (*link)(struct dentry*, struct inode*, struct dentry*);

 int (*unlink)(struct inode*, struct dentry*);

 int (*symlink)(struct inode*, struct dentry*, const char*);

 int (*mkdir)(struct inode*, struct dentry*, int);

 int (*rmdir)(struct inode*, struct dentry*);

 int (*mknod)(struct inode*, struct dentry*, int, dev_t);

 int (*rename)(struct inode*, struct dentry*,

  struct inode*, struct dentry*);

 int (*readlink)(struct dentry*, char*, int);

 int (*follow_link)(struct dentry*, struct nameidata*);

 int (*put_link)(struct dentry*, struct nameidata*);

 void (*truncate)(struct inode*);

 int (*permission)(struct inode*, int);

 int (*setattr)(struct dentry*, struct iattr*);

 int (*getattr)(struct vfsmount*, struct dentry*, struct kstat*);

 int (*setxattr)(struct dentry*, const char*,

 const void*, size_t, int);

 ssize_t (*getxattr)(struct dentry*, const char*, void*, size_t);

 ssize_t (*listxattr)(struct dentry*, char*, size_t);

 int (*removexattr)(struct dentry*, const char*);

};

Рассмотрим указанные операции более подробно.

• int create(struct inode *dir, struct dentry *dentry, int mode);

Эта функция вызывается подсистемой VFS из системных вызовов creat() и open() для создания нового файлового индекса, который имеет указанный режим доступа (mode) и связан с указанным элементом каталога (dentry).

• struct dentry* lookup(struct inode *dir, struct dentry *dentry);

Эта функция производит поиск файлового индекса в указанном каталоге. Файловый индекс должен соответствовать имени файла, хранящемуся в указанном объекте элемента каталога.

• int link(struct dentry *old_dentry, struct inode *dir,

  struct dentry *dentry);

Эта функция вызывается из системного вызова link() для создания жесткой ссылки (hard link) на файл, соответствующий элементу каталога old_dentry в каталоге dir. Новая ссылка должна иметь имя, которое хранится в указанном элементе каталога dentry.

• int unlink(struct inode *dir, struct dentry *dentry);

Эта функция вызывается из системного вызова unlink() для удаления файлового индекса, соответствующего элементу каталога dentry в каталоге dir.

• int symlink(struct inode *dir, struct dentry *dentry,

  const char *symname);

Эта функция вызывается из системного вызова symlink() для создания символьной ссылки с именем symname на файл, которому соответствует элемент каталога dentry в каталоге dir.

• int mkdir(struct inode *dir, struct dentry *dentry, int mode);

Эта функция вызывается из системного вызова mkdir() для создания нового каталога с указанным режимом доступа (mode).

• int rmdir(struct inode *dir, struct dentry *dentry);

Эта функция вызывается из системного вызова rmdir() для удаления каталога на который указывает элемент каталога dentry из каталога dir.

• int mknod(struct inode *dir, struct dentry *dentry,

  int mode, dev_t rdev);

Эта функция вызывается из системного вызова mknod() для создания специального файла (файла устройства, именованного конвейера или сокета), информация о котором хранится в параметре rdev. Файл должен быть создан в каталоге dir с именем, указанным в параметре dentry, и режимом доступа mode.

• int rename(struct inode *old_dir, struct dentry *old_dentry,

  struct inode *new_dir, struct dentry *new_dentry);

Эта функция вызывается подсистемой VFS для перемещения указанного элемента каталога old_dentry из каталога old_dir в каталог new_dir с новым именем, указанным в параметре new_dentry.

• int readlink(struct dentry *dentry, char *buffer, int buflen);

Эта функция вызывается из системного вызова readlink() для копирования не более buflen байт полного пути, связанного с символьной ссылкой, соответствующей указанному элементу каталога, в указанный буфер.

• int follow_link(struct dentry *dentry, struct nameidata *nd);

Эта функция вызывается подсистемой VFS для трансляции символьной ссылки в индекс файла, на который эта ссылка указывает. На ссылку указывает указатель dentry, а результат сохраняется в структуру nameidata, на которую указывает параметр nd.

• int put_link(struct dentry *dentry, struct nameidata* nd);

Эта функция вызывается подсистемой VFS после вызова функции followlink().

• void truncate(struct inode *inode);

Эта функция вызывается подсистемой VFS для изменения размера заданного файла. Перед вызовом поле i_size указанного индекса файла должно быть установлено в желаемое значение размера.

• int permission(struct inode *inode, int mask);

Эта функция проверяет, разрешен ли указанный режим доступа к файлу, на который ссылается объект inode. Функция должна возвращать нулевое значение, если доступ разрешен, и отрицательное значение кода ошибки в противном случае. Для большинства файловых систем данное поле устанавливается в значение NULL, и при этом используется общий метод VFS, который просто сравнивает биты поля режима доступа файлового индекса с указанной маской. Более сложные файловые системы, которые поддерживают списки контроля доступа (ACL), реализуют свой метод permission().

• int setattr(struct dentry *dentry, struct iattr *attr);

Эта функция вызывается функцией notify_change() для уведомления о том, что произошло "событие изменения" ("change event") после модификации индекса.

• int getattr(struct vfsmount *mnt, struct dentry *dentry,

  struct kstat *stat);

Эта функция вызывается подсистемой VFS при уведомлении, что индекс должен быть обновлен с диска.

• int setxattr(struct dentry *dentry, const char *name,

  const void *value, size_t size, int flags);

Эта функция вызывается подсистемой VFS для установки одного из расширенных атрибутов (extended attributes)[71] с именем name в значение value для файла, соответствующего элементу каталога dentry.

• int getxattr(struct dentry *dentry, const char *name,

  void *value, size_t size);

Эта функция вызывается подсистемой VFS для копирования значения одного из расширенных атрибутов (extended attributes) с именем name в область памяти с указателем value.

• ssize_t listxattr(struct dentry *dentry, char *list, size_t size);

Эта функция должна копировать список всех атрибутов для указанного файла в буфер, соответствующий параметру list.

• int removexattr(struct dentry *dentry, const char *name);

Эта функция удаляет указанный атрибут для указанного файла.

Поделитесь на страничке

Следующая глава >

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

Структуры данных, связанные с файловыми системами

Из книги автора

Структуры данных, связанные с файловыми системами В дополнение к фундаментальным объектам подсистемы VFS, ядро использует и другие стандартные структуры данных для управления данными, связанными с файловыми системами. Первый объект используется для описания


11.5. Манипуляции файловыми дескрипторами

Из книги автора

11.5. Манипуляции файловыми дескрипторами Почти все связанные с файлами системные вызовы, о которых мы говорили, за исключением lseek(), манипулируют inode файлов, что позволяет разделять их результаты между процессами, в которых этот файл открыт. Есть несколько системных


16.1. Операции tty

Из книги автора

16.1. Операции tty Устройства tty предоставляют огромное количество опций обработки данных; они относятся к наиболее сложным устройствам ядра. Настраивать можно опции обработки входных и выходных данных, а также потока данных. Также можно контролировать ограниченное


Код операции MI

Из книги автора

Код операции MI В таблице 4.14 показано назначение битов кода операции MI. Бит 3 задает вычислительный или невычислительный формат команды. Во втором случае функция, которая должна быть выполнена, закодирована в битах 5-15 кода операции. Функция, выполняемая вычислительной


Ускоренная работа с индексами

Из книги автора

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


Уменьшение размера, занимаемого индексами

Из книги автора

Уменьшение размера, занимаемого индексами Индексы, построенные по текстовым полям с национальным порядком сортировки, занимают в среднем на одну треть меньше места на диске по сравнению с


Операции

Из книги автора

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


Операции += и -=

Из книги автора

Операции += и -= Если вы изучаете C#, уже имея опыт использования C++, то можете обратить внимание на отсутствие возможности перегрузки операторных сокращений, включающих операцию присваивания (+=, -= и т.д.). Не волнуйтесь, в C# операторные сокращения с присваиванием


Операции

Из книги автора

Операции В языке Си предусматриваются поразрядные логические операции и операции сдвига. Далее мы будем записывать значения в двоичном коде, чтобы вы могли видеть, как выполняются операции. В реальных программах используются целые переменные или константы, записанные в


Операции

Из книги автора

Операции Теперь рассмотрим, что можно и нельзя делать с величинами типа enum. Вы можете присвоить константу типа enum переменной того же типа enum feline pet;pet = tiger;Нельзя использовать другие операции присваивания: pet += cat; /* недопустимо */Можно провести сравнение с целью выявления


Операции

Из книги автора

Операции Операции в языке Си имеют либо один операнд (унарные операции), либо два операнда (бинарные операции), либо три (тернарная операция). Операция присваивания может быть как унарной, так и бинарной (см. раздел 4.4).Существенным свойством любой операции является ее


4.3. Операции сравнения и логические операции

Из книги автора

4.3. Операции сравнения и логические операции Символ операции Значение Использование ! Логическое НЕ !expr меньше exprexpr = Меньше либо равно expr=expr больше exprexpr = больше либо равно expr=expr == равно expr==expr != не равно expr!=expr логическое


Автоматические индексы в сравнении с определенными пользователем индексами

Из книги автора

Автоматические индексы в сравнении с определенными пользователем индексами Firebird автоматически создает индексы для обеспечения различных ограничений целостности (более подробную информацию см. в главах 16 и 17). Для удаления таких индексов необходимо удалить


Операции is и as

Из книги автора

Операции is и as Операция is предназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция as позволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового