static void free_ind(int dev,int block)
이 함수의 기능은 일회성 간접 블록을 모두 해제하는 것입니다.
이 함수는 먼저 간접 블록을 bh로 읽어 512개의 디스크 블록 번호를 저장합니다.
struct buffer_head * bh; unsigned short * p; int i; if (!block) return; if ((bh=bread(dev,block))) {
다음으로 512개의 디스크 블록 번호를 순회합니다. 디스크 블록 번호가 0이 아닌 경우 free_block(bitmap.c에서)을 호출하여 디스크 블록을 해제합니다. 순회가 완료된 후 간접 블록의 bh 블록 참조 횟수는 1씩 감소합니다. 마지막으로, 이 일회성 간접 블록도 해제됩니다.
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)
이 함수의 기능은 모든 보조 간접 블록을 해제하는 것입니다.
이 기능은 먼저 디스크 블록 번호의 유효성을 확인합니다.
struct buffer_head * bh; unsigned short * p; int i; if (!block) return;
그런 다음 2차 간접 블록을 bh로 읽어옵니다. bh 블록은 512개의 1차 간접 블록의 디스크 블록 번호를 저장합니다.
다음으로, 이 512개의 일회성 간접 블록의 디스크 블록 번호를 순회합니다. 디스크 블록 번호가 0이 아닌 경우 free_ind를 호출하여 일회성 간접 블록의 모든 블록을 해제합니다. 순회가 완료된 후 보조 간접 블록의 bh 블록 참조 카운트는 1씩 감소합니다. 마지막으로 이 보조 간접 블록도 해제됩니다.
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)
이 함수의 기능은 inode가 차지하는 디스크 공간을 해제하는 것입니다. 파일 링크 수가 0이면 iput 함수(inode.c)가 이 함수를 호출합니다.
코드는 처음에 일반 파일이나 디렉터리 파일이 아닌지 확인한 후 건너뜁니다.
int i; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) return;
직접 참조 블록을 해제하세요.
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; }
1차 간접블록과 2차 간접블록을 해제합니다.
free_ind(inode->i_dev,inode->i_zone[7]); free_dind(inode->i_dev,inode->i_zone[8]);
1차 간접 블록과 2차 간접 블록의 주소를 0으로 설정합니다. inode의 크기를 0으로 설정하고, inode가 더티 데이터를 포함하도록 설정하고, 마지막으로 inode의 수정 시간과 생성 시간을 현재 시간으로 변경합니다.
아아아아위 내용은 Linux 파일 시스템의 truncate.c 소스 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!