Чтение онлайн

ЖАНРЫ

Разработка ядра Linux
Шрифт:

 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,

Поделиться с друзьями: