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