static void free_ind(int dev,int block)
Fungsi fungsi ini adalah untuk melepaskan semua blok tidak langsung sekali.
Fungsi ini mula-mula membaca blok tidak langsung ke dalam bh, yang menyimpan 512 nombor blok cakera.
struct buffer_head * bh; unsigned short * p; int i; if (!block) return; if ((bh=bread(dev,block))) {
Seterusnya, nombor blok cakera 512 dilalui Jika nombor blok cakera bukan 0, panggil blok_bebas (dalam bitmap.c) untuk melepaskan blok cakera. Selepas traversal selesai, kiraan rujukan blok bh bagi blok tidak langsung dikurangkan sebanyak 1. Akhirnya, blok tidak langsung satu kali ini juga dikeluarkan.
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)
Fungsi fungsi ini adalah untuk melepaskan semua blok tidak langsung sekunder.
Fungsi ini mula-mula mengesahkan kesahihan nombor blok cakera.
struct buffer_head * bh; unsigned short * p; int i; if (!block) return;
Kemudian baca blok tak langsung sekunder ke dalam bh Blok bh menyimpan nombor blok cakera 512 blok tak langsung utama.
Seterusnya, nombor blok cakera 512 blok tidak langsung sekali dilalui Jika nombor blok cakera bukan 0, hubungi free_ind untuk melepaskan semua blok satu kali. blok tidak langsung. Selepas traversal selesai, kiraan rujukan blok bh bagi blok tidak langsung sekunder dikurangkan sebanyak 1. Akhirnya, blok tidak langsung sekunder ini juga dikeluarkan.
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)
Fungsi fungsi ini adalah untuk melepaskan ruang cakera yang diduduki oleh inod. Apabila bilangan pautan fail ialah 0, fungsi iput (inode.c) akan memanggil fungsi ini.
Kod pada mulanya menyemak sama ada ia bukan fail biasa atau fail direktori, kemudian langkaunya.
int i; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) return;
Lepaskan blok yang dirujuk terus.
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; }
Lepaskan blok tidak langsung primer dan blok tidak langsung sekunder.
free_ind(inode->i_dev,inode->i_zone[7]); free_dind(inode->i_dev,inode->i_zone[8]);
Tetapkan alamat blok tidak langsung primer dan blok tidak langsung sekunder kepada 0. Tetapkan saiz inod kepada 0, tetapkan inod untuk mengandungi data kotor, dan akhirnya tukar masa pengubahsuaian dan masa penciptaan inod kepada masa semasa.
rreeeeAtas ialah kandungan terperinci Analisis kod sumber truncate.c sistem fail dalam Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!