This source file includes following definitions.
- proc_put_inode
- proc_put_super
- proc_read_super
- proc_statfs
- proc_bmap
- proc_create_block
- 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 };
42
43 struct super_block *proc_read_super(struct super_block *s,void *data)
44 {
45 lock_super(s);
46 s->s_blocksize = 1024;
47 s->s_magic = PROC_SUPER_MAGIC;
48 s->s_op = &proc_sops;
49 unlock_super(s);
50 if (!(s->s_mounted = iget(s,PROC_ROOT_INO))) {
51 s->s_dev = 0;
52 printk("get root inode failed\n");
53 return NULL;
54 }
55 return s;
56 }
57
58 void proc_statfs(struct super_block *sb, struct statfs *buf)
59 {
60 put_fs_long(PROC_SUPER_MAGIC, &buf->f_type);
61 put_fs_long(1024, &buf->f_bsize);
62 put_fs_long(0, &buf->f_blocks);
63 put_fs_long(0, &buf->f_bfree);
64 put_fs_long(0, &buf->f_bavail);
65 put_fs_long(0, &buf->f_files);
66 put_fs_long(0, &buf->f_ffree);
67
68 }
69
70 int proc_bmap(struct inode * inode,int block)
71 {
72 return 0;
73 }
74
75 int proc_create_block(struct inode * inode, int block)
76 {
77 return 0;
78 }
79
80 void proc_read_inode(struct inode * inode)
81 {
82 unsigned long ino, pid;
83 struct task_struct * p;
84 int i;
85
86 inode->i_op = NULL;
87 inode->i_mode = 0;
88 inode->i_uid = 0;
89 inode->i_gid = 0;
90 inode->i_nlink = 1;
91 inode->i_size = 0;
92 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
93 inode->i_blocks = inode->i_blksize = 0;
94 ino = inode->i_ino;
95 pid = ino >> 16;
96 p = task[0];
97 for (i = 0; i < NR_TASKS ; i++)
98 if ((p = task[i]) && (p->pid == pid))
99 break;
100 if (!p || i >= NR_TASKS)
101 return;
102 if (ino == PROC_ROOT_INO) {
103 inode->i_mode = S_IFDIR | 0555;
104 inode->i_nlink = 2;
105 for (i = 1 ; i < NR_TASKS ; i++)
106 if (task[i])
107 inode->i_nlink++;
108 inode->i_op = &proc_root_inode_operations;
109 return;
110 }
111 if (!pid) {
112 inode->i_mode = S_IFREG | 0444;
113 inode->i_op = &proc_array_inode_operations;
114 return;
115 }
116 ino &= 0x0000ffff;
117 inode->i_uid = p->euid;
118 inode->i_gid = p->egid;
119 switch (ino) {
120 case 2:
121 inode->i_nlink = 4;
122 inode->i_mode = S_IFDIR | 0555;
123 inode->i_op = &proc_base_inode_operations;
124 return;
125 case 3:
126 inode->i_op = &proc_mem_inode_operations;
127 inode->i_mode = S_IFCHR | 0600;
128 inode->i_rdev = 0x0101;
129 return;
130 case 4:
131 case 5:
132 case 6:
133 inode->i_op = &proc_link_inode_operations;
134 inode->i_size = 3;
135 inode->i_mode = S_IFLNK | 0700;
136 return;
137 case 7:
138 case 8:
139 inode->i_mode = S_IFDIR | 0500;
140 inode->i_op = &proc_fd_inode_operations;
141 inode->i_nlink = 2;
142 return;
143 case 9:
144 case 10:
145 case 11:
146 inode->i_mode = S_IFREG | 0444;
147 inode->i_op = &proc_array_inode_operations;
148 return;
149 }
150 switch (ino >> 8) {
151 case 1:
152 ino &= 0xff;
153 if (ino >= NR_OPEN || !p->filp[ino])
154 return;
155 inode->i_op = &proc_link_inode_operations;
156 inode->i_size = 3;
157 inode->i_mode = S_IFLNK | 0700;
158 return;
159 case 2:
160 ino &= 0xff;
161 if (ino >= p->numlibraries)
162 return;
163 inode->i_op = &proc_link_inode_operations;
164 inode->i_size = 3;
165 inode->i_mode = S_IFLNK | 0700;
166 return;
167 }
168 return;
169 }
170
171 void proc_write_inode(struct inode * inode)
172 {
173 inode->i_dirt=0;
174 }