Analyse du code source truncate.c du système de fichiers sous Linux

WBOY
Libérer: 2023-05-21 18:01:12
avant
1261 Les gens l'ont consulté

Explication détaillée du système de fichiers Linux-0.11 truncate.c

free_ind

static void free_ind(int dev,int block)
Copier après la connexion

La fonction de cette fonction est de libérer tous les blocs indirects uniques.

Cette fonction lit d'abord un bloc indirect dans bh, qui stocke 512 numéros de blocs de disque.

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

if (!block)
    return;
if ((bh=bread(dev,block))) {
Copier après la connexion

Ensuite, les 512 numéros de bloc de disque sont parcourus. Si le numéro de bloc de disque n'est pas 0, appelez free_block (dans bitmap.c) pour libérer le bloc de disque. Une fois le parcours terminé, le nombre de références de bloc bh d'un bloc indirect est décrémenté de 1. Enfin, ce blocage indirect ponctuel est également libéré.

for (i=0;i<512;i++,p++)
    if (*p)
        free_block(dev,*p);
brelse(bh);
free_block(dev,block);
Copier après la connexion

free_dind

static void free_dind(int dev,int block)
Copier après la connexion

La fonction de cette fonction est de libérer tous les blocs indirects secondaires.

Cette fonction vérifie d'abord la validité du numéro de bloc disque.

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

if (!block)
    return;
Copier après la connexion

Ensuite, lisez le bloc indirect secondaire dans bh. Le bloc bh stocke les numéros de bloc de disque de 512 blocs indirects primaires.

Ensuite, les numéros de bloc de disque de ces 512 blocs indirects ponctuels sont parcourus. Si le numéro de bloc de disque n'est pas 0, appelez free_ind pour libérer tous les blocs du bloc indirect ponctuel. Une fois le parcours terminé, le nombre de références de bloc bh du bloc indirect secondaire est décrémenté de 1. Enfin, ce bloc indirect secondaire est également libéré.

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);
Copier après la connexion

truncate

void truncate(struct m_inode * inode)
Copier après la connexion

La fonction de cette fonction est de libérer l'espace disque occupé par l'inode. Lorsque le nombre de liens de fichiers est 0, la fonction iput (inode.c) appellera cette fonction.

Le code vérifie d'abord s'il ne s'agit pas d'un fichier normal ou d'un fichier de répertoire, ​​puis ignorez-le.

int i;

if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
    return;
Copier après la connexion

Libérez le bloc de référence directe.

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;
    }
Copier après la connexion

Libérez le bloc indirect primaire et le bloc indirect secondaire.

free_ind(inode->i_dev,inode->i_zone[7]);
free_dind(inode->i_dev,inode->i_zone[8]);
Copier après la connexion

Définissez les adresses du bloc indirect principal et du bloc indirect secondaire sur 0. Définissez la taille de l'inode sur 0, définissez l'inode pour qu'il contienne des données sales, et enfin modifiez l'heure de modification et l'heure de création de l'inode à l'heure actuelle.

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;
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal