Об’єкт inode
Обєкт inode містить всю інформацію, яка необхідна ядру для маніпуляцій з файлами та каталогами У файлових системах в стилі Unix вся інформація просто зчитується з дискових індексів і поміщається в обєкт inode підсистеми VFS Якщо файлові системи не мають індексів, то цю інформацію необхідно отримати з інших дискових структур4
Обєкт індексу файлу представляється за допомогою структури struc t inode, яка визначена у файлі
struct inode {
struct hlist_node i_hash struct list_head i_list struct list_head i_dentry unsigned long i_ino atomic_t i_count umode_t i_mode unsigned int i_nlink uid_t i_uid gid_t i_gid kdev_t i_rdev loff_t i_size struct timespec i_atime struct timespec i_mtime struct timespec i_ctime
unsigned int i_blkbits
/ * Хешировані список * /
/ * Звязаний список індексів * /
/ * Звязаний список обєктів dentry * /
/ * Номер індексу * /
/ * Лічильник посилань * /
/ * Права доступу * /
/ * Кількість жорстких посилань * /
/ * Ідентифікатор користувача-власника * /
/ * Ідентифікатор групи-власника * /
/ * Повязане пристрій * /
/ * Розмір файлу в байтах * /
/ * Час останнього доступу до файлу * /
/ * Час останньої зміни файлу * /
/ * Час зміни індексу * /
/ * Розмір блоку в бітах * /
4 Файлові системи, яка е не мають індексів, звичайно про зберігаючи т необхідну информаци ю як частину файлу Деякі із е сучасні е файлові е системи також застосовую т бази даних для зберігання я метаданих файлу У будь-якому випадку обєкт індексу створюється тим способом, який ї підходить для файлово ї системи
unsigned long i_blksize / * Розмір блоку в байтах * /
unsigned long i_version / * Номер версії * /
unsigned long i_blocks / * Розмір файлу в блоках * /
unsigned short i_bytes / * Кількість використаних байтів * / spinlock_t i_lock / * Блокування для захисту полів * / struct rw_semaphore i_alloc_sem / * вкладені блокування при
захопленої i_sem * /
struct semaphore i_sem / * Семафор індексу * /
struct inode_operations * i_op / * Таблиця операцій з індексом * /
struct file_operations * i_fop / * Файлові операції * / struct super_block * i_sb / * Повязаний суперблок * / struct file_lock * i_flock / * Список блокувань файлів * / struct address_space * I_mapping / * Відповідне адресне
простір * /
struct address_space i_data / * Адресний простір пристрою * / struct dquot * i_dquot [MAXQUOTAS] / * Дискові квоти для індексу * / struct list_head i_devices / * Список блокових пристроїв */
struct pipe_inode_info * i_pipe / * Інформація конвеєра * /
struct block_device * i_bdev / * Драйвер блокового пристрою * /
unsigned long i_dnotify_mask / * Події каталогу * /
struct dnotify_struct * i_dnotify / * Інформація про події каталогу * /
unsigned long i_state / * Прапори стану * /
unsigned long dirtied_when / * час першої зміни * / unsigned int i_flags / * Прапори файлової системи * / unsigned char i_sock / * Сокет чи ні * /
atomic_t i_writecount / * Лічильник використання для запису * /
void * i_security / * Модуль безпеки * /
u32 i_generation / * Номер версії індексу * /
union {
void * generic_ip / * Специфічна інформація
файлової системи * /
} u
}
Для кожного файлу в системі існує представляє його індекс (хоча обєкт файлового індексу створюється в памяті тільки тоді, коли до файлу здійснюється доступ) Це справедливо і для спеціальних файлів, таких як файли пристроїв або конвеєри Отже, деякі з полів структури struc t inode ставляться до цих спеціальним файлам Наприклад, поле i_pip e вказує на структуру даних іменованого конвеєра Якщо індекс не відноситься до іменованого конвеєру, то це поле просто містить значення NULL Інші поля, повязані з спеціальними файлами, – це i_devices, i_bdev, i_cdev
Може виявитися, що та чи інша файлова система не підтримує тих властивостей, які присутні в обєкті inode Наприклад, деякі файлові системи не підтримують такого атрибута, як час створення файлу У цьому випадку файлова система може реалізувати це властивість як завгодно Наприклад, поле i_ctim e можна зробити нульовим або рівним значенню поля i_mtime
Операції з файловими індексами
Так само як і у випадку операцій суперблоку, важливим є поле inode_ope rations, в якому описані функції файлової системи, які можуть бути викликані підсистемою VFS для обєкта файлового індексу Як і для суперблоку, операції з файловими індексами можуть бути викликані таким чином
i->i_op->truncate(i)
де змінна i містить покажчик на певний обєкт файлового індексу У даному випадку для індексу I виконується операція trancat e (), яка визначена для файлової системи, в якій знаходиться зазначений файловий індекс i Структура inode_operation s визначена у файлі
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 *)
}
Розглянемо зазначені операції більш докладно
• in t create(struc t inode *dir , struc t dentry *dentry , in t mode)
Ця функція викликається підсистемою VFS із системних викликів crea t () і open () для створення нового файлового індексу, який має зазначений режим доступу (mode) і повязаний з зазначеним елементом каталогу (dentry)
• struc t dentry * lookup (struc t inode * dir, struc t dentry * dentry) Ця функція проводить пошук файлового індексу в зазначеному каталозі Файловий індекс повинен відповідати імені файлу, що зберігається в зазначеному обєкті елемента каталогу
• in t link(struc t ctentry *old_dentry , struc t inode *dir , struc t dentr y *dentry)
Ця функція викликається з системного виклику lin k () для створення жорсткої посилання (hard link) на файл, що відповідає елементу каталогу old_dentr y в каталозі dir Нове посилання повинна мати імя, яке зберігається у зазначеному елементі каталогу dentry
• in t unlink(struc t inode *dir , struc t dentr y *dentry)
Ця функція викликається з системного виклику unlin k () для видалення файлового індексу, відповідного елементу каталогу dentr y в каталозі dir
• int symlink (struct inode * dir, struct dentry * dentry, const char * symname) Ця функція викликається з системного виклику symlink () для створення символьного посилання з імям symnarne на файл, якому відповідає елемент каталогу dentr y в каталозі dir
• in t mkdir(struc t inode *dir , struc t dentr y *dentry , in t mode)
Ця функція викликається з системного виклику mkdir () для створення нового каталогу із зазначеним режимом доступу (mode)
• in t rmdir(struc t inode *dir , struc t dentr y *dentry)
Ця функція викликається з системного виклику rmdir () для видалення каталогу на який вказує елемент каталогу dentr y з каталогу dir
• int mknod (struct inode * dir, struct dentry * dentry, int mode, dev_t rdev) Ця функція викликається з системного виклику mknod () для створення спеціального файлу (файлу пристрою, іменованого конвеєра або сокета), інформація про який зберігається в параметрі rdev Файл повинен бути створений в каталозі di r з імям, зазначеним у параметрі dentry, і режимом доступу mode
• in t rename(struc t inode *old_dir , struc t dentr y *old_dentry , struc t inode *new_dir, struc t dentr y *new_dentry)
Ця функція викликається підсистемою VFS для переміщення зазначеного елемента каталогу old_dentr y з каталогу old_di r в каталог new_dir з новим імям, зазначеним у параметрі new_dentry
• in t readlink(struc t dentr y *dentry , char *buffer, in t buflen)
Ця функція викликається з системного виклику readlin k () для копіювання не більше bufle n байт повного шляху, повязаного з символьним посиланням, відповідної вказаному елементу каталогу, в зазначений буфер
• in t follow_link(struc t dentr y *dentry , struc t nameidata *nd)
Ця функція викликається підсистемою VFS для трансляції символьного посилання в індекс файлу, на який ця посилання вказує На посилання вказує покажчик dentry, а результат зберігається в структуру nameidata, на яку вказує параметр nd
• in t put_link(struc t dentr y *dentry , struc t nameidata* nd)
Ця функція викликається підсистемою VFS після виклику функції followlink ()
• void truncat e (struc t inode * inode) Ця функція викликається підсистемою VFS для зміни розміру заданого файлу Перед викликом поле i_siz e зазначеного індексу файлу має бути встановлено в бажане значення розміру
• in t permission(struc t inode *inode, in t mask)
Ця функція перевіряє, чи дозволений зазначений режим доступу до файлу, на який посилається обєкт inode Функція повинна повертати нульове значення, якщо доступ дозволено, і негативне значення коду помилки в іншому випадку Для більшості файлових систем дане поле встановлюється в значення NULL, і при цьому використовується загальний метод VFS, який просто порівнює біти поля режиму доступу файлового індексу з вказаною маскою Більш складні файлові системи, які підтримують списки контролю доступу (ACL), реалізують свій метод permission ()
• in t setattr(struc t dentry *dentry, struc t iatt r *attr )
Ця функція викликається функцією notify_change () доповнення про те, що сталося подія зміни (Change event) після модифікації індексу
• in t getattr(struc t vfsmount *mnt, struc t dentry *dentry, struc t ksta t *stat )
Ця функція викликається підсистемою VFS при повідомленні, що індекс повинен бути оновлений з диска
• in t setxattr(struc t dentry *dentry, const char *name, const void *value, size_ t size , in t flags)
Ця функція викликається підсистемою VFS для встановлення одного з розширених атрибутів (extended attributes) 5 з імям name в значення value для файлу, відповідного елементу каталогу dentry
• in t getxatt r (struc t dentry *dentry, const char *name, void *value, size_ t size )
Ця функція викликається підсистемою VFS для копіювання значення одного з розширених атрибутів (extended attributes) з імям name в область памяті з покажчиком value
• ssize_t listxattr(struc t dentry *dentry, char *list , size_t size)
Ця функція повинна копіювати список всіх атрибутів для зазначеного файлу в буфер, відповідний параметру list
• in t removexattr (struc t dentr y * dentry, const char * name) Ця функція видаляє вказаний атрибут для вказаного файлу
Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ
Схожі статті:
- Час виконання скрипта на PHP. (0)
- Архітектура (0)
- Маніпулювання транзакціями між. NET компонентами (0)
- Відкриття файлу (0)
- Основні терміни та визначення (0)
- Створення сервісу (0)
- Функція FindFirst. (0)
Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.
Коментарів поки що немає.
Ваш отзыв
Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>