static void free_ind(int dev,int block)
この関数の機能は、すべてのワンタイム間接ブロックを解放することです。
この関数は、まず間接ブロックを bh に読み込み、512 個のディスク ブロック番号が bh ブロックに格納されます。
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 減らされます。最後に、この 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 を呼び出して、ワンタイム間接ブロックのすべてのブロックを解放します。間接ブロック。トラバーサルが完了すると、2 次間接ブロックの bh ブロック参照カウントが 1 減らされます。最後に、この 2 次間接ブロックも解放されます。
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 に設定します。 i ノードのサイズを 0 に設定し、ダーティ データを含むように i ノードを設定し、最後に i ノードの変更時刻と作成時刻を現在時刻に変更します。
rree以上がLinuxのファイルシステムのtruncate.cソースコードの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。