1
2
3
4
5
6 #ifndef _FS_H
7 #define _FS_H
8
9 #include <sys/types.h>
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #define IS_SEEKABLE(x) ((x)>=1 && (x)<=3)
25
26 #define READ 0
27 #define WRITE 1
28 #define READA 2
29 #define WRITEA 3
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
38
39 #define I_MAP_SLOTS 8
40 #define Z_MAP_SLOTS 8
41 #define SUPER_MAGIC 0x137F
42
43 #define NR_OPEN 20
44 #define NR_INODE 32
45 #define NR_FILE 64
46 #define NR_SUPER 8
47 #define NR_HASH 307
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
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_HEAD(inode) ((inode).i_zone[0])
59 #define PIPE_TAIL(inode) ((inode).i_zone[1])
60 #define PIPE_SIZE(inode) ((PIPE_HEAD(inode)-PIPE_TAIL(inode))&(PAGE_SIZE-1))
61 #define PIPE_EMPTY(inode) (PIPE_HEAD(inode)==PIPE_TAIL(inode))
62 #define PIPE_FULL(inode) (PIPE_SIZE(inode)==(PAGE_SIZE-1))
63 #define INC_PIPE(head) \
64 __asm__("incl %0\n\tandl $4095,%0"::"m" (head))
65
66 typedef char buffer_block[BLOCK_SIZE];
67
68 struct buffer_head {
69 char * b_data;
70 unsigned long b_blocknr;
71 unsigned short b_dev;
72 unsigned char b_uptodate;
73 unsigned char b_dirt;
74 unsigned char b_count;
75 unsigned char b_lock;
76 struct task_struct * b_wait;
77 struct buffer_head * b_prev;
78 struct buffer_head * b_next;
79 struct buffer_head * b_prev_free;
80 struct buffer_head * b_next_free;
81 };
82
83 struct d_inode {
84 unsigned short i_mode;
85 unsigned short i_uid;
86 unsigned long i_size;
87 unsigned long i_time;
88 unsigned char i_gid;
89 unsigned char i_nlinks;
90 unsigned short i_zone[9];
91 };
92
93 struct m_inode {
94 unsigned short i_mode;
95 unsigned short i_uid;
96 unsigned long i_size;
97 unsigned long i_mtime;
98 unsigned char i_gid;
99 unsigned char i_nlinks;
100 unsigned short i_zone[9];
101
102 struct task_struct * i_wait;
103 unsigned long i_atime;
104 unsigned long i_ctime;
105 unsigned short i_dev;
106 unsigned short i_num;
107 unsigned short i_count;
108 unsigned char i_lock;
109 unsigned char i_dirt;
110 unsigned char i_pipe;
111 unsigned char i_mount;
112 unsigned char i_seek;
113 unsigned char i_update;
114 };
115
116 struct file {
117 unsigned short f_mode;
118 unsigned short f_flags;
119 unsigned short f_count;
120 struct m_inode * f_inode;
121 off_t f_pos;
122 };
123
124 struct super_block {
125 unsigned short s_ninodes;
126 unsigned short s_nzones;
127 unsigned short s_imap_blocks;
128 unsigned short s_zmap_blocks;
129 unsigned short s_firstdatazone;
130 unsigned short s_log_zone_size;
131 unsigned long s_max_size;
132 unsigned short s_magic;
133
134 struct buffer_head * s_imap[8];
135 struct buffer_head * s_zmap[8];
136 unsigned short s_dev;
137 struct m_inode * s_isup;
138 struct m_inode * s_imount;
139 unsigned long s_time;
140 struct task_struct * s_wait;
141 unsigned char s_lock;
142 unsigned char s_rd_only;
143 unsigned char s_dirt;
144 };
145
146 struct d_super_block {
147 unsigned short s_ninodes;
148 unsigned short s_nzones;
149 unsigned short s_imap_blocks;
150 unsigned short s_zmap_blocks;
151 unsigned short s_firstdatazone;
152 unsigned short s_log_zone_size;
153 unsigned long s_max_size;
154 unsigned short s_magic;
155 };
156
157 struct dir_entry {
158 unsigned short inode;
159 char name[NAME_LEN];
160 };
161
162 extern struct m_inode inode_table[NR_INODE];
163 extern struct file file_table[NR_FILE];
164 extern struct super_block super_block[NR_SUPER];
165 extern struct buffer_head * start_buffer;
166 extern int nr_buffers;
167
168 extern void check_disk_change(int dev);
169 extern int floppy_change(unsigned int nr);
170 extern int ticks_to_floppy_on(unsigned int dev);
171 extern void floppy_on(unsigned int dev);
172 extern void floppy_off(unsigned int dev);
173 extern void truncate(struct m_inode * inode);
174 extern void sync_inodes(void);
175 extern void wait_on(struct m_inode * inode);
176 extern int bmap(struct m_inode * inode,int block);
177 extern int create_block(struct m_inode * inode,int block);
178 extern struct m_inode * namei(const char * pathname);
179 extern int open_namei(const char * pathname, int flag, int mode,
180 struct m_inode ** res_inode);
181 extern void iput(struct m_inode * inode);
182 extern struct m_inode * iget(int dev,int nr);
183 extern struct m_inode * get_empty_inode(void);
184 extern struct m_inode * get_pipe_inode(void);
185 extern struct buffer_head * get_hash_table(int dev, int block);
186 extern struct buffer_head * getblk(int dev, int block);
187 extern void ll_rw_block(int rw, struct buffer_head * bh);
188 extern void brelse(struct buffer_head * buf);
189 extern struct buffer_head * bread(int dev,int block);
190 extern void bread_page(unsigned long addr,int dev,int b[4]);
191 extern struct buffer_head * breada(int dev,int block,...);
192 extern int new_block(int dev);
193 extern void free_block(int dev, int block);
194 extern struct m_inode * new_inode(int dev);
195 extern void free_inode(struct m_inode * inode);
196 extern int sync_dev(int dev);
197 extern struct super_block * get_super(int dev);
198 extern int ROOT_DEV;
199
200 extern void mount_root(void);
201
202 #endif