����12-5 linux/fs/super.c


  1 /*

  2  *  linux/fs/super.c

  3  *

  4  *  (C) 1991  Linus Torvalds

  5  */

  6

  7 /*

  8  * super.c contains code to handle the super-block tables.

  9  */

    /*

     * super.c�����к��д�����������Ĵ��롣

     */

 10 #include <linux/config.h> // �ں�����ͷ�ļ�������������Ժ�Ӳ�����ͣ�HD_TYPE����ѡ�

 11 #include <linux/sched.h>  // ���ȳ���ͷ�ļ�������������ṹtask_struct������0�����ݣ�

                              // ����һЩ�й��������������úͻ�ȡ��Ƕ��ʽ��ຯ������䡣

 12 #include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣

 13 #include <asm/system.h>   // ϵͳͷ�ļ������������û��޸�������/�ж��ŵȵ�Ƕ��ʽ���ꡣ

 14

 15 #include <errno.h>        // �����ͷ�ļ�������ϵͳ�и��ֳ����š�

 16 #include <sys/stat.h>     // �ļ�״̬ͷ�ļ��������ļ����ļ�ϵͳ״̬�ṹstat{}�ͳ�����

 17

    // ��ָ���豸ִ�и��ٻ������豸�����ݵ�ͬ��������fs/buffer.c��59�У���

 18 int sync_dev(int dev);

    // �ȴ�������kernel/chr_drv/tty_io.c��140�У���

 19 void wait_for_keypress(void);

 20

 21 /* set_bit uses setb, as gas doesn't recognize setc */

    /* set_bit()ʹ����setbָ���Ϊ��������gas����ʶ��ָ��setc */

    //// ����ָ��λƫ�ƴ�����λ��ֵ�������ظ�ԭ����λֵ��Ӧ��ȡ��Ϊtest_bit()����������

    // Ƕ��ʽ���ꡣ����bitnr�DZ���λƫ��ֵ��addr�Dz��Ա���λ��������ʼ��ַ��

    // %0 - ax(__res)��%1 - 0��%2 - bitnr��%3 - addr

    // ��23�ж�����һ���ֲ��Ĵ����������ñ�������������eax�Ĵ����У��Ա��ڸ�Ч���ʺ�

    // ��������24����ָ��bt ���ڶԱ���λ���в��ԣ�Bit Test��������ѵ�ַaddr��%3����

    // ����λƫ����bitnr��%2��ָ���ı���λ��ֵ�����λ��־CF �С� ָ��setb���ڸ��ݽ�

    // λ��־CF���ò�����%al�����CF = 1��%al = 1������%al = 0��

 22 #define set_bit(bitnr,addr) ({ \

 23 register int __res __asm__("ax"); \

 24 __asm__("bt %2,%3;setb %%al":"=a" (__res):"a" (0),"r" (bitnr),"m" (*(addr))); \

 25 __res; })

 26

 27 struct super_block super_block[NR_SUPER];   // ������ṹ�����飨NR_SUPER = 8����

 28 /* this is initialized in init/main.c */

    /* ROOT_DEV����init/main.c�б���ʼ�� */

 29 int ROOT_DEV = 0;                          // ���ļ�ϵͳ�豸�š�

 30

    // ����3��������lock_super()��free_super()��wait_on_super()����������inode.c��

    // ����ͷ3��������������ͬ��ֻ����������Ķ��󻻳��˳����顣

    //// ���������顣

    // ����������ѱ��������򽫵�ǰ������Ϊ�����жϵĵȴ�״̬�������ӵ��ó�����ȴ���

    // ��s_wait�С�ֱ���ó������������ȷ�ػ��ѱ�����Ȼ�����������

 31 static void lock_super(struct super_block * sb)

 32 {

 33         cli();                               // ���жϡ�

 34         while (sb->s_lock)                   // ����ó������Ѿ���������˯�ߵȴ���

 35                 sleep_on(&(sb->s_wait));     // kernel/sched.c����199�С�

 36         sb->s_lock = 1;                      // ���ó������������������־����

 37         sti();                               // ���жϡ�

 38 }

 39

    //// ��ָ�������������

    // ��λ�������������־������ȷ�ػ��ѵȴ��ڴ˳�����ȴ�����s_wait�ϵ����н��̡�

    // ���ʹ��ulock_super�����������ܸ�������

 40 static void free_super(struct super_block * sb)

 41 {

 42         cli();

 43         sb->s_lock = 0;                      // ��λ������־��

 44         wake_up(&(sb->s_wait));              // ���ѵȴ��ó�����Ľ��̡�

 45         sti();                               // wake_up()��kernel/sched.c����188�С�

 46 }

 47

    //// ˯�ߵȴ������������

    // ����������ѱ��������򽫵�ǰ������Ϊ�����жϵĵȴ�״̬�������ӵ��ó�����ĵȴ���

    // ��s_wait�С�ֱ���ó������������ȷ�ػ��ѱ�����

 48 static void wait_on_super(struct super_block * sb)

 49 {

 50         cli();

 51         while (sb->s_lock)                   // ����������Ѿ���������˯�ߵȴ���

 52                 sleep_on(&(sb->s_wait));

 53         sti();

 54 }

 55

    //// ȡָ���豸�ij����顣

    // �ڳ�����������飩������ָ���豸dev�ij�����ṹ��Ϣ�����ҵ��򷵻س������ָ�룬

    // ���򷵻ؿ�ָ�롣

 56 struct super_block * get_super(int dev)

 57 {

 58         struct super_block * s;              // s�dz��������ݽṹָ�롣

 59

    // �����жϲ��������豸����Ч�ԡ����豸��Ϊ0�򷵻ؿ�ָ�롣Ȼ����sָ�򳬼�������

    // ��ʼ������ʼ�����������������飬��Ѱ��ָ���豸dev�ij����顣 ��62���ϵ�ָ�븳

    // ֵ���"s = 0+super_block" ��ͬ�� "s = super_block"��"s = &super_block[0]"��

 60         if (!dev)

 61                 return NULL;

 62         s = 0+super_block;

 63         while (s < NR_SUPER+super_block)

    // �����ǰ��������ָ���豸�ij����飬���ó�������豸���ֶ�ֵ�뺯������ָ������ͬ��

    // ���ȵȴ��ó�������������ѱ��������������Ļ������ڵȴ��ڼ䣬�ó��������п��ܱ�

    // �����豸ʹ�ã���˵ȴ�����֮�������ж�һ���Ƿ���ָ���豸�ij����飬������򷵻�

    // �ó������ָ�롣��������¶Գ���������������һ�飬��˴�ʱs������ָ�򳬼�����

    // �鿪ʼ����

 64                 if (s->s_dev == dev) {

 65                         wait_on_super(s);

 66                         if (s->s_dev == dev)

 67                                 return s;

 68                         s = 0+super_block;

    // �����ǰ������ǣ�������һ����û���ҵ�ָ���ij����飬�򷵻ؿ�ָ�롣

 69                 } else

 70                         s++;

 71         return NULL;

 72 }

 73

    //// �ͷţ��Żأ�ָ���豸�ij����顣

    // �ͷ��豸��ʹ�õij������������s_dev=0�������ͷŸ��豸i�ڵ�λͼ���߼���λͼ��

    // ռ�õĸ��ٻ���顣����������Ӧ���ļ�ϵͳ�Ǹ��ļ�ϵͳ��������ij��i�ڵ����Ѿ���

    // װ���������ļ�ϵͳ�������ͷŸó����顣

 74 void put_super(int dev)

 75 {

 76         struct super_block * sb;

 77         int i;

 78

    // �����жϲ�������Ч�ԺͺϷ��ԡ����ָ���豸�Ǹ��ļ�ϵͳ�豸������ʾ������Ϣ����ϵ

    // ͳ�̸ı��ˣ�׼��������ս�ɡ��������ء�Ȼ���ڳ��������Ѱ��ָ���豸�ŵ��ļ�ϵͳ��

    // ���顣����Ҳ���ָ���豸�ij����飬�򷵻ء����⣬����ó�����ָ�����ļ�ϵͳ����װ

    // ����i�ڵ㻹û�б�������������ʾ������Ϣ�����ء����ļ�ϵͳж�أ�umount�������У�

    // s_imount���ȱ��ó�Null�Ժ�Ż���ñ��������μ���192�С�

 79         if (dev == ROOT_DEV) {

 80                 printk("root diskette changed: prepare for armageddon\n\r");

 81                 return;

 82         }

 83         if (!(sb = get_super(dev)))

 84                 return;

 85         if (sb->s_imount) {

 86                 printk("Mounted disk changed - tssk, tssk\n\r");

 87                 return;

 88         }

    // Ȼ�����ҵ�ָ���豸�ij�����֮�������������ó����飬���øó������Ӧ���豸���ֶ�

    // s_dev Ϊ0��Ҳ���ͷŸ��豸�ϵ��ļ�ϵͳ�����顣Ȼ���ͷŸó�����ռ�õ������ں���Դ��

    // ���ͷŸ��豸���ļ�ϵͳi�ڵ�λͼ���߼���λͼ�ڻ���������ռ�õĻ���顣���泣����

    // ��I_MAP_SLOTS��Z_MAP_SLOTS������8�����ڷֱ�ָ��i�ڵ�λͼ���߼���λͼռ�õĴ�

    // ���߼�������ע�⣬����Щ��������ݱ��޸Ĺ�������Ҫ��ͬ���������ܰѻ�����е�����

    // д���豸�С��������Ըó���������������ء�

 89         lock_super(sb);

 90         sb->s_dev = 0;                       // �ó�������С�

 91         for(i=0;i<I_MAP_SLOTS;i++)

 92                 brelse(sb->s_imap[i]);

 93         for(i=0;i<Z_MAP_SLOTS;i++)

 94                 brelse(sb->s_zmap[i]);

 95         free_super(sb);

 96         return;

 97 }

 98

    //// ��ȡָ���豸�ij����顣

    // ���ָ���豸dev�ϵ��ļ�ϵͳ�������Ѿ��ڳ�������У���ֱ�ӷ��ظó��������ָ�롣

    // ����ʹ��豸dev�϶�ȡ�����鵽������У������Ƶ���������С������س�����ָ�롣

 99 static struct super_block * read_super(int dev)

