1 /*
2 * linux/fs/truncate.c
3 *
4 * (C) 1991 Linus Torvalds
5 */
6
7 #include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct������0���ݵȡ�
8
9 #include <sys/stat.h> // �ļ�״̬ͷ�ļ��������ļ����ļ�ϵͳ״̬�ṹstat{}�ͳ�����
10
//// �ͷ�����һ�μ�ӿ顣���ڲ�������
// ����dev���ļ�ϵͳ�����豸���豸�ţ�block������š��ɹ���1������0��
11 static int free_ind(int dev,int block)
12 {
13 struct buffer_head * bh;
14 unsigned short * p;
15 int i;
16 int block_busy; // ������û�б��ͷŵı�־��
17
// �����жϲ�������Ч�ԡ���������Ϊ0���ء�Ȼ���ȡһ�μ�ӿ飬���ͷ����ϱ�
// ��ʹ�õ��������飬Ȼ���ͷŸ�һ�μ�ӿ�Ļ���顣 ����free_block()�����ͷ��豸
// ��ָ������ŵĴ��̿飨fs/bitmap.c��47�У���
18 if (!block)
19 return 1;
20 block_busy = 0;
21 if (bh=bread(dev,block)) {
22 p = (unsigned short *) bh->b_data; // ָ�����������
23 for (i=0;i<512;i++,p++) // ÿ�������Ͽ���512����š�
24 if (*p)
25 if (free_block(dev,*p)) { // �ͷ�ָ�����豸���顣
26 *p = 0; // ���㡣
27 bh->b_dirt = 1; // �������ı�־��
28 } else
29 block_busy = 1; // ��������û���ͷű�־��
30 brelse(bh); // Ȼ���ͷż�ӿ�ռ�õĻ���顣
31 }
// ����ͷ��豸�ϵ�һ�μ�ӿ顣���������������û�б��ͷţ���0��ʧ�ܣ���
32 if (block_busy)
33 return 0;
34 else
35 return free_block(dev,block); // �ɹ���1������0��
36 }
37
//// �ͷ����ж��μ�ӿ顣
// ����dev���ļ�ϵͳ�����豸���豸�ţ�block������š�
38 static int free_dind(int dev,int block)
39 {
40 struct buffer_head * bh;
41 unsigned short * p;
42 int i;
43 int block_busy; // ������û�б��ͷŵı�־��
44
// �����жϲ�������Ч�ԡ���������Ϊ0���ء�Ȼ���ȡ���μ�ӿ��һ���飬����
// �����ϱ���ʹ�õ��������飬Ȼ���ͷŸ�һ����Ļ���顣
45 if (!block)
46 return 1;
47 block_busy = 0;
48 if (bh=bread(dev,block)) {
49 p = (unsigned short *) bh->b_data; // ָ�����������
50 for (i=0;i<512;i++,p++) // ÿ�������Ͽ�����512�������顣
51 if (*p)
52 if (free_ind(dev,*p)) { // �ͷ�����һ�μ�ӿ顣
53 *p = 0; // ���㡣
54 bh->b_dirt = 1; // �������ı�־��
55 } else
56 block_busy = 1; // ��������û���ͷű�־��
57 brelse(bh); // �ͷŶ��μ�ӿ�ռ�õĻ���顣
58 }
// ����ͷ��豸�ϵĶ��μ�ӿ顣���������������û�б��ͷţ���0��ʧ�ܣ���
59 if (block_busy)
60 return 0;
61 else
62 return free_block(dev,block);
63 }
64
//// �ض��ļ����ݺ�����
// ���ڵ��Ӧ���ļ����Ƚ�Ϊ0�����ͷ�ռ�õ��豸�ռ䡣
65 void truncate(struct m_inode * inode)
66 {
67 int i;
68 int block_busy; // ������û�б��ͷŵı�־��
69
// �����ж�ָ��i�ڵ���Ч�ԡ�������dz����ļ���Ŀ¼�ļ���������ء�
70 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
71 S_ISLNK(inode->i_mode)))
72 return;
// Ȼ���ͷ�i�ڵ��7��ֱ�����飬������7��������ȫ���㡣����free_block()����
// �ͷ��豸��ָ������ŵĴ��̿飨fs/bitmap.c��47�У�����������æ��û�б��ͷ�
// ���ÿ�æ��־block_busy��
73 repeat:
74 block_busy = 0;
75 for (i=0;i<7;i++)
76 if (inode->i_zone[i]) { // �����Ų�Ϊ0�����ͷ�֮��
77 if (free_block(inode->i_dev,inode->i_zone[i]))
78 inode->i_zone[i]=0; // ��ָ����0��
79 else
80 block_busy = 1; // ��û���ͷŵ����ñ�־��
81 }
82 if (free_ind(inode->i_dev,inode->i_zone[7])) // �ͷ�����һ�μ�ӿ顣
83 inode->i_zone[7] = 0; // ��ָ����0��
84 else
85 block_busy = 1; // ��û���ͷŵ����ñ�־��
86 if (free_dind(inode->i_dev,inode->i_zone[8])) // �ͷ����ж��μ�ӿ顣
87 inode->i_zone[8] = 0; // ��ָ����0��
88 else
89 block_busy = 1; // ��û���ͷŵ����ñ�־��
// �˺�����i�ڵ����ı�־��������������������ڡ�æ����û�б��ͷţ���ѵ�ǰ����
// ����ʱ��Ƭ��0�����õ�ǰ�����ȱ��л�ȥ�����������̣��Ե�һ��������ִ���ͷŲ�����
90 inode->i_dirt = 1;
91 if (block_busy) {
92 current->counter = 0; // ��ǰ����ʱ��Ƭ��0��
93 schedule();
94 goto repeat;
95 }
96 inode->i_size = 0; // �ļ���С���㡣
// ����������ļ���ʱ���i�ڵ�ı�ʱ��Ϊ��ǰʱ�䡣�� CURRENT_TIME ������ͷ�ļ�
// include/linux/sched.h��142�д�������Ϊ(startup_time + jiffies/HZ)������ȡ�ô�
// 1970:0:0:0��ʼ������Ϊֹ������������
97 inode->i_mtime = inode->i_ctime = CURRENT_TIME;
98 }
99
100