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);
Читать дальше