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