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