|
|
1.1 root 1: /*
2: * linux/fs/minix/inode.c
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
7: #include <string.h>
8: #include <sys/stat.h>
9:
10: #include <linux/sched.h>
11: #include <linux/minix_fs.h>
12: #include <linux/kernel.h>
13: #include <linux/mm.h>
14: #include <asm/system.h>
15:
16: static int _bmap(struct inode * inode,int block,int create)
17: {
18: struct buffer_head * bh;
19: int i;
20:
21: if (block<0)
22: panic("_bmap: block<0");
23: if (block >= 7+512+512*512)
24: panic("_bmap: block>big");
25: if (block<7) {
26: if (create && !inode->i_data[block])
27: if (inode->i_data[block]=minix_new_block(inode->i_dev)) {
28: inode->i_ctime=CURRENT_TIME;
29: inode->i_dirt=1;
30: }
31: return inode->i_data[block];
32: }
33: block -= 7;
34: if (block<512) {
35: if (create && !inode->i_data[7])
36: if (inode->i_data[7]=minix_new_block(inode->i_dev)) {
37: inode->i_dirt=1;
38: inode->i_ctime=CURRENT_TIME;
39: }
40: if (!inode->i_data[7])
41: return 0;
42: if (!(bh = bread(inode->i_dev,inode->i_data[7])))
43: return 0;
44: i = ((unsigned short *) (bh->b_data))[block];
45: if (create && !i)
46: if (i=minix_new_block(inode->i_dev)) {
47: ((unsigned short *) (bh->b_data))[block]=i;
48: bh->b_dirt=1;
49: }
50: brelse(bh);
51: return i;
52: }
53: block -= 512;
54: if (create && !inode->i_data[8])
55: if (inode->i_data[8]=minix_new_block(inode->i_dev)) {
56: inode->i_dirt=1;
57: inode->i_ctime=CURRENT_TIME;
58: }
59: if (!inode->i_data[8])
60: return 0;
61: if (!(bh=bread(inode->i_dev,inode->i_data[8])))
62: return 0;
63: i = ((unsigned short *)bh->b_data)[block>>9];
64: if (create && !i)
65: if (i=minix_new_block(inode->i_dev)) {
66: ((unsigned short *) (bh->b_data))[block>>9]=i;
67: bh->b_dirt=1;
68: }
69: brelse(bh);
70: if (!i)
71: return 0;
72: if (!(bh=bread(inode->i_dev,i)))
73: return 0;
74: i = ((unsigned short *)bh->b_data)[block&511];
75: if (create && !i)
76: if (i=minix_new_block(inode->i_dev)) {
77: ((unsigned short *) (bh->b_data))[block&511]=i;
78: bh->b_dirt=1;
79: }
80: brelse(bh);
81: return i;
82: }
83:
84: int minix_bmap(struct inode * inode,int block)
85: {
86: return _bmap(inode,block,0);
87: }
88:
89: int minix_create_block(struct inode * inode, int block)
90: {
91: return _bmap(inode,block,1);
92: }
93:
94: void minix_read_inode(struct inode * inode)
95: {
96: struct buffer_head * bh;
97: struct minix_inode * raw_inode;
98: int block;
99:
100: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks +
101: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
102: if (!(bh=bread(inode->i_dev,block)))
103: panic("unable to read i-node block");
104: raw_inode = ((struct minix_inode *) bh->b_data) +
105: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
106: inode->i_mode = raw_inode->i_mode;
107: inode->i_uid = raw_inode->i_uid;
108: inode->i_gid = raw_inode->i_gid;
109: inode->i_nlink = raw_inode->i_nlinks;
110: inode->i_size = raw_inode->i_size;
111: inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time;
112: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
113: inode->i_rdev = raw_inode->i_zone[0];
114: else for (block = 0; block < 9; block++)
115: inode->i_data[block] = raw_inode->i_zone[block];
116: brelse(bh);
117: inode->i_op = &minix_inode_operations;
118: }
119:
120: void minix_write_inode(struct inode * inode)
121: {
122: struct buffer_head * bh;
123: struct minix_inode * raw_inode;
124: int block;
125:
126: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks +
127: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
128: if (!(bh=bread(inode->i_dev,block)))
129: panic("unable to read i-node block");
130: raw_inode = ((struct minix_inode *)bh->b_data) +
131: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
132: raw_inode->i_mode = inode->i_mode;
133: raw_inode->i_uid = inode->i_uid;
134: raw_inode->i_gid = inode->i_gid;
135: raw_inode->i_nlinks = inode->i_nlink;
136: raw_inode->i_size = inode->i_size;
137: raw_inode->i_time = inode->i_mtime;
138: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
139: raw_inode->i_zone[0] = inode->i_rdev;
140: else for (block = 0; block < 9; block++)
141: raw_inode->i_zone[block] = inode->i_data[block];
142: bh->b_dirt=1;
143: inode->i_dirt=0;
144: brelse(bh);
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.