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<512;i++,p++) if (*p) free_block(dev,*p); brelse(bh); free_block(dev,block);
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<512;i++,p++) if (*p) free_ind(dev,*p); brelse(bh); } free_block(dev,block);
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;i<7;i++) if (inode->i_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;
以上是Linux中檔案系統truncate.c源碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!