diff options
-rw-r--r-- | fs/proc/Makefile | 1 | ||||
-rw-r--r-- | fs/proc/devices.c | 70 | ||||
-rw-r--r-- | fs/proc/proc_misc.c | 60 |
3 files changed, 71 insertions, 60 deletions
diff --git a/fs/proc/Makefile b/fs/proc/Makefile index 48f9f0f121b0..f24ebfdc5b4f 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile | |||
@@ -10,6 +10,7 @@ proc-$(CONFIG_MMU) := mmu.o task_mmu.o | |||
10 | proc-y += inode.o root.o base.o generic.o array.o \ | 10 | proc-y += inode.o root.o base.o generic.o array.o \ |
11 | proc_tty.o proc_misc.o | 11 | proc_tty.o proc_misc.o |
12 | proc-y += cmdline.o | 12 | proc-y += cmdline.o |
13 | proc-y += devices.o | ||
13 | proc-y += loadavg.o | 14 | proc-y += loadavg.o |
14 | proc-y += meminfo.o | 15 | proc-y += meminfo.o |
15 | proc-y += uptime.o | 16 | proc-y += uptime.o |
diff --git a/fs/proc/devices.c b/fs/proc/devices.c new file mode 100644 index 000000000000..59ee7da959c9 --- /dev/null +++ b/fs/proc/devices.c | |||
@@ -0,0 +1,70 @@ | |||
1 | #include <linux/fs.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/proc_fs.h> | ||
4 | #include <linux/seq_file.h> | ||
5 | |||
6 | static int devinfo_show(struct seq_file *f, void *v) | ||
7 | { | ||
8 | int i = *(loff_t *) v; | ||
9 | |||
10 | if (i < CHRDEV_MAJOR_HASH_SIZE) { | ||
11 | if (i == 0) | ||
12 | seq_printf(f, "Character devices:\n"); | ||
13 | chrdev_show(f, i); | ||
14 | } | ||
15 | #ifdef CONFIG_BLOCK | ||
16 | else { | ||
17 | i -= CHRDEV_MAJOR_HASH_SIZE; | ||
18 | if (i == 0) | ||
19 | seq_printf(f, "\nBlock devices:\n"); | ||
20 | blkdev_show(f, i); | ||
21 | } | ||
22 | #endif | ||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | static void *devinfo_start(struct seq_file *f, loff_t *pos) | ||
27 | { | ||
28 | if (*pos < (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE)) | ||
29 | return pos; | ||
30 | return NULL; | ||
31 | } | ||
32 | |||
33 | static void *devinfo_next(struct seq_file *f, void *v, loff_t *pos) | ||
34 | { | ||
35 | (*pos)++; | ||
36 | if (*pos >= (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE)) | ||
37 | return NULL; | ||
38 | return pos; | ||
39 | } | ||
40 | |||
41 | static void devinfo_stop(struct seq_file *f, void *v) | ||
42 | { | ||
43 | /* Nothing to do */ | ||
44 | } | ||
45 | |||
46 | static const struct seq_operations devinfo_ops = { | ||
47 | .start = devinfo_start, | ||
48 | .next = devinfo_next, | ||
49 | .stop = devinfo_stop, | ||
50 | .show = devinfo_show | ||
51 | }; | ||
52 | |||
53 | static int devinfo_open(struct inode *inode, struct file *filp) | ||
54 | { | ||
55 | return seq_open(filp, &devinfo_ops); | ||
56 | } | ||
57 | |||
58 | static const struct file_operations proc_devinfo_operations = { | ||
59 | .open = devinfo_open, | ||
60 | .read = seq_read, | ||
61 | .llseek = seq_lseek, | ||
62 | .release = seq_release, | ||
63 | }; | ||
64 | |||
65 | static int __init proc_devices_init(void) | ||
66 | { | ||
67 | proc_create("devices", 0, NULL, &proc_devinfo_operations); | ||
68 | return 0; | ||
69 | } | ||
70 | module_init(proc_devices_init); | ||
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index fea7d658fff6..a6fadc0cc4b0 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
@@ -107,65 +107,6 @@ static const struct file_operations proc_cpuinfo_operations = { | |||
107 | .release = seq_release, | 107 | .release = seq_release, |
108 | }; | 108 | }; |
109 | 109 | ||
110 | static int devinfo_show(struct seq_file *f, void *v) | ||
111 | { | ||
112 | int i = *(loff_t *) v; | ||
113 | |||
114 | if (i < CHRDEV_MAJOR_HASH_SIZE) { | ||
115 | if (i == 0) | ||
116 | seq_printf(f, "Character devices:\n"); | ||
117 | chrdev_show(f, i); | ||
118 | } | ||
119 | #ifdef CONFIG_BLOCK | ||
120 | else { | ||
121 | i -= CHRDEV_MAJOR_HASH_SIZE; | ||
122 | if (i == 0) | ||
123 | seq_printf(f, "\nBlock devices:\n"); | ||
124 | blkdev_show(f, i); | ||
125 | } | ||
126 | #endif | ||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | static void *devinfo_start(struct seq_file *f, loff_t *pos) | ||
131 | { | ||
132 | if (*pos < (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE)) | ||
133 | return pos; | ||
134 | return NULL; | ||
135 | } | ||
136 | |||
137 | static void *devinfo_next(struct seq_file *f, void *v, loff_t *pos) | ||
138 | { | ||
139 | (*pos)++; | ||
140 | if (*pos >= (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE)) | ||
141 | return NULL; | ||
142 | return pos; | ||
143 | } | ||
144 | |||
145 | static void devinfo_stop(struct seq_file *f, void *v) | ||
146 | { | ||
147 | /* Nothing to do */ | ||
148 | } | ||
149 | |||
150 | static const struct seq_operations devinfo_ops = { | ||
151 | .start = devinfo_start, | ||
152 | .next = devinfo_next, | ||
153 | .stop = devinfo_stop, | ||
154 | .show = devinfo_show | ||
155 | }; | ||
156 | |||
157 | static int devinfo_open(struct inode *inode, struct file *filp) | ||
158 | { | ||
159 | return seq_open(filp, &devinfo_ops); | ||
160 | } | ||
161 | |||
162 | static const struct file_operations proc_devinfo_operations = { | ||
163 | .open = devinfo_open, | ||
164 | .read = seq_read, | ||
165 | .llseek = seq_lseek, | ||
166 | .release = seq_release, | ||
167 | }; | ||
168 | |||
169 | static int vmstat_open(struct inode *inode, struct file *file) | 110 | static int vmstat_open(struct inode *inode, struct file *file) |
170 | { | 111 | { |
171 | return seq_open(file, &vmstat_op); | 112 | return seq_open(file, &vmstat_op); |
@@ -591,7 +532,6 @@ void __init proc_misc_init(void) | |||
591 | proc_symlink("mounts", NULL, "self/mounts"); | 532 | proc_symlink("mounts", NULL, "self/mounts"); |
592 | 533 | ||
593 | /* And now for trickier ones */ | 534 | /* And now for trickier ones */ |
594 | proc_create("devices", 0, NULL, &proc_devinfo_operations); | ||
595 | proc_create("cpuinfo", 0, NULL, &proc_cpuinfo_operations); | 535 | proc_create("cpuinfo", 0, NULL, &proc_cpuinfo_operations); |
596 | #ifdef CONFIG_BLOCK | 536 | #ifdef CONFIG_BLOCK |
597 | proc_create("partitions", 0, NULL, &proc_partitions_operations); | 537 | proc_create("partitions", 0, NULL, &proc_partitions_operations); |