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