Rumah > Operasi dan penyelenggaraan > operasi dan penyelenggaraan linux > Analisis kod sumber truncate.c sistem fail dalam Linux

Analisis kod sumber truncate.c sistem fail dalam Linux

WBOY
Lepaskan: 2023-05-21 18:01:12
ke hadapan
1302 orang telah melayarinya

Penjelasan terperinci sistem fail Linux-0.11 truncate.c

free_ind

static void free_ind(int dev,int block)
Salin selepas log masuk

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))) {
Salin selepas log masuk

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);
Salin selepas log masuk

free_dind

static void free_dind(int dev,int block)
Salin selepas log masuk

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;
Salin selepas log masuk

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);
Salin selepas log masuk

truncate

void truncate(struct m_inode * inode)
Salin selepas log masuk

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;
Salin selepas log masuk

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;
    }
Salin selepas log masuk

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]);
Salin selepas log masuk

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.

rreeee

Atas 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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan