static void free_ind(int dev,int block)
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))) {
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);
static void free_dind(int dev,int block)
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;
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);
void truncate(struct m_inode * inode)
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;
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; }
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]);
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;
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!