|
|
1.1 root 1: #include <string.h>
2:
3: #include <linux/sched.h>
4: #include <linux/kernel.h>
5: #include <linux/mm.h>
6: #include <asm/system.h>
7:
8: struct m_inode inode_table[NR_INODE]={{0,},};
9:
10: static void read_inode(struct m_inode * inode);
11: static void write_inode(struct m_inode * inode);
12:
13: static inline void wait_on_inode(struct m_inode * inode)
14: {
15: cli();
16: while (inode->i_lock)
17: sleep_on(&inode->i_wait);
18: sti();
19: }
20:
21: static inline void lock_inode(struct m_inode * inode)
22: {
23: cli();
24: while (inode->i_lock)
25: sleep_on(&inode->i_wait);
26: inode->i_lock=1;
27: sti();
28: }
29:
30: static inline void unlock_inode(struct m_inode * inode)
31: {
32: inode->i_lock=0;
33: wake_up(&inode->i_wait);
34: }
35:
36: void sync_inodes(void)
37: {
38: int i;
39: struct m_inode * inode;
40:
41: inode = 0+inode_table;
42: for(i=0 ; i<NR_INODE ; i++,inode++) {
43: wait_on_inode(inode);
44: if (inode->i_dirt && !inode->i_pipe)
45: write_inode(inode);
46: }
47: }
48:
49: static int _bmap(struct m_inode * inode,int block,int create)
50: {
51: struct buffer_head * bh;
52: int i;
53:
54: if (block<0)
55: panic("_bmap: block<0");
56: if (block >= 7+512+512*512)
57: panic("_bmap: block>big");
58: if (block<7) {
59: if (create && !inode->i_zone[block])
60: if (inode->i_zone[block]=new_block(inode->i_dev)) {
61: inode->i_ctime=CURRENT_TIME;
62: inode->i_dirt=1;
63: }
64: return inode->i_zone[block];
65: }
66: block -= 7;
67: if (block<512) {
68: if (create && !inode->i_zone[7])
69: if (inode->i_zone[7]=new_block(inode->i_dev)) {
70: inode->i_dirt=1;
71: inode->i_ctime=CURRENT_TIME;
72: }
73: if (!inode->i_zone[7])
74: return 0;
75: if (!(bh = bread(inode->i_dev,inode->i_zone[7])))
76: return 0;
77: i = ((unsigned short *) (bh->b_data))[block];
78: if (create && !i)
79: if (i=new_block(inode->i_dev)) {
80: ((unsigned short *) (bh->b_data))[block]=i;
81: bh->b_dirt=1;
82: }
83: brelse(bh);
84: return i;
85: }
86: block -= 512;
87: if (create && !inode->i_zone[8])
88: if (inode->i_zone[8]=new_block(inode->i_dev)) {
89: inode->i_dirt=1;
90: inode->i_ctime=CURRENT_TIME;
91: }
92: if (!inode->i_zone[8])
93: return 0;
94: if (!(bh=bread(inode->i_dev,inode->i_zone[8])))
95: return 0;
96: i = ((unsigned short *)bh->b_data)[block>>9];
97: if (create && !i)
98: if (i=new_block(inode->i_dev)) {
99: ((unsigned short *) (bh->b_data))[block>>9]=i;
100: bh->b_dirt=1;
101: }
102: brelse(bh);
103: if (!i)
104: return 0;
105: if (!(bh=bread(inode->i_dev,i)))
106: return 0;
107: i = ((unsigned short *)bh->b_data)[block&511];
108: if (create && !i)
109: if (i=new_block(inode->i_dev)) {
110: ((unsigned short *) (bh->b_data))[block&511]=i;
111: bh->b_dirt=1;
112: }
113: brelse(bh);
114: return i;
115: }
116:
117: int bmap(struct m_inode * inode,int block)
118: {
119: return _bmap(inode,block,0);
120: }
121:
122: int create_block(struct m_inode * inode, int block)
123: {
124: return _bmap(inode,block,1);
125: }
126:
127: void iput(struct m_inode * inode)
128: {
129: if (!inode)
130: return;
131: wait_on_inode(inode);
132: if (!inode->i_count)
133: panic("iput: trying to free free inode");
134: if (inode->i_pipe) {
135: wake_up(&inode->i_wait);
136: if (--inode->i_count)
137: return;
138: free_page(inode->i_size);
139: inode->i_count=0;
140: inode->i_dirt=0;
141: inode->i_pipe=0;
142: return;
143: }
144: if (!inode->i_dev || inode->i_count>1) {
145: inode->i_count--;
146: return;
147: }
148: repeat:
149: if (!inode->i_nlinks) {
150: truncate(inode);
151: free_inode(inode);
152: return;
153: }
154: if (inode->i_dirt) {
155: write_inode(inode); /* we can sleep - so do again */
156: wait_on_inode(inode);
157: goto repeat;
158: }
159: inode->i_count--;
160: return;
161: }
162:
163: static volatile int last_allocated_inode = 0;
164:
165: struct m_inode * get_empty_inode(void)
166: {
167: struct m_inode * inode;
168: int inr;
169:
170: while (1) {
171: inode = NULL;
172: inr = last_allocated_inode;
173: do {
174: if (!inode_table[inr].i_count) {
175: inode = inr + inode_table;
176: break;
177: }
178: inr++;
179: if (inr>=NR_INODE)
180: inr=0;
181: } while (inr != last_allocated_inode);
182: if (!inode) {
183: for (inr=0 ; inr<NR_INODE ; inr++)
184: printk("%04x: %6d\t",inode_table[inr].i_dev,
185: inode_table[inr].i_num);
186: panic("No free inodes in mem");
187: }
188: last_allocated_inode = inr;
189: wait_on_inode(inode);
190: while (inode->i_dirt) {
191: write_inode(inode);
192: wait_on_inode(inode);
193: }
194: if (!inode->i_count)
195: break;
196: }
197: memset(inode,0,sizeof(*inode));
198: inode->i_count = 1;
199: return inode;
200: }
201:
202: struct m_inode * get_pipe_inode(void)
203: {
204: struct m_inode * inode;
205:
206: if (!(inode = get_empty_inode()))
207: return NULL;
208: if (!(inode->i_size=get_free_page())) {
209: inode->i_count = 0;
210: return NULL;
211: }
212: inode->i_count = 2; /* sum of readers/writers */
213: PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0;
214: inode->i_pipe = 1;
215: return inode;
216: }
217:
218: struct m_inode * iget(int dev,int nr)
219: {
220: struct m_inode * inode, * empty;
221:
222: if (!dev)
223: panic("iget with dev==0");
224: empty = get_empty_inode();
225: inode = inode_table;
226: while (inode < NR_INODE+inode_table) {
227: if (inode->i_dev != dev || inode->i_num != nr) {
228: inode++;
229: continue;
230: }
231: wait_on_inode(inode);
232: if (inode->i_dev != dev || inode->i_num != nr) {
233: inode = inode_table;
234: continue;
235: }
236: inode->i_count++;
237: if (empty)
238: iput(empty);
239: return inode;
240: }
241: if (!empty)
242: return (NULL);
243: inode=empty;
244: inode->i_dev = dev;
245: inode->i_num = nr;
246: read_inode(inode);
247: return inode;
248: }
249:
250: static void read_inode(struct m_inode * inode)
251: {
252: struct super_block * sb;
253: struct buffer_head * bh;
254: int block;
255:
256: lock_inode(inode);
257: sb=get_super(inode->i_dev);
258: block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
259: (inode->i_num-1)/INODES_PER_BLOCK;
260: if (!(bh=bread(inode->i_dev,block)))
261: panic("unable to read i-node block");
262: *(struct d_inode *)inode =
263: ((struct d_inode *)bh->b_data)
264: [(inode->i_num-1)%INODES_PER_BLOCK];
265: brelse(bh);
266: unlock_inode(inode);
267: }
268:
269: static void write_inode(struct m_inode * inode)
270: {
271: struct super_block * sb;
272: struct buffer_head * bh;
273: int block;
274:
275: lock_inode(inode);
276: sb=get_super(inode->i_dev);
277: block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
278: (inode->i_num-1)/INODES_PER_BLOCK;
279: if (!(bh=bread(inode->i_dev,block)))
280: panic("unable to read i-node block");
281: ((struct d_inode *)bh->b_data)
282: [(inode->i_num-1)%INODES_PER_BLOCK] =
283: *(struct d_inode *)inode;
284: bh->b_dirt=1;
285: inode->i_dirt=0;
286: brelse(bh);
287: unlock_inode(inode);
288: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.