VFS四大對象之二 struct inode


繼上一篇文章:http://www.cnblogs.com/linhaostudy/p/7427027.html

 

二、inode結構體:(轉自http://blog.csdn.net/shanshanpt/article/details/38943731

inode結構體在(include/linux/fs.h中):

 

保存的其實是實際的數據的一些信息,這些信息稱為“元數據”(也就是對文件屬性的描述)。例如:文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。

( 注意數據分成:元數據+數據本身 )

同時注意:inode有兩種,一種是VFS的inode,一種是具體文件系統的inode。前者在內存中,后者在磁盤中。所以每次其實是將磁盤中的inode調進填充內存中的inode,這樣才是算使用了磁盤文件inode。

注意inode怎樣生成的:每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定(現代OS可以動態變化),一般每2KB就設置一個inode。一般文件系統中很少有文件小於2KB的,所以預定按照2KB分,一般inode是用不完的。所以inode在文件系統安裝的時候會有一個默認數量,后期會根據實際的需要發生變化。

注意inode號:inode號是唯一的,表示不同的文件。其實在Linux內部的時候,訪問文件都是通過inode號來進行的,所謂文件名僅僅是給用戶容易使用的。當我們打開一個文件的時候,首先,系統找到這個文件名對應的inode號;然后,通過inode號,得到inode信息,最后,由inode找到文件數據所在的block,現在可以處理文件數據了。

inode和文件的關系:當創建一個文件的時候,就給文件分配了一個inode。一個inode只對應一個實際文件,一個文件也會只有一個inode。inodes最大數量就是文件的最大數量。

 

 1 struct inode {
 2     umode_t            i_mode;
 3     unsigned short        i_opflags;
 4     uid_t            i_uid;
 5     gid_t            i_gid;
 6     unsigned int        i_flags;
 7 
 8 #ifdef CONFIG_FS_POSIX_ACL
 9     struct posix_acl    *i_acl;
10     struct posix_acl    *i_default_acl;
11 #endif
12 
13     const struct inode_operations    *i_op;
14     struct super_block    *i_sb;
15     struct address_space    *i_mapping;
16 
17 #ifdef CONFIG_SECURITY
18     void            *i_security;
19 #endif
20 
21     /* Stat data, not accessed from path walking */
22     unsigned long        i_ino;
23     /*
24      * Filesystems may only read i_nlink directly.  They shall use the
25      * following functions for modification:
26      *
27      *    (set|clear|inc|drop)_nlink
28      *    inode_(inc|dec)_link_count
29      */
30     union {
31         const unsigned int i_nlink;
32         unsigned int __i_nlink;
33     };
34     dev_t            i_rdev;
35     struct timespec        i_atime;
36     struct timespec        i_mtime;
37     struct timespec        i_ctime;
38     spinlock_t        i_lock;    /* i_blocks, i_bytes, maybe i_size */
39     unsigned short          i_bytes;
40     blkcnt_t        i_blocks;
41     loff_t            i_size;
42 
43 #ifdef __NEED_I_SIZE_ORDERED
44     seqcount_t        i_size_seqcount;
45 #endif
46 
47     /* Misc */
48     unsigned long        i_state;
49     struct mutex        i_mutex;
50 
51     unsigned long        dirtied_when;    /* jiffies of first dirtying */
52 
53     struct hlist_node    i_hash;
54     struct list_head    i_wb_list;    /* backing dev IO list */
55     struct list_head    i_lru;        /* inode LRU list */
56     struct list_head    i_sb_list;
57     union {
58         struct list_head    i_dentry;
59         struct rcu_head        i_rcu;
60     };
61     atomic_t        i_count;
62     unsigned int        i_blkbits;
63     u64            i_version;
64     atomic_t        i_dio_count;
65     atomic_t        i_writecount;
66     const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */
67     struct file_lock    *i_flock;
68     struct address_space    i_data;
69 #ifdef CONFIG_QUOTA
70     struct dquot        *i_dquot[MAXQUOTAS];
71 #endif
72     struct list_head    i_devices;
73     union {
74         struct pipe_inode_info    *i_pipe;
75         struct block_device    *i_bdev;
76         struct cdev        *i_cdev;
77     };
78 
79     __u32            i_generation;
80 
81 #ifdef CONFIG_FSNOTIFY
82     __u32            i_fsnotify_mask; /* all events this inode cares about */
83     struct hlist_head    i_fsnotify_marks;
84 #endif
85 
86 #ifdef CONFIG_IMA
87     atomic_t        i_readcount; /* struct files open RO */
88 #endif
89     void            *i_private; /* fs or device private pointer */
90 };

 

i_hash:指向hash鏈表指針,用於inode的hash表,下面會說

i_list:指向索引節點鏈表指針,用於inode之間的連接,下面會說

i_dentry:指向目錄項鏈表指針,注意一個inodes可以對應多個dentry,因為一個實際的文件可能被鏈接到其他的文件,那么就會有另一個dentry,這個鏈表就是將所有的與本inode有關的dentry都連在一起。

i_dirty_buffersi_dirty_data_buffers:臟數據緩沖區

 

i_ino:索引節點號,每個inode都是唯一的

i_count:引用計數

i_dev:如果inode代表設備,那么就是設備號

i_mode:文件的類型和訪問權限

i_nlink:與該節點建立鏈接的文件數(硬鏈接數)

i_uid:文件擁有者標號

i_gid:文件所在組標號

i_rdev:實際的設備標識

注意i_dev和i_rdev之間區別:如果是普通的文件,例如磁盤文件,存儲在某塊磁盤上,那么i_dev代表的就是保存這個文件的磁盤號,但是如果此處是特殊文件例如就是磁盤本身(因為所有的設備也看做文件處理),那么i_rdev就代表這個磁盤實際的磁盤號。

 

i_size:inode所代表的的文件的大小,以字節為單位

i_atime:文件最后一次訪問時間

i_mtime:文件最后一次修改時間

i_ctime:inode最后一次修改時間

i_blkbits:塊大小,字節單位

i_blksize:塊大小,bit單位

i_blocks:文件所占塊數

i_version:版本號

i_bytes:文件中最后一個塊的字節數

i_sem:指向用於同步操作的信號量結構

i_alloc_sem:保護inode上的IO操作不被另一個打斷

i_zombie:僵屍inode信號量

i_op:索引節點操作

i_fop:文件操作

i_sb:inode所屬文件系統的超級塊指針

i_wait:指向索引節點等待隊列指針

i_flock:文件鎖鏈表

 

注意下面:address_space不是代表某個地址空間,而是用於描述頁高速緩存中的頁面的。一個文件對應一個address_space,一個address_space和一個偏移量可以確定一個頁高速緩存中的頁面。

i_mapping:表示向誰請求頁面

i_data:表示被inode讀寫的頁面

 

i_dquot:inode的磁盤限額

關於磁盤限額:在多任務環境下,對於每個用戶的磁盤使用限制是必須的,起到一個公平性作用。

磁盤限額分為兩種:block限額和inode限額,而且對於一個特文件系統來說,使用的限額機制都是一樣的,所以限額的操作函數

放在super_block中就OK!

 

i_devices:設備鏈表。共用同一個驅動程序的設備形成的鏈表。

i_pipe:指向管道文件(如果文件是管道文件時使用)

i_bdev:指向塊設備文件指針(如果文件是塊設備文件時使用)

i_cdev:指向字符設備文件指針(如果文件是字符設備時使用)

 

i_dnotify_mask:目錄通知事件掩碼

i_dnotify:用於目錄通知

 

i_state:索引節點的狀態標識:I_NEW,I_LOCK,I_FREEING

i_flags:索引節點的安裝標識

i_sock:如果是套接字文件則為True

i_write_count:記錄多少進程以刻寫模式打開此文件

i_attr_flags:文件創建標識

i_generation:保留

u:具體的inode信息

 

注意管理inode的四個鏈表

inode_unused:將目前還沒有使用的inode鏈接起來(通過i_list域鏈接)

inode_in_use:目前正在使用的inode鏈接起來(通過i_list域鏈接)

super_block中的s_dirty:將所有修改過的inode鏈接起來,這個字段在super_block中(通過i_list域鏈接起來)

inode_hashtable:注意為了加快inode的查找效率,將正在使用的inode和臟inode也會放在inode_hashtable這樣一個hash結構中,

但是,不同的inode的hash值可能相等,所以將hash值相等的這些inode通過這個i_hash字段連接起來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM