Maison >Opération et maintenance >exploitation et maintenance Linux >Analyse du code source truncate.c du système de fichiers sous Linux
static void free_ind(int dev,int block)
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))) {
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);
static void free_dind(int dev,int block)
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;
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);
void truncate(struct m_inode * inode)
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;
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; }
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]);
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;
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!