This source file includes following definitions.
- proc_put_inode
- proc_put_super
- proc_read_super
- proc_statfs
- proc_read_inode
- proc_write_inode
1
2
3
4
5
6
7 #include <linux/sched.h>
8 #include <linux/proc_fs.h>
9 #include <linux/kernel.h>
10 #include <linux/mm.h>
11 #include <linux/string.h>
12 #include <linux/stat.h>
13 #include <linux/locks.h>
14 #include <linux/limits.h>
15
16 #include <asm/system.h>
17 #include <asm/segment.h>
18
19 void proc_put_inode(struct inode *inode)
20 {
21 if (inode->i_nlink)
22 return;
23 inode->i_size = 0;
24 }
25
26 void proc_put_super(struct super_block *sb)
27 {
28 lock_super(sb);
29 sb->s_dev = 0;
30 unlock_super(sb);
31 }
32
33 static struct super_operations proc_sops = {
34 proc_read_inode,
35 NULL,
36 proc_write_inode,
37 proc_put_inode,
38 proc_put_super,
39 NULL,
40 proc_statfs,
41 NULL
42 };
43
44 struct super_block *proc_read_super(struct super_block *s,void *data,
45 int silent)
46 {
47 lock_super(s);
48 s->s_blocksize = 1024;
49 s->s_magic = PROC_SUPER_MAGIC;
50 s->s_op = &proc_sops;
51 unlock_super(s);
52 if (!(s->s_mounted = iget(s,PROC_ROOT_INO))) {
53 s->s_dev = 0;
54 printk("get root inode failed\n");
55 return NULL;
56 }
57 return s;
58 }
59
60 void proc_statfs(struct super_block *sb, struct statfs *buf)
61 {
62 put_fs_long(PROC_SUPER_MAGIC, &buf->f_type);
63 put_fs_long(1024, &buf->f_bsize);
64 put_fs_long(0, &buf->f_blocks);
65 put_fs_long(0, &buf->f_bfree);
66 put_fs_long(0, &buf->f_bavail);
67 put_fs_long(0, &buf->f_files);
68 put_fs_long(0, &buf->f_ffree);
69 put_fs_long(NAME_MAX, &buf->f_namelen);
70
71 }
72
73 void proc_read_inode(struct inode * inode)
74 {
75 unsigned long ino, pid;
76 struct task_struct * p;
77 int i;
78
79 inode->i_op = NULL;
80 inode->i_mode = 0;
81 inode->i_uid = 0;
82 inode->i_gid = 0;
83 inode->i_nlink = 1;
84 inode->i_size = 0;
85 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
86 inode->i_blocks = inode->i_blksize = 0;
87 ino = inode->i_ino;
88 pid = ino >> 16;
89 p = task[0];
90 for (i = 0; i < NR_TASKS ; i++)
91 if ((p = task[i]) && (p->pid == pid))
92 break;
93 if (!p || i >= NR_TASKS)
94 return;
95 if (ino == PROC_ROOT_INO) {
96 inode->i_mode = S_IFDIR | 0555;
97 inode->i_nlink = 2;
98 for (i = 1 ; i < NR_TASKS ; i++)
99 if (task[i])
100 inode->i_nlink++;
101 inode->i_op = &proc_root_inode_operations;
102 return;
103 }
104 if ((ino >= 128) && (ino <= 160)) {
105 inode->i_mode = S_IFREG | 0444;
106 inode->i_op = &proc_net_inode_operations;
107 return;
108 }
109 if (!pid) {
110 switch (ino) {
111 case 5:
112 inode->i_mode = S_IFREG | 0444;
113 inode->i_op = &proc_kmsg_inode_operations;
114 break;
115 case 8:
116 inode->i_mode = S_IFDIR | 0555;
117 inode->i_nlink = 2;
118 inode->i_op = &proc_net_inode_operations;
119 break;
120 default:
121 inode->i_mode = S_IFREG | 0444;
122 inode->i_op = &proc_array_inode_operations;
123 break;
124 }
125 return;
126 }
127 ino &= 0x0000ffff;
128 inode->i_uid = p->euid;
129 inode->i_gid = p->egid;
130 switch (ino) {
131 case 2:
132 inode->i_nlink = 4;
133 inode->i_mode = S_IFDIR | 0555;
134 inode->i_op = &proc_base_inode_operations;
135 return;
136 case 3:
137 inode->i_op = &proc_mem_inode_operations;
138 inode->i_mode = S_IFREG | 0600;
139 return;
140 case 4:
141 case 5:
142 case 6:
143 inode->i_op = &proc_link_inode_operations;
144 inode->i_size = 64;
145 inode->i_mode = S_IFLNK | 0700;
146 return;
147 case 7:
148 case 8:
149 inode->i_mode = S_IFDIR | 0500;
150 inode->i_op = &proc_fd_inode_operations;
151 inode->i_nlink = 2;
152 return;
153 case 9:
154 case 10:
155 case 11:
156 case 12:
157 inode->i_mode = S_IFREG | 0444;
158 inode->i_op = &proc_array_inode_operations;
159 return;
160 }
161 switch (ino >> 8) {
162 case 1:
163 ino &= 0xff;
164 if (ino >= NR_OPEN || !p->filp[ino])
165 return;
166 inode->i_op = &proc_link_inode_operations;
167 inode->i_size = 64;
168 inode->i_mode = S_IFLNK | 0700;
169 return;
170 case 2:
171 ino &= 0xff;
172 if (ino >= p->numlibraries)
173 return;
174 inode->i_op = &proc_link_inode_operations;
175 inode->i_size = 64;
176 inode->i_mode = S_IFLNK | 0700;
177 return;
178 }
179 return;
180 }
181
182 void proc_write_inode(struct inode * inode)
183 {
184 inode->i_dirt=0;
185 }