Heim > Betrieb und Instandhaltung > Betrieb und Wartung von Linux > Analyse des truncate.c-Quellcodes des Dateisystems unter Linux

Analyse des truncate.c-Quellcodes des Dateisystems unter Linux

WBOY
Freigeben: 2023-05-21 18:01:12
nach vorne
1302 Leute haben es durchsucht

Linux-0.11 Dateisystem truncate.c detaillierte Erklärung

free_ind

static void free_ind(int dev,int block)
Nach dem Login kopieren

Die Funktion dieser Funktion besteht darin,alle einmaligen indirekten Blöcke freizugeben .

Diese Funktion liest zunächst einen indirekten Block in bh, der 512 Plattenblocknummern speichert.

struct buffer_head * bh;
unsigned short * p;
int i;

if (!block)
    return;
if ((bh=bread(dev,block))) {
Nach dem Login kopieren

Als nächstes werden die 512 Plattenblocknummern durchlaufen. Wenn die Plattenblocknummer nicht 0 ist, rufen Sie free_block (in bitmap.c) auf, um das Plattenstück freizugeben. Nachdem die Durchquerung abgeschlossen ist, wird der bh-Blockreferenzzähler eines indirekten Blocks um 1 dekrementiert. Abschließend wird auch diese einmalige indirekte Sperre aufgehoben.

for (i=0;i<512;i++,p++)
    if (*p)
        free_block(dev,*p);
brelse(bh);
free_block(dev,block);
Nach dem Login kopieren

free_dind

static void free_dind(int dev,int block)
Nach dem Login kopieren

Die Funktion dieser Funktion besteht darin, alle sekundären indirekten Blöcke freizugeben.

Diese Funktion überprüft zunächst die Gültigkeit der Festplattenblocknummer.

struct buffer_head * bh;
unsigned short * p;
int i;

if (!block)
    return;
Nach dem Login kopieren

Lesen Sie dann den sekundären indirekten Block in bh ein. Der bh-Block speichert die Plattenblocknummern von 512 primären indirekten Blöcken.

Als nächstes werden die Plattenblocknummern der 512 einmaligen indirekten Blöcke durchlaufen. Wenn die Plattenblocknummer nicht 0 ist, rufen Sie free_ind auf, um alle einzelnen Blöcke freizugeben. Zeit indirekte Blöcke blockieren. Nachdem die Durchquerung abgeschlossen ist, wird der BH-Blockreferenzzähler des sekundären indirekten Blocks um 1 dekrementiert. Abschließend wird auch diese sekundäre indirekte Sperre aufgehoben.

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);
Nach dem Login kopieren

truncate

void truncate(struct m_inode * inode)
Nach dem Login kopieren

Die Funktion dieser Funktion besteht darin, den vom Inode belegten Speicherplatz freizugeben. Wenn die Anzahl der Dateiverknüpfungen 0 beträgt, ruft die iput-Funktion (inode.c) diese Funktion auf.

Der Code prüft zunächst, ob es sich nicht um eine reguläre Datei oder eine Verzeichnisdatei handelt, und überspringt sie dann.

int i;

if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
    return;
Nach dem Login kopieren

Den direkten Referenzblock freigeben.

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;
    }
Nach dem Login kopieren

Primären indirekten Block und sekundären indirekten Block freigeben.

free_ind(inode->i_dev,inode->i_zone[7]);
free_dind(inode->i_dev,inode->i_zone[8]);
Nach dem Login kopieren

Setzen Sie die Adressen des primären indirekten Blocks und des sekundären indirekten Blocks auf 0. Setzen Sie die Größe des Inodes auf 0, stellen Sie den Inode so ein, dass er schmutzige Daten enthält, und ändern Sie schließlich die Änderungszeit und Erstellungszeit des Inodes auf die aktuelle Zeit.

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;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAnalyse des truncate.c-Quellcodes des Dateisystems unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage