Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ядра LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 81

Автор Π ΠΎΠ±Π΅Ρ€Ρ‚ Π›Π°Π²

β€’ void umount_begin(struct super_block *sb) β€” эта функция вызываСтся подсистСмой VFS для прСрывания ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ монтирования. Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сСтСвыми Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ систСмами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ NFS.

ВсС рассмотрСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ подсистСмой VFS Π² контСкстС процСсса. ВсС ΠΎΠ½ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠ³ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

НСкоторыС ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Ѐайловая систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… значСния Π² структурС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ супСрблока Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ NULL. Если ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€Π°Π²Π΅Π½ NULL, Ρ‚ΠΎ подсистСма VFS ΠΈΠ»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ Π½Π΅ происходит Π½ΠΈΡ‡Π΅Π³ΠΎ, Π² зависимости ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ inode

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ inode содСрТит всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ядру для манипуляций с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ. Π’ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСмах Π² стилС Unix вся информация просто считываСтся ΠΈΠ· дисковых индСксов ΠΈ помСщаСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ inode подсистСмы VFS. Если Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ систСмы Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ индСксов, Ρ‚ΠΎ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… дисковых структур[70].

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ индСкса Ρ„Π°ΠΉΠ»Π° прСдставляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры struct inode, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ <linux/fs.h>. Π­Ρ‚Π° структура с коммСнтариями, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄.

struct inode {

 struct hlist_node       i_hash;         /* Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ список */

 struct list_head        i_list;         /* связанный список индСксов */

 struct list_head        i_dentry; /* связанный список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² 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;      /* Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π² Π±ΠΈΡ‚Π°Ρ… */

 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;

};

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² систСмС сущСствуСт ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ индСкс (хотя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ индСкса создаСтся Π² памяти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΊ Ρ„Π°ΠΉΠ»Ρƒ осущСствляСтся доступ). Π­Ρ‚ΠΎ справСдливо ΠΈ для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ устройств ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ структуры struct inode относятся ΠΊ этим ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ. НапримСр, ΠΏΠΎΠ»Π΅ i_pipe ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. Если индСкс Π½Π΅ относится ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ, Ρ‚ΠΎ это ΠΏΠΎΠ»Π΅ просто содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL Π”Ρ€ΡƒΠ³ΠΈΠ΅ поля, связанныС со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, β€” это i_devices, i_bdev, i_cdev.

ΠœΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π° ΠΈΠ»ΠΈ иная файловая систСма Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Ρ… свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ inode. НапримСр, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ систСмы Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, ΠΊΠ°ΠΊ врСмя создания Ρ„Π°ΠΉΠ»Π°. Π’ этом случаС файловая систСма ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это свойство ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. НапримСр, ΠΏΠΎΠ»Π΅ i_ctime ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ поля i_mtime.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ индСксами

Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² случаС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ супСрблока, Π²Π°ΠΆΠ½Ρ‹ΠΌ являСтся ΠΏΠΎΠ»Π΅ inode_operations, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ описаны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ подсистСмой VFS для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ индСкса. Как ΠΈ для супСрблока, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ индСксами ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

i->i_op->truncate(i);

Π³Π΄Π΅ пСрСмСнная i содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ индСкса. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС для индСкса i выполняСтся опСрация truncate(), которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° для Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ индСкс i. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° inode_operations ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ <linux/fs.h>, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

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*);

};

Рассмотрим ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

β€’ 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.