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->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->i_mode)?||?S_ISDIR(inode->i_mode))) ????return;
釋放直接引用塊。
for?(i=0;ii_zone[i])?{ ????????free_block(inode->i_dev,inode->i_zone[i]); ????????inode->i_zone[i]=0; ????}
釋放一次間接塊和二次間接塊。
free_ind(inode->i_dev,inode->i_zone[7]); free_dind(inode->i_dev,inode->i_zone[8]);
將一次間接塊和二次間接塊的地址置為0。將inode的size置為0, 將該inode設置為含有臟數據, 最后將inode的修改時候和創建時間都修改為當前時間。
inode->i_zone[7]?=?inode->i_zone[8]?=?0; inode->i_size?=?0; inode->i_dirt?=?1; inode->i_mtime?=?inode->i_ctime?=?CURRENT_TIME;
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END