100 {

101         struct super_block * s;

102         struct buffer_head * bh;

103         int i,block;

104

    // �����жϲ�������Ч�ԡ����û��ָ���豸���򷵻ؿ�ָ�롣Ȼ������豸�Ƿ�ɸ���

    // ����Ƭ��Ҳ���Ƿ��������豸��������������̣�����ٻ������йظ��豸�����л����

    // ��ʧЧ����Ҫ����ʧЧ���������ͷ�ԭ�����ص��ļ�ϵͳ��

105         if (!dev)

106                 return NULL;

107         check_disk_change(dev);

    // ������豸�ij������Ѿ��ڳ�������У���ֱ�ӷ��ظó������ָ�롣���������ڳ���

    // ���������ҳ�һ������(Ҳ���ֶ�s_dev=0����)����������Ѿ�ռ���򷵻ؿ�ָ�롣

108         if (s = get_super(dev))

109                 return s;

110         for (s = 0+super_block ;; s++) {

111                 if (s >= NR_SUPER+super_block)

112                         return NULL;

113                 if (!s->s_dev)

114                         break;

115         }

    // �ڳ������������ҵ�����֮�󣬾ͽ��ó�����������ָ���豸dev�ϵ��ļ�ϵͳ�����Ƕ�

    // �ó�����ṹ�е��ڴ��ֶν��в��ֳ�ʼ��������

116         s->s_dev = dev;                      // ����dev�豸�ϵ��ļ�ϵͳ��

117         s->s_isup = NULL;

118         s->s_imount = NULL;

119         s->s_time = 0;

120         s->s_rd_only = 0;

121         s->s_dirt = 0;

    // Ȼ�������ó����飬�����豸�϶�ȡ��������Ϣ��bhָ��Ļ�����С�������λ�ڿ��豸

    // �ĵ�2���߼��飨1�ſ飩�У�����1���������̿飩����������������ʧ�ܣ����ͷ���

    // ��ѡ���ij����������е������s_dev=0����������������ؿ�ָ���˳�������ͽ���

    // ���϶�ȡ�ij�������Ϣ�ӻ�������������Ƶ�������������Ӧ��ṹ�С����ͷŴ�Ŷ�ȡ��

    // Ϣ�ĸ��ٻ���顣

122         lock_super(s);

123         if (!(bh = bread(dev,1))) {

124                 s->s_dev=0;

125                 free_super(s);

126                 return NULL;

127         }

128         *((struct d_super_block *) s) =

129                 *((struct d_super_block *) bh->b_data);

130         brelse(bh);

    // �������Ǵ��豸dev�ϵõ����ļ�ϵͳ�ij����飬���ǿ�ʼ���������������Ч�Բ�����

    // ���϶�ȡi�ڵ�λͼ���߼���λͼ����Ϣ���������ȡ�ij�������ļ�ϵͳħ���ֶβ��ԣ�

    // ˵���豸�ϲ�����ȷ���ļ�ϵͳ�����ͬ����һ�����ͷ�����ѡ���ij����������е����

    // ����������ؿ�ָ���˳������ڸð�Linux�ںˣ�ֻ֧��MINIX�ļ�ϵͳ1.0�汾����ħ

    // ����0x137f��

131         if (s->s_magic != SUPER_MAGIC) {

132                 s->s_dev = 0;

133                 free_super(s);

134                 return NULL;

135         }

    // ���濪ʼ��ȡ�豸��i�ڵ�λͼ���߼���λͼ���ݡ����ȳ�ʼ���ڴ泬����ṹ��λͼ�ռ䡣

    // Ȼ����豸�϶�ȡi�ڵ�λͼ���߼���λͼ��Ϣ��������ڳ������Ӧ�ֶ��С�i�ڵ�λͼ

    // �������豸��2�ſ鿪ʼ���߼����У���ռ��s_imap_blocks���顣�߼���λͼ��i�ڵ�λ

    // ͼ���ڿ�ĺ������У���ռ��s_zmap_blocks���顣

136         for (i=0;i<I_MAP_SLOTS;i++)                    // ��ʼ��������

137                 s->s_imap[i] = NULL;

138         for (i=0;i<Z_MAP_SLOTS;i++)

139                 s->s_zmap[i] = NULL;

140         block=2;

141         for (i=0 ; i < s->s_imap_blocks ; i++)         // ��ȡ�豸��i�ڵ�λͼ��

142                 if (s->s_imap[i]=bread(dev,block))

143                         block++;

144                 else

145                         break;

146         for (i=0 ; i < s->s_zmap_blocks ; i++)         // ��ȡ�豸���߼���λͼ��

147                 if (s->s_zmap[i]=bread(dev,block))

148                         block++;

149                 else

150                         break;

    // ���������λͼ����������λͼӦ��ռ�е��߼�������˵���ļ�ϵͳλͼ��Ϣ�����⣬����

    // ���ʼ��ʧ�ܡ����ֻ���ͷ�ǰ�����벢ռ�õ�������Դ�����ͷ�i�ڵ�λͼ���߼���λͼ

    // ռ�õĸ��ٻ���顢�ͷ�����ѡ���ij���������������ó�����������ؿ�ָ���˳���

151         if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) {

152                 for(i=0;i<I_MAP_SLOTS;i++)             // �ͷ�λͼռ�õĸ��ٻ���顣

153                         brelse(s->s_imap[i]);

154                 for(i=0;i<Z_MAP_SLOTS;i++)

155                         brelse(s->s_zmap[i]);

156                 s->s_dev=0;                            // �ͷ�ѡ���ij����������

157                 free_super(s);                         // �����ó������

158                 return NULL;

159         }

    // ����һ�гɹ������⣬���ڶ����������i�ڵ�ĺ�������������豸�����е�i�ڵ��Ѿ�

    // ȫ��ʹ�ã�����Һ����᷵��0ֵ�����0��i�ڵ��Dz����õģ��������ォλͼ�е�1��

    // ����ͱ���λ����Ϊ1���Է�ֹ�ļ�ϵͳ����0��i�ڵ㡣ͬ���ĵ�����Ҳ���߼���λͼ��

    // ���λ����Ϊ1������������ó����飬�����س�����ָ�롣

160         s->s_imap[0]->b_data[0] |= 1;

161         s->s_zmap[0]->b_data[0] |= 1;

162         free_super(s);

163         return s;

164 }

165

    //// ж���ļ�ϵͳ��ϵͳ���ã���

    // ����dev_name���ļ�ϵͳ�����豸���豸�ļ�����

    // �ú������ȸ��ݲ��������Ŀ��豸�ļ�������豸�ţ�Ȼ��λ�ļ�ϵͳ�������е���Ӧ��

    // �Σ��ͷų������λͼռ�õĻ���飬���Ը��豸ִ�и��ٻ������豸�����ݵ�ͬ��������

    // ��ж�ز����ɹ��򷵻�0�����򷵻س����롣

166 int sys_umount(char * dev_name)

167 {

168         struct m_inode * inode;

169         struct super_block * sb;

170         int dev;

171

    // ���ȸ����豸�ļ����ҵ���Ӧ��i�ڵ㣬��ȡ���е��豸�š��豸�ļ��������豸���豸��

    // �DZ�������i�ڵ��i_zone[0]�еġ� �μ�����namei.c������ϵͳ����sys_mknod()�Ĵ�

    // ���445�С����⣬�����ļ�ϵͳ��Ҫ����ڿ��豸�ϣ����������ǿ��豸�ļ�����Ż�

    // �������i�ڵ�dev_i�����س����롣

172         if (!(inode=namei(dev_name)))

173                 return -ENOENT;

174         dev = inode->i_zone[0];

175         if (!S_ISBLK(inode->i_mode)) {

176                 iput(inode);                           // fs/inode.c����150�С�

177                 return -ENOTBLK;

178         }

    // OK����������Ϊ�˵õ��豸�Ŷ�ȡ�õ�i�ڵ������������ʹ�����������Żظ��豸�ļ�

    // ��i�ڵ㡣�������������һ��ж�ظ��ļ�ϵͳ�������Ƿ����㡣����豸���Ǹ��ļ�ϵͳ��

    // ���ܱ�ж�أ�����æ�����š�

179         iput(inode);

180         if (dev==ROOT_DEV)

181                 return -EBUSY;

    // ����ڳ��������û���ҵ����豸���ļ�ϵͳ�ij����飬�������ҵ����Ǹ��豸���ļ�ϵͳ

    // û�а�װ�����򷵻س����롣�����������ָ���ı���װ����i�ڵ㲢û����λ�䰲װ��־

    // i_mount������ʾ������Ϣ�� Ȼ�����һ��i�ڵ���������Ƿ��н�����ʹ�ø��豸�ϵ���

    // ����������򷵻�æ�����롣

182         if (!(sb=get_super(dev)) || !(sb->s_imount))

183                 return -ENOENT;

184         if (!sb->s_imount->i_mount)

185                 printk("Mounted inode has i_mount=0\n");

186         for (inode=inode_table+0 ; inode<inode_table+NR_INODE ; inode++)

187                 if (inode->i_dev==dev && inode->i_count)

188                                 return -EBUSY;

    // ���ڸ��豸���ļ�ϵͳ��ж���������õ����㣬������ǿ��Կ�ʼʵʩ������ж�ز����ˡ�

    // ���ȸ�λ����װ����i�ڵ�İ�װ��־���ͷŸ�i�ڵ㡣Ȼ���ó������б���װi�ڵ��ֶ�

    // Ϊ�գ����Ż��豸�ļ�ϵͳ�ĸ�i�ڵ㣬�����ó������б���װϵͳ��i�ڵ�ָ��Ϊ�ա�

189         sb->s_imount->i_mount=0;

190         iput(sb->s_imount);

191         sb->s_imount = NULL;

192         iput(sb->s_isup);

193         sb->s_isup = NULL;

    // ��������ͷŸ��豸�ϵij������Լ�λͼռ�õĸ��ٻ���飬���Ը��豸ִ�и��ٻ�������

    // �������ݵ�ͬ��������Ȼ�󷵻�0��ж�سɹ�����

194         put_super(dev);

195         sync_dev(dev);

196         return 0;

197 }

