1. 程式人生 > >【轉】inode快取與dentry快取

【轉】inode快取與dentry快取

inode快取與dentry快取 ,轉載,供學習參考

1. inode快取

   1: struct inode {
   2:     /* RCU path lookup touches following: */
   3:     umode_t            i_mode;
   4:     uid_t            i_uid;
   5:     gid_t            i_gid;
   6:     const struct inode_operations    *i_op;
   7:     struct super_block    *i_sb;
   8:  
   9:     spinlock_t        i_lock;    /* i_blocks, i_bytes, maybe i_size */
  10:     unsigned int        i_flags;
  11:     unsigned long        i_state;
  12: #ifdef CONFIG_SECURITY
  13:     void            *i_security;
  14: #endif
  15:     struct mutex        i_mutex;
  16:  
  17:  
  18:     unsigned long        dirtied_when;    /* jiffies of first dirtying */
  19:  
  20:     struct hlist_node    i_hash;
  21:     struct list_head    i_wb_list;    /* backing dev IO list */
  22:     struct list_head    i_lru;        /* inode LRU list */
  23:     struct list_head    i_sb_list;
  24:     union {
  25:         struct list_head    i_dentry;
  26:         struct rcu_head        i_rcu;
  27:     };
  28:     unsigned long        i_ino;
  29:     atomic_t        i_count;
  30:     unsigned int        i_nlink;
  31:     dev_t            i_rdev;
  32:     unsigned int        i_blkbits;
  33:     u64            i_version;
  34:     loff_t            i_size;
  35: #ifdef __NEED_I_SIZE_ORDERED
  36:     seqcount_t        i_size_seqcount;
  37: #endif
  38:     struct timespec        i_atime;
  39:     struct timespec        i_mtime;
  40:     struct timespec        i_ctime;
  41:     blkcnt_t        i_blocks;
  42:     unsigned short          i_bytes;
  43:     struct rw_semaphore    i_alloc_sem;
  44:     const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */
  45:     struct file_lock    *i_flock;
  46:     struct address_space    *i_mapping;
  47:     struct address_space    i_data;
  48: #ifdef CONFIG_QUOTA
  49:     struct dquot        *i_dquot[MAXQUOTAS];
  50: #endif
  51:     struct list_head    i_devices;
  52:     union {
  53:         struct pipe_inode_info    *i_pipe;
  54:         struct block_device    *i_bdev;
  55:         struct cdev        *i_cdev;
  56:     };
  57:  
  58:     __u32            i_generation;
  59:  
  60: #ifdef CONFIG_FSNOTIFY
  61:     __u32            i_fsnotify_mask; /* all events this inode cares about */
  62:     struct hlist_head    i_fsnotify_marks;
  63: #endif
  64:  
  65: #ifdef CONFIG_IMA
  66:     atomic_t        i_readcount; /* struct files open RO */
  67: #endif
  68:     atomic_t        i_writecount;
  69: #ifdef CONFIG_FS_POSIX_ACL
  70:     struct posix_acl    *i_acl;
  71:     struct posix_acl    *i_default_acl;
  72: #endif
  73:     void            *i_private; /* fs or device private pointer */
  74: };

inode可能處於三種狀態:

1)unused,裡面沒有儲存有效的內容,可以被複用為新的用途;

2)in use,正在被使用,其成員i_count以及i_nlink一定大於0,此時inode與檔案系統或者說裝置上的檔案相關聯,但是自從上次與裝置同步後,內容沒有發生改變,即不是dirty的;

3)dirty,inode裡面的內容已經與檔案系統中的檔案內容不一致了,即髒了,需要進行檔案同步操作。

 

前兩種狀態的inode都各自位於一個全域性的連結串列中,而第三種的inode位於super_block結構體中的一個連結串列中。

 

先看inode結構體中的一個成員:

struct list_head    i_lru;        /* inode LRU list */

 

對應著一個全域性的連結串列:

