����14-20 linux/include/linux/fs.h
1 /*
2 * This file has definitions for some important file table
3 * structures etc.
4 */
/*
* ���ļ�����ijЩ��Ҫ�ļ����ṹ�Ķ���ȡ�
*/
5
6 #ifndef _FS_H
7 #define _FS_H
8
9 #include <sys/types.h> // ����ͷ�ļ��������˻�����ϵͳ�������͡�
10
11 /* devices are as follows: (same as minix, so we can use the minix
12 * file system. These are major numbers.)
13 *
14 * 0 - unused (nodev)
15 * 1 - /dev/mem
16 * 2 - /dev/fd
17 * 3 - /dev/hd
18 * 4 - /dev/ttyx
19 * 5 - /dev/tty
20 * 6 - /dev/lp
21 * 7 - unnamed pipes
22 */
/*
* ϵͳ�������豸���£�����minixϵͳ��һ�����������ǿ���ʹ��minix��
* �ļ�ϵͳ��������Щ�����豸�š���
*
* 0 - û���õ���nodev��
* 1 - /dev/mem �ڴ��豸��
* 2 - /dev/fd �����豸��
* 3 - /dev/hd Ӳ���豸��
* 4 - /dev/ttyx tty�����ն��豸��
* 5 - /dev/tty tty�ն��豸��
* 6 - /dev/lp ��ӡ�豸��
* 7 - unnamed pipes û�������Ĺܵ���
*/
23
24 #define IS_SEEKABLE(x) ((x)>=1 && (x)<=3) // �ж��豸�Ƿ��ǿ���Ѱ�Ҷ�λ�ġ�
25
26 #define READ 0
27 #define WRITE 1
28 #define READA 2 /* read-ahead - don't pause */
29 #define WRITEA 3 /* "write-ahead" - silly, but somewhat useful */
30
31 void buffer_init(long buffer_end); // ���ٻ�������ʼ��������
32
33 #define MAJOR(a) (((unsigned)(a))>>8) // ȡ���ֽڣ����豸�ţ���
34 #define MINOR(a) ((a)&0xff) // ȡ���ֽڣ����豸�ţ���
35
36 #define NAME_LEN 14 // ���ֳ���ֵ��
37 #define ROOT_INO 1 // ��i�ڵ㡣
38
39 #define I_MAP_SLOTS 8 // i�ڵ�λͼ������
40 #define Z_MAP_SLOTS 8 // ���飨���ο飩λͼ������
41 #define SUPER_MAGIC 0x137F // �ļ�ϵͳħ����
42
43 #define NR_OPEN 20 // �������������
44 #define NR_INODE 32 // ϵͳͬʱ���ʹ��I�ڵ������
45 #define NR_FILE 64 // ϵͳ����ļ��������ļ�������������
46 #define NR_SUPER 8 // ϵͳ���������������������������������
47 #define NR_HASH 307 // ������Hash����������ֵ��
48 #define NR_BUFFERS nr_buffers // ϵͳ����������������ʼ�����ٸı䡣
49 #define BLOCK_SIZE 1024 // ���ݿ鳤�ȣ��ֽ�ֵ����
50 #define BLOCK_SIZE_BITS 10 // ���ݿ鳤����ռ����λ����
51 #ifndef NULL
52 #define NULL ((void *) 0)
53 #endif
54
// ÿ������ɴ�ŵ�i�ڵ�����
55 #define INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct d_inode)))
// ÿ������ɴ�ŵ�Ŀ¼������
56 #define DIR_ENTRIES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct dir_entry)))
57
// �ܵ�ͷ���ܵ�β���ܵ���С���ܵ��գ����ܵ��������ܵ�ͷָ�������
58 #define PIPE_READ_WAIT(inode) ((inode).i_wait)
59 #define PIPE_WRITE_WAIT(inode) ((inode).i_wait2)
60 #define PIPE_HEAD(inode) ((inode).i_zone[0])
61 #define PIPE_TAIL(inode) ((inode).i_zone[1])
62 #define PIPE_SIZE(inode) ((PIPE_HEAD(inode)-PIPE_TAIL(inode))&(PAGE_SIZE-1))
63 #define PIPE_EMPTY(inode) (PIPE_HEAD(inode)==PIPE_TAIL(inode))
64 #define PIPE_FULL(inode) (PIPE_SIZE(inode)==(PAGE_SIZE-1))
65
66 #define NIL_FILP ((struct file *)0) // ���ļ��ṹָ�롣
67 #define SEL_IN 1
68 #define SEL_OUT 2
69 #define SEL_EX 4
70
71 typedef char buffer_block[BLOCK_SIZE]; // �黺������
72
// �����ͷ���ݽṹ������Ϊ��Ҫ��������
// �ڳ����г���bh����ʾbuffer_head���͵���д��
73 struct buffer_head {
74 char * b_data; /* pointer to data block (1024 bytes) */ //ָ�롣
75 unsigned long b_blocknr; /* block number */ // ��š�
76 unsigned short b_dev; /* device (0 = free) */ // ����Դ���豸�š�
77 unsigned char b_uptodate; // ���±�־����ʾ�����Ƿ��Ѹ��¡�
78 unsigned char b_dirt; /* 0-clean,1-dirty */ //�ı�־:0δ��,1����.
79 unsigned char b_count; /* users using this block */ // ʹ�õ��û�����
80 unsigned char b_lock; /* 0 - ok, 1 -locked */ // �������Ƿ�������
81 struct task_struct * b_wait; // ָ��ȴ��û���������������
82 struct buffer_head * b_prev; // hash������ǰһ�飨���ĸ�ָ�����ڻ������Ĺ�������
83 struct buffer_head * b_next; // hash��������һ�顣
84 struct buffer_head * b_prev_free; // ���б���ǰһ�顣
85 struct buffer_head * b_next_free; // ���б�����һ�顣
86 };
87
// �����ϵ������ڵ�(i�ڵ�)���ݽṹ��
88 struct d_inode {
89 unsigned short i_mode; // �ļ����ͺ�����(rwxλ)��
90 unsigned short i_uid; // �û�id���ļ�ӵ���߱�ʶ������
91 unsigned long i_size; // �ļ���С���ֽ�������
92 unsigned long i_time; // ��ʱ�䣨��1970.1.1:0�����룩��
93 unsigned char i_gid; // ��id(�ļ�ӵ�������ڵ���)��
94 unsigned char i_nlinks; // �����������ٸ��ļ�Ŀ¼��ָ���i�ڵ㣩��
95 unsigned short i_zone[9]; // ֱ��(0-6)�����(7)��˫�ؼ��(8)����š�
// zone��������˼����������Σ������顣
96 };
97
// �������ڴ��е�i�ڵ�ṹ��ǰ7����d_inode��ȫһ����
98 struct m_inode {
99 unsigned short i_mode; // �ļ����ͺ�����(rwxλ)��
100 unsigned short i_uid; // �û�id���ļ�ӵ���߱�ʶ������
101 unsigned long i_size; // �ļ���С���ֽ�������
102 unsigned long i_mtime; // ��ʱ�䣨��1970.1.1:0�����룩��
103 unsigned char i_gid; // ��id(�ļ�ӵ�������ڵ���)��
104 unsigned char i_nlinks; // �ļ�Ŀ¼����������
105 unsigned short i_zone[9]; // ֱ��(0-6)�����(7)��˫�ؼ��(8)����š�
106 /* these are in memory also */
107 struct task_struct * i_wait; // �ȴ���i�ڵ�Ľ��̡�
108 struct task_struct * i_wait2; /* for pipes */
109 unsigned long i_atime; // ������ʱ�䡣
110 unsigned long i_ctime; // i�ڵ�������ʱ�䡣
111 unsigned short i_dev; // i�ڵ����ڵ��豸�š�
112 unsigned short i_num; // i�ڵ�š�
113 unsigned short i_count; // i�ڵ㱻ʹ�õĴ�����0��ʾ��i�ڵ���С�
114 unsigned char i_lock; // ������־��
115 unsigned char i_dirt; // ����(��)��־��
116 unsigned char i_pipe; // �ܵ���־��
117 unsigned char i_mount; // ��װ��־��
118 unsigned char i_seek; // ��Ѱ��־(lseekʱ)��
119 unsigned char i_update; // ���±�־��
120 };
121
// �ļ��ṹ���������ļ������i�ڵ�֮�佨����ϵ��
122 struct file {
123 unsigned short f_mode; // �ļ�����ģʽ��RWλ��
124 unsigned short f_flags; // �ļ��Ϳ��Ƶı�־��
125 unsigned short f_count; // ��Ӧ�ļ����ü���ֵ��
126 struct m_inode * f_inode; // ָ���Ӧi�ڵ㡣
127 off_t f_pos; // �ļ�λ�ã���дƫ��ֵ����
128 };
129
// �ڴ��д��̳�����ṹ��
130 struct super_block {
131 unsigned short s_ninodes; // �ڵ�����
132 unsigned short s_nzones; // ��������
133 unsigned short s_imap_blocks; // i�ڵ�λͼ��ռ�õ����ݿ�����
134 unsigned short s_zmap_blocks; // ����λͼ��ռ�õ����ݿ�����
135 unsigned short s_firstdatazone; // ��һ����������š�
136 unsigned short s_log_zone_size; // log(���ݿ���/����)������2Ϊ�ף���
137 unsigned long s_max_size; // �ļ���ȡ�
138 unsigned short s_magic; // �ļ�ϵͳħ����
139 /* These are only in memory */
140 struct buffer_head * s_imap[8]; // i�ڵ�λͼ�����ָ������(ռ��8�飬�ɱ�ʾ64M)��
141 struct buffer_head * s_zmap[8]; // ����λͼ�����ָ�����飨ռ��8�飩��
142 unsigned short s_dev; // ���������ڵ��豸�š�
143 struct m_inode * s_isup; // ����װ���ļ�ϵͳ��Ŀ¼��i�ڵ㡣(isup-super i)
144 struct m_inode * s_imount; // ����װ����i�ڵ㡣
145 unsigned long s_time; // ��ʱ�䡣
146 struct task_struct * s_wait; // �ȴ��ó�����Ľ��̡�
147 unsigned char s_lock; // ��������־��
148 unsigned char s_rd_only; // ֻ����־��
149 unsigned char s_dirt; // ����(��)��־��
150 };
151
// �����ϳ�����ṹ������125-132����ȫһ����
152 struct d_super_block {
153 unsigned short s_ninodes; // �ڵ�����
154 unsigned short s_nzones; // ��������
155 unsigned short s_imap_blocks; // i�ڵ�λͼ��ռ�õ����ݿ�����
156 unsigned short s_zmap_blocks; // ����λͼ��ռ�õ����ݿ�����
157 unsigned short s_firstdatazone; // ��һ���������顣
158 unsigned short s_log_zone_size; // log(���ݿ���/����)������2Ϊ�ף���
159 unsigned long s_max_size; // �ļ���ȡ�
160 unsigned short s_magic; // �ļ�ϵͳħ����
161 };
162
// �ļ�Ŀ¼��ṹ��
163 struct dir_entry {
164 unsigned short inode; // i�ڵ�š�
165 char name[NAME_LEN]; // ���������NAME_LEN=14��
166 };
167
168 extern struct m_inode inode_table[NR_INODE]; // ����i�ڵ�����飨32���
169 extern struct file file_table[NR_FILE]; // �ļ������飨64���
170 extern struct super_block super_block[NR_SUPER]; // ���������飨8���
171 extern struct buffer_head * start_buffer; // ��������ʼ�ڴ�λ�á�
172 extern int nr_buffers; // ���������
173
//// ���̲�������ԭ�͡�
// ����������������Ƿ�ı䡣
174 extern void check_disk_change(int dev);
// ���ָ�����������̸��������������̸�������1������0��
175 extern int floppy_change(unsigned int nr);
// ��������ָ������������ȴ���ʱ�䣨���õȴ���ʱ������
176 extern int ticks_to_floppy_on(unsigned int dev);
// ����ָ����������
177 extern void floppy_on(unsigned int dev);
// �ر�ָ����������������
178 extern void floppy_off(unsigned int dev);
//// �������ļ�ϵͳ���������õĺ���ԭ�͡�
// ��i�ڵ�ָ�����ļ���Ϊ0��
179 extern void truncate(struct m_inode * inode);
// ˢ��i�ڵ���Ϣ��
180 extern void sync_inodes(void);
// �ȴ�ָ����i�ڵ㡣
181 extern void wait_on(struct m_inode * inode);
// ����(���Σ����̿�)λͼ������ȡ���ݿ�block���豸�϶�Ӧ������š�
182 extern int bmap(struct m_inode * inode,int block);
// �������ݿ�block���豸�϶�Ӧ�����飬���������豸�ϵ�����š�
183 extern int create_block(struct m_inode * inode,int block);
// ��ȡָ��·������i�ڵ�š�
184 extern struct m_inode * namei(const char * pathname);
// ȡָ��·������i�ڵ㣬������������ӡ�
185 extern struct m_inode * lnamei(const char * pathname);
// ����·����Ϊ���ļ�����������
186 extern int open_namei(const char * pathname, int flag, int mode,
187 struct m_inode ** res_inode);
// �ͷ�һ��i�ڵ�(��д���豸)��
188 extern void iput(struct m_inode * inode);
// ���豸��ȡָ���ڵ�ŵ�һ��i�ڵ㡣
189 extern struct m_inode * iget(int dev,int nr);
// ��i�ڵ��(inode_table)�л�ȡһ������i�ڵ��
190 extern struct m_inode * get_empty_inode(void);
// ��ȡ������һ���ܵ��ڵ㡣����Ϊi�ڵ�ָ�루�����NULL��ʧ�ܣ���
191 extern struct m_inode * get_pipe_inode(void);
// �ڹ�ϣ���в���ָ�������ݿ顣�����ҵ���Ļ���ͷָ�롣
192 extern struct buffer_head * get_hash_table(int dev, int block);
// ���豸��ȡָ���飨���Ȼ���hash���в��ң���
193 extern struct buffer_head * getblk(int dev, int block);
// ��/д���ݿ顣
194 extern void ll_rw_block(int rw, struct buffer_head * bh);
// ��/д����ҳ�棬��ÿ��4�����ݿ顣
195 extern void ll_rw_page(int rw, int dev, int nr, char * buffer);
// �ͷ�ָ������顣
196 extern void brelse(struct buffer_head * buf);
// ��ȡָ�������ݿ顣
197 extern struct buffer_head * bread(int dev,int block);
// ��4�黺������ָ����ַ���ڴ��С�
198 extern void bread_page(unsigned long addr,int dev,int b[4]);
// ��ȡͷһ��ָ�������ݿ飬����Ǻ�����Ҫ���Ŀ顣
199 extern struct buffer_head * breada(int dev,int block,...);
// ���豸dev����һ�����̿飨���Σ����飩�����������
200 extern int new_block(int dev);
// �ͷ��豸�������е�����(���Σ����̿�)block����λָ������block������λͼ����λ��
201 extern void free_block(int dev, int block);
// Ϊ�豸dev����һ����i�ڵ㣬����i�ڵ�š�
202 extern struct m_inode * new_inode(int dev);
// �ͷ�һ��i�ڵ㣨ɾ���ļ�ʱ����
203 extern void free_inode(struct m_inode * inode);
// ˢ��ָ���豸��������
204 extern int sync_dev(int dev);
// ��ȡָ���豸�ij����顣
205 extern struct super_block * get_super(int dev);
206 extern int ROOT_DEV;
207
// ��װ���ļ�ϵͳ��
208 extern void mount_root(void);
209
210 #endif
211