ホームページ  >  記事  >  運用・保守  >  Linuxのファイルシステムのtruncate.cソースコードの分析

Linuxのファイルシステムのtruncate.cソースコードの分析

WBOY
WBOY転載
2023-05-21 18:01:121222ブラウズ

Linux-0.11 ファイルシステム truncate.c の詳細説明

free_ind

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);

free_dind

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);

truncate

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。