static LIST_HEAD(inode_lru);
static DEFINE_SPINLOCK(inode_lru_lock);

 

   1: /*
   2:  * Called when we're dropping the last reference
   3:  * to an inode.
   4:  *
   5:  * Call the FS "drop_inode()" function, defaulting to
   6:  * the legacy UNIX filesystem behaviour.  If it tells
   7:  * us to evict inode, do so.  Otherwise, retain inode
   8:  * in cache if fs is alive, sync and evict if fs is
   9:  * shutting down.
  10:  */
  11: static void iput_final(struct inode *inode)
  12: {
  13:     struct super_block *sb = inode->i_sb;
  14:     const struct super_operations *op = inode->i_sb->s_op;
  15:     int drop;
  16:  
  17:     WARN_ON(inode->i_state & I_NEW);
  18:  
  19:     if (op && op->drop_inode)
  20:         drop = op->drop_inode(inode);
  21:     else
  22:         drop = generic_drop_inode(inode);
  23:  
  24:     if (!drop && (sb->s_flags & MS_ACTIVE)) {
  25:         inode->i_state |= I_REFERENCED;
  26:         if (!(inode->i_state & (I_DIRTY|I_SYNC)))
  27:             inode_lru_list_add(inode);
  28:         spin_unlock(&inode->i_lock);
  29:         return;
  30:     }
  31:  
  32:     if (!drop) {
  33:         inode->i_state |= I_WILL_FREE;
  34:         spin_unlock(&inode->i_lock);
  35:         write_inode_now(inode, 1);
  36:         spin_lock(&inode->i_lock);
  37:         WARN_ON(inode->i_state & I_NEW);
  38:         inode->i_state &= ~I_WILL_FREE;
  39:     }
  40:  
  41:     inode->i_state |= I_FREEING;
  42:     inode_lru_list_del(inode);
  43:     spin_unlock(&inode->i_lock);
  44:  
  45:     evict(inode);
  46: }

函式iput_final是在當inode沒有被任何地方引用後,即變成了unused狀態後,回收inode的機制。

if (op && op->drop_inode)
        drop = op->drop_inode(inode);
    else
        drop = generic_drop_inode(inode);

drop為0時,表示i_nlink為0,並且inode沒有儲存著inode_hashtable中的拉鍊表,即這個inode可以被釋放掉。

   1: /*
   2:  * Normal UNIX filesystem behaviour: delete the
   3:  * inode when the usage count drops to zero, and
   4:  * i_nlink is zero.
            
           

相關推薦

inode快取dentry快取

inode快取與dentry快取 ,轉載,供學習參考 1. inode快取 1: struct inode { 2: /* RCU path lookup touches following: */

ehcache實現頁面整體快取和頁面區域性快取

ehcache實現頁面整體快取和頁面區域性快取 之前寫過spring cache和ehcache的基本介紹和註解實現快取管理,今天記錄下web專案的頁面快取技術。   頁面快取是否有必要?。      這樣說吧,幾乎所有的網站的首頁都

JavaScript MD5 Java MessageDigest 加密後的值相同

