?? truncate.c
字號:
/** linux/fs/truncate.c** (C) 1991 Linus Torvalds*/#include <linux/sched.h> // 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <sys/stat.h> // 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。//// 釋放一次間接塊。static voidfree_ind (int dev, int block){ struct buffer_head *bh; unsigned short *p; int i;// 如果邏輯塊號為0,則返回。 if (!block) return;// 讀取一次間接塊,并釋放其上表明使用的所有邏輯塊,然后釋放該一次間接塊的緩沖區。 if (bh = bread (dev, block)) { p = (unsigned short *) bh->b_data; // 指向數據緩沖區。 for (i = 0; i < 512; i++, p++) // 每個邏輯塊上可有512 個塊號。 if (*p) free_block (dev, *p); // 釋放指定的邏輯塊。 brelse (bh); // 釋放緩沖區。 }//其它字段//i_zone[0]//i_zone[1]//i_zone[2]//i_zone[3]//i_zone[4]//i_zone[5]//i_zone[6]//i 節點//直接塊號//一次間接塊//二次間接塊//的一級塊//二次間接塊//的二級塊//一次間接塊號//二次間接塊號//i_zone[7]//i_zone[8]// 釋放設備上的一次間接塊。 free_block (dev, block);}//// 釋放二次間接塊。static voidfree_dind (int dev, int block){ struct buffer_head *bh; unsigned short *p; int i;// 如果邏輯塊號為0,則返回。 if (!block) return;// 讀取二次間接塊的一級塊,并釋放其上表明使用的所有邏輯塊,然后釋放該一級塊的緩沖區。 if (bh = bread (dev, block)) { p = (unsigned short *) bh->b_data; // 指向數據緩沖區。 for (i = 0; i < 512; i++, p++) // 每個邏輯塊上可連接512 個二級塊。 if (*p) free_ind (dev, *p); // 釋放所有一次間接塊。 brelse (bh); // 釋放緩沖區。 }// 最后釋放設備上的二次間接塊。 free_block (dev, block);}//// 將節點對應的文件長度截為0,并釋放占用的設備空間。voidtruncate (struct m_inode *inode){ int i;// 如果不是常規文件或者是目錄文件,則返回。 if (!(S_ISREG (inode->i_mode) || S_ISDIR (inode->i_mode))) return;// 釋放i 節點的7 個直接邏輯塊,并將這7 個邏輯塊項全置零。 for (i = 0; i < 7; i++) if (inode->i_zone[i]) { // 如果塊號不為0,則釋放之。 free_block (inode->i_dev, inode->i_zone[i]); inode->i_zone[i] = 0; } free_ind (inode->i_dev, inode->i_zone[7]); // 釋放一次間接塊。 free_dind (inode->i_dev, inode->i_zone[8]); // 釋放二次間接塊。 inode->i_zone[7] = inode->i_zone[8] = 0; // 邏輯塊項7、8 置零。 inode->i_size = 0; // 文件大小置零。 inode->i_dirt = 1; // 置節點已修改標志。 inode->i_mtime = inode->i_ctime = CURRENT_TIME; // 重置文件和節點修改時間為當前時間。}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -