����12-3 linux/fs/truncate.c


  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