198

    //// ��װ�ļ�ϵͳ��ϵͳ���ã���

    // ����dev_name���豸�ļ�����dir_name�ǰ�װ����Ŀ¼����rw_flag����װ�ļ�ϵͳ�Ŀ�

    // ��д��־���������صĵط�������һ��Ŀ¼�������Ҷ�Ӧ��i�ڵ�û�б���������ռ�á�

    // �������ɹ��򷵻�0�����򷵻س����š�

199 int sys_mount(char * dev_name, char * dir_name, int rw_flag)

200 {

201         struct m_inode * dev_i, * dir_i;

202         struct super_block * sb;

203         int dev;

204

    // ���ȸ����豸�ļ����ҵ���Ӧ��i�ڵ㣬��ȡ�����е��豸�š����ڿ������豸�ļ����豸

    // ������i�ڵ��i_zone[0]�С����⣬�����ļ�ϵͳ�����ڿ��豸�У����������ǿ��豸

    // �ļ�����Żظ�ȡ�õ�i�ڵ�dev_i�����س����롣

205         if (!(dev_i=namei(dev_name)))

206                 return -ENOENT;

207         dev = dev_i->i_zone[0];

208         if (!S_ISBLK(dev_i->i_mode)) {

209                 iput(dev_i);

210                 return -EPERM;

211         }

    // OK����������Ϊ�˵õ��豸�Ŷ�ȡ�õ�i�ڵ�dev_i�����������ʹ�����������Żظ���

    // ���ļ���i�ڵ㡣�������������һ���ļ�ϵͳ��װ����Ŀ¼���Ƿ���Ч�����Ǹ��ݸ�����

    // Ŀ¼�ļ����ҵ���Ӧ��i�ڵ� dir_i�� �����i�ڵ�����ü�����Ϊ1�������������ã���

    // ���߸�i�ڵ�Ľڵ���Ǹ��ļ�ϵͳ�Ľڵ��1����Żظ�i�ڵ㷵�س����롣���⣬���

    // �ýڵ㲻��һ��Ŀ¼�ļ��ڵ㣬��Ҳ�Żظ�i�ڵ㣬���س����롣��Ϊ�ļ�ϵͳֻ�ܰ�װ��

    // һ��Ŀ¼���ϡ�

212         iput(dev_i);

213         if (!(dir_i=namei(dir_name)))

214                 return -ENOENT;

215         if (dir_i->i_count != 1 || dir_i->i_num == ROOT_INO) {

216                 iput(dir_i);

217                 return -EBUSY;

218         }

219         if (!S_ISDIR(dir_i->i_mode)) {                 // ��װ����Ҫ��һ��Ŀ¼����

220                 iput(dir_i);

221                 return -EPERM;

222         }

    // ���ڰ�װ��Ҳ�����ϣ����ǿ�ʼ��ȡҪ��װ�ļ�ϵͳ�ij�������Ϣ����������������ʧ

    // �ܣ���Żظð�װ��i�ڵ�dir_i�����س����롣һ���ļ�ϵͳ�ij���������ȴӳ������

    // �н���������������ڳ�������оʹ��豸�϶�ȡ��

223         if (!(sb=read_super(dev))) {

224                 iput(dir_i);

225                 return -EBUSY;

226         }

    // �ڵõ����ļ�ϵͳ������֮�����Ƕ����Ƚ��м��һ���������Ҫ����װ���ļ�ϵͳ�Ѿ�

    // ��װ�������ط�����Żظ�i�ڵ㣬���س����롣�����Ҫ��װ����i�ڵ��Ѿ���װ���ļ�

    // ϵͳ����װ��־�Ѿ���λ������Żظ�i�ڵ㣬Ҳ���س����롣

227         if (sb->s_imount) {

228                 iput(dir_i);

229                 return -EBUSY;

230         }

231         if (dir_i->i_mount) {

232                 iput(dir_i);

233                 return -EPERM;

234         }

    // ������ñ���װ�ļ�ϵͳ������ġ�����װ��i�ڵ㡱�ֶ�ָ��װ����Ŀ¼����i�ڵ㡣

    // �����ð�װλ��i�ڵ�İ�װ��־�ͽڵ����޸ı�־��Ȼ�󷵻�0����װ�ɹ�����

235         sb->s_imount=dir_i;

236         dir_i->i_mount=1;

237         dir_i->i_dirt=1;/* NOTE! we don't iput(dir_i) */ /*ע��!����û��iput(dir_i)*/

238         return 0;       /* we do that in umount */       /* �⽫��umount�ڲ��� */

239 }

