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

на главную - закладки

Жанры

Разработка ядра Linux (Второе издание)
Шрифт:

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
.

71

Расширенные атрибуты — это новая функциональность, которая появилась в ядре 2.6 для того, чтобы создавать параметры файлов в виде пар имя/значение по аналогии с базой данных. Эти параметры поддерживаются не многими файловыми системами, и к тому же они еще используются не достаточно широко.

• 

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

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

list
.

• 

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

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

Объект dentry

Как уже рассказывалось, подсистема VFS представляет каталоги так же, как и файлы. В имени пути

/bin/vi
, и элемент
bin
, и элемент
vi
 — это файлы, только
bin
 — это специальный файл, который является каталогом, a
vi
 — это обычный файл. Объекты файловых индексов служат для представления обоих этих компонентов. Несмотря на такую полезную унификацию, подсистеме VFS также необходимо выполнять операции, специфичные для каталогов, такие как поиск компонента пути по его имени, проверка того, что указанный элемент пути существует, и переход на следующий компонент пути.

Для решения этой задачи в подсистеме VFS реализована концепция элемента каталога (directory entry или dentry). Объект dentry — это определенный компонент пути. В предыдущем примере компоненты

/
,
bin
и
vi
— это объекты элементов каталога. Первые два — это каталоги, а последний — обычный файл. Важным моментом является то, что все объекты dentry — это компоненты пути, включая и обычные файлы.

Элементы пути также могут включать в себя точки монтирования. В имени пути

/mnt/cdrom/foo
, компоненты
/
,
mnt
,
cdrom
и
foo
— это все объекты типа dentry. Подсистема VFS при выполнении операций с каталогами по необходимости конструирует объекты элементов каталога на лету.

Объекты типа dentry представлены с помощью структуры

struct dentry
и определены в файле
<linux/dcache.h>
. Эта структура с комментариями, которые определяют назначение каждого поля, имеет следующий вид.

struct dentry {

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

 unsigned long d_vfs_flags; /* флаги кэша объектов dentry */

 spinlock_t d_lock; /* блокировка данного объекта dentry */

 struct inode *d_inode; /* соответствующий файловый индекс */

 struct list_head d_lru; /* список неиспользованных объектов */

 struct list_head d_child; /* список объектов у родительского

экземпляра */

 struct list_head d_subdirs; /* подкаталоги */

 struct list_head d_alias; /* список альтернативных (alias)

Поделиться:
Популярные книги

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга