Об’єкт 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-&gti_op-&gttruncate(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 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*