Linux中文件系統truncate.c源碼分析

linux-0.11 文件系統truncate.c詳解

free_ind

static?void?free_ind(int?dev,int?block)

該函數的作用是釋放所有的一次間接塊

該函數首先讀取一次間接塊到bh中, 該bh塊中存儲了512個盤塊號。

struct?buffer_head?*?bh; unsigned?short?*?p; int?i;  if?(!block) ????return; if?((bh=bread(dev,block)))?{

接下來就對這512個盤塊號進行遍歷,如果盤塊號不為0, 就調用free_block(bitmap.c中)釋放該盤塊。遍歷完畢之后,將一次間接塊的bh塊引用計數減1。最后將這個一次間接塊也進行釋放。

for?(i=0;i<h4>free_dind</h4><pre class="brush:plain;">static?void?free_dind(int?dev,int?block)

該函數的作用就是釋放所有的二次間接塊。

該函數首先對盤塊號的有效性進行校驗。

struct?buffer_head?*?bh; unsigned?short?*?p; int?i;  if?(!block) ????return;

接著讀取二次間接塊到bh中, 該bh塊中存儲了512個一次間接塊的盤塊號。

接下來就對這512個一次間接塊的盤塊號進行遍歷,如果盤塊號不為0, 就調用free_ind釋放該一次間接塊所有的block。遍歷完畢之后,將二次間接塊的bh塊引用計數減1。最后將這個二次間接塊也進行釋放。

if?((bh=bread(dev,block)))?{ ????p?=?(unsigned?short?*)?bh-&gt;b_data; ????for?(i=0;i<h4>truncate</h4><pre class="brush:plain;">void?truncate(struct?m_inode?*?inode)

該函數的作用是釋放該inode所占據的磁盤空間。當文件鏈接數為0時,iput函數(inode.c)會調用該函數。

代碼最開始檢查如果不是常規文件或者是目錄文件,就跳過。

int?i;  if?(!(S_ISREG(inode-&gt;i_mode)?||?S_ISDIR(inode-&gt;i_mode))) ????return;

釋放直接引用塊。

for?(i=0;ii_zone[i])?{ ????????free_block(inode-&gt;i_dev,inode-&gt;i_zone[i]); ????????inode-&gt;i_zone[i]=0; ????}

釋放一次間接塊和二次間接塊。

free_ind(inode-&gt;i_dev,inode-&gt;i_zone[7]); free_dind(inode-&gt;i_dev,inode-&gt;i_zone[8]);

將一次間接塊和二次間接塊的地址置為0。將inode的size置為0, 將該inode設置為含有臟數據, 最后將inode的修改時候和創建時間都修改為當前時間。

inode-&gt;i_zone[7]?=?inode-&gt;i_zone[8]?=?0; inode-&gt;i_size?=?0; inode-&gt;i_dirt?=?1; inode-&gt;i_mtime?=?inode-&gt;i_ctime?=?CURRENT_TIME;

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享