Книга: Разработка ядра Linux
Операции с файловыми индексами
Операции с файловыми индексами
Так же как и в случае операций суперблока, важным является поле 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);
Эта функция удаляет указанный атрибут для указанного файла.
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Ускоренная работа с индексами
- Уменьшение размера, занимаемого индексами
- Операции с множествами узлов
- 4. Null-значения и логические операции
- 1. Операции объединения, пересечения, разности
- 2. Операции декартового произведения и естественного соединения
- 5. Производные операции
- 2. Унарные операции на языке структурированных запросов
- 3. Бинарные операции на языке структурированных запросов
- 5. Операции внутреннего соединения.
- ГЛАВА 5. СИСТЕМНЫЕ ОПЕРАЦИИ ДЛЯ РАБОТЫ С ФАЙЛОВОЙ СИСТЕМОЙ