240

    //// ��װ���ļ�ϵͳ��

    // �ú�������ϵͳ��ʼ��������һ���֡��������ȳ�ʼ���ļ�������file_table[]�ͳ������

    // �����飩��Ȼ���ȡ���ļ�ϵͳ�����飬��ȡ���ļ�ϵͳ��i�ڵ㡣 ���ͳ�Ʋ���ʾ������

    // ��ϵͳ�ϵĿ�����Դ�����п����Ϳ���i�ڵ������� �ú�������ϵͳ�������г�ʼ������ʱ

    // ��sys_setup()�����ã�blk_drv/hd.c��157�У���

241 void mount_root(void)

242 {

243         int i,free;

244         struct super_block * p;

245         struct m_inode * mi;

246

    // ������i�ڵ�ṹ����32�ֽڣ������ͣ�������ж����ڷ�ֹ�޸Ĵ���ʱ���ֲ�һ�������

247         if (32 != sizeof (struct d_inode))

248                 panic("bad i-node size");

    // ���ȳ�ʼ���ļ������飨��64���ϵͳͬʱֻ�ܴ�64���ļ����ͳ�����������ォ��

    // ���ļ��ṹ�е����ü�������Ϊ0����ʾ���У������ѳ�������и���ṹ���豸�ֶγ�ʼ

    // ��Ϊ0��Ҳ��ʾ���У���������ļ�ϵͳ�����豸�����̵Ļ�������ʾ��������ļ�ϵͳ�̣�

    // �����س����������ȴ�������

249         for(i=0;i<NR_FILE;i++)                         // ��ʼ���ļ�����

250                 file_table[i].f_count=0;

251         if (MAJOR(ROOT_DEV) == 2) {                    // ��ʾ������ļ�ϵͳ�̡�

252                 printk("Insert root floppy and press ENTER");

253                 wait_for_keypress();

254         }

255         for(p = &super_block[0] ; p < &super_block[NR_SUPER] ; p++) {

256                 p->s_dev = 0;                          // ��ʼ�����������

257                 p->s_lock = 0;

258                 p->s_wait = NULL;

259         }

    // �������ϡ����⡱�ij�ʼ������֮�����ǿ�ʼ��װ���ļ�ϵͳ�����ǴӸ��豸�϶�ȡ�ļ�

    // ϵͳ�����飬��ȡ���ļ�ϵͳ�ĸ�i�ڵ㣨1�Žڵ㣩���ڴ�i�ڵ���е�ָ�롣�������

    // �豸�ϳ�����ʧ�ܻ�ȡ���ڵ�ʧ�ܣ�����ʾ��Ϣ��ͣ����

260         if (!(p=read_super(ROOT_DEV)))

261                 panic("Unable to mount root");

262         if (!(mi=iget(ROOT_DEV,ROOT_INO)))           // ��fs.h��ROOT_INO����Ϊ1��

263                 panic("Unable to read root i-node");

    // �������ǶԳ�����͸�i�ڵ�������á��Ѹ�i�ڵ����ô�������3�Ρ���Ϊ����266����

    // Ҳ�����˸�i�ڵ㡣���⣬iget() ������i�ڵ����ü����ѱ�����Ϊ1��Ȼ���øó������

    // ����װ�ļ�ϵͳi�ڵ�ͱ���װ��i�ڵ��ֶ�Ϊ��i�ڵ㡣�����õ�ǰ���̵ĵ�ǰ����Ŀ¼

    // �͸�Ŀ¼i�ڵ㡣��ʱ��ǰ������1�Ž��̣�init���̣���

264         mi->i_count += 3 ;    /* NOTE! it is logically used 4 times, not 1 */

                                  /* ע�⣡���߼��Ͻ������ѱ�������4�Σ�������1�� */

265         p->s_isup = p->s_imount = mi;

266         current->pwd = mi;

267         current->root = mi;

    // Ȼ�����ǶԸ��ļ�ϵͳ�ϵ���Դ��ͳ�ƹ�����ͳ�Ƹ��豸�Ͽ��п����Ϳ���i�ڵ���������

    // ��i���ڳ������б������豸�߼���������Ȼ������߼���λͼ����Ӧ����λ��ռ�����ͳ

    // �Ƴ����п���������꺯��set_bit()ֻ���ڲ��Ա���λ���������ñ���λ��"i&8191" ����

    // ȡ��i�ڵ���ڵ�ǰλͼ���ж�Ӧ�ı���λƫ��ֵ��"i>>13" �ǽ�i����8192��Ҳ����һ��

    // ���̿�����ı���λ����

268         free=0;

269         i=p->s_nzones;

270         while (-- i >= 0)

271                 if (!set_bit(i&8191,p->s_zmap[i>>13]->b_data))

272                         free++;

    // ����ʾ���豸�Ͽ����߼�����/�߼�������֮��������ͳ���豸�Ͽ���i�ڵ�����������i

    // ���ڳ������б������豸��i�ڵ�����+1����1�ǽ�0�ڵ�Ҳͳ�ƽ�ȥ��Ȼ�����i�ڵ�λ

    // ͼ����Ӧ����λ��ռ��������������i�ڵ������������ʾ�豸�Ͽ��ÿ���i�ڵ�����i

    // �ڵ�������

273         printk("%d/%d free blocks\n\r",free,p->s_nzones);

274         free=0;

275         i=p->s_ninodes+1;

276         while (-- i >= 0)

277                 if (!set_bit(i&8191,p->s_imap[i>>13]->b_data))

278                         free++;

279         printk("%d/%d free inodes\n\r",free,p->s_ninodes);

280 }

281