����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