cda padding highlight xe7 net abs algorithm urn -a function integer(n) { return n%(0xffffffff+1); } function shr(a,b) { a=integer(a);

https淺析抓包

img 網站 字節 pan 嗅探 www. tcp 解析 算法 0.HTTP之殤 數據明文傳輸,易嗅探 數據完整性無驗證,易篡改 網站身份無認證,易假冒 由此誕生HTTPS。 1.什麽是HTTPS HTTP + SSL/TLS TLS是SSL的升級版

凸集凸函數

strong 不同 rap 因此 src image com 求解 函數 來自:https://blog.csdn.net/kebu12345678/article/details/54926287 凸函數:如果函數f(x)的圖像上方的點構成的集合是一個凸集的話,那麽

策略模式命令模式區別

區別 相同 策略模式 菜單 nbsp 之間 mman 變化 排隊 策略模式 把易於變化的行為分別封裝起來,讓它們之間可以互相替換, 讓這些行為的變化獨立於擁有這些行為的客戶。GoF《設計模式》中說道:定義一系列算法,把它們一個個封裝起來,並且使它們可以相互替換。該模式使得算

Git衝突解決方法 Git衝突解決方法

本文轉載自:https://www.cnblogs.com/gavincoder/p/9071959.html Git衝突與解決方法 1、git衝突的場景 情景一:多個分支程式碼合併到一個分支時; 情景二:多個分支向同一個遠端分支推送程式碼時; 實際上,push操作即是將

男人成熟不成熟的N個標誌

男人成熟的N個標誌1.以事業為重。2.腳踏實地,明白物質也是愛情的基礎之一。3.當心愛的女人和別的男人在一起時,衷心祝福。4.不對愛情充滿太多幻想。5.著裝得體,精神飽滿。6.擅於發現女人的優點長處並讚美對方。7.有女人緣,但善於把握寸度。8.信守承諾,沒有把握不會輕易許諾。9.說話乾淨利落,不婆婆媽媽。10

HTTPS淺析抓包分析 | 老D部落格

0x00 HTTP之殤 資料明文傳輸,易嗅探 資料完整性無驗證,易篡改 網站身份無認證,易假冒 由此誕生HTTPS。 0x01 什麼是HTTPS TLS是SSL的升級版 二圖勝千言: //圖片來源於網路 作用:防嗅探,防篡改,身份認證 0

IP地址整數之間的轉換

1、IP地址轉換為整數 原理:IP地址每段可以看成是8位無符號整數即0-255,把每段拆分成一個二進位制形式組合起來,然後把這個二進位制數轉變成 一個無符號32為整數。 舉例:一個ip地址為10.0.3.193 每段數字 相對應的二進位制數 10 00001010 0 00

VirtualBox 主機虛擬機器互相訪問且均上外網

VirtualBox中有4中網路連線方式:NAT Bridged Adapter Internal Host-only Adapter VMWare中有三種,其實他跟VMWare 的網路連線方式都是一樣概念,只是比VMWare多了Internal方式。 要讓自己(或別人)理解深刻,方法就是做比較和打比方,比較

HDMI介紹流程

接收 獲得 www gpo rac math ... dev smi 轉自:https://www.cnblogs.com/TaigaCon/p/3840653.html HDMI,全稱為(High Definition Multimedia Interface

Hibernate持久層框架使用效能優化快取

一級快取: 在hibernate中一級快取是預設開啟的,它與session相關,例如當你對資料庫中的資料進行查詢後,它會將查詢到的物件儲存到記憶體中,再次查詢時便直接從記憶體中讀取,從記憶體中讀取的速度顯然比從資料庫中讀取資料要快得多。 為了證明,可以寫一個測試類對快取進行測試 publ

Linux手動釋放快取的方法

Linux手動釋放快取的方法 轉自:https://www.cnblogs.com/focai/p/5829897.html Linux釋放記憶體的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之間的數字,代

ZFS讀快取深入研究:ARC

本文對ZFS的ARC機制講的比較清晰易懂,轉載學習下。【轉自】http://blog.chinaunix.net/uid-28466562-id-3837685.html ZFS 讀快取深入研究:ARC 在Solaris ZFS 中實現的ARC(Adjustable Replacement

瀏覽器快取知識小結及應用

開發過程中瞭解到的和瀏覽器快取相關的兩個名詞,強快取和協商快取。算是碰到了知識的盲點,在網上學習的過程中發現一篇帖子總結的非常不錯,特此轉載,以便日後複習以及推介給大家。先給出原文連結:瀏覽器快取知識小結及應用-------我是分割線-------瀏覽器快取,也就是客戶端快取

Hibernate學習筆記Session清空快取清理快取

1. 清空快取     當呼叫session.evict(customer); 或者session.clear(); 或者session.close()方法時,Session的快取被清空。 2. 清理快取     Session具有一個快取,位於快取中的物件處於持久化狀態

Linux內核中的中斷棧內核棧的補充說明

desc 試圖 調度 php == over 註冊 tex 存在 轉自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux內核中的中斷棧與內核棧的補充說明 作者:MagicBoy2010

用戶空間內核空間,進程上下文中斷上下文[總結]

存儲器 com ont article 模式 tab 用戶代碼 ssi 而在 轉自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文轉載自:http://www.cnblogs.com/Anker/p/3

哈希(Hash)加密(Encrypt)的基本原理、區別及工程應用

phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以