diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /arch/alpha/kernel/srm_env.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'arch/alpha/kernel/srm_env.c')
-rw-r--r-- | arch/alpha/kernel/srm_env.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index d12af472e1c0..4afc1a1e2e5a 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c | |||
@@ -30,9 +30,11 @@ | |||
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
33 | #include <linux/gfp.h> | ||
33 | #include <linux/module.h> | 34 | #include <linux/module.h> |
34 | #include <linux/init.h> | 35 | #include <linux/init.h> |
35 | #include <linux/proc_fs.h> | 36 | #include <linux/proc_fs.h> |
37 | #include <linux/seq_file.h> | ||
36 | #include <asm/console.h> | 38 | #include <asm/console.h> |
37 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
38 | #include <asm/machvec.h> | 40 | #include <asm/machvec.h> |
@@ -79,42 +81,41 @@ static srm_env_t srm_named_entries[] = { | |||
79 | static srm_env_t srm_numbered_entries[256]; | 81 | static srm_env_t srm_numbered_entries[256]; |
80 | 82 | ||
81 | 83 | ||
82 | static int | 84 | static int srm_env_proc_show(struct seq_file *m, void *v) |
83 | srm_env_read(char *page, char **start, off_t off, int count, int *eof, | ||
84 | void *data) | ||
85 | { | 85 | { |
86 | int nbytes; | ||
87 | unsigned long ret; | 86 | unsigned long ret; |
88 | srm_env_t *entry; | 87 | srm_env_t *entry; |
88 | char *page; | ||
89 | 89 | ||
90 | if (off != 0) { | 90 | entry = (srm_env_t *)m->private; |
91 | *eof = 1; | 91 | page = (char *)__get_free_page(GFP_USER); |
92 | return 0; | 92 | if (!page) |
93 | } | 93 | return -ENOMEM; |
94 | 94 | ||
95 | entry = (srm_env_t *) data; | 95 | ret = callback_getenv(entry->id, page, PAGE_SIZE); |
96 | ret = callback_getenv(entry->id, page, count); | ||
97 | 96 | ||
98 | if ((ret >> 61) == 0) { | 97 | if ((ret >> 61) == 0) { |
99 | nbytes = (int) ret; | 98 | seq_write(m, page, ret); |
100 | *eof = 1; | 99 | ret = 0; |
101 | } else | 100 | } else |
102 | nbytes = -EFAULT; | 101 | ret = -EFAULT; |
102 | free_page((unsigned long)page); | ||
103 | return ret; | ||
104 | } | ||
103 | 105 | ||
104 | return nbytes; | 106 | static int srm_env_proc_open(struct inode *inode, struct file *file) |
107 | { | ||
108 | return single_open(file, srm_env_proc_show, PDE(inode)->data); | ||
105 | } | 109 | } |
106 | 110 | ||
107 | static int | 111 | static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer, |
108 | srm_env_write(struct file *file, const char __user *buffer, unsigned long count, | 112 | size_t count, loff_t *pos) |
109 | void *data) | ||
110 | { | 113 | { |
111 | int res; | 114 | int res; |
112 | srm_env_t *entry; | 115 | srm_env_t *entry = PDE(file->f_path.dentry->d_inode)->data; |
113 | char *buf = (char *) __get_free_page(GFP_USER); | 116 | char *buf = (char *) __get_free_page(GFP_USER); |
114 | unsigned long ret1, ret2; | 117 | unsigned long ret1, ret2; |
115 | 118 | ||
116 | entry = (srm_env_t *) data; | ||
117 | |||
118 | if (!buf) | 119 | if (!buf) |
119 | return -ENOMEM; | 120 | return -ENOMEM; |
120 | 121 | ||
@@ -140,6 +141,15 @@ srm_env_write(struct file *file, const char __user *buffer, unsigned long count, | |||
140 | return res; | 141 | return res; |
141 | } | 142 | } |
142 | 143 | ||
144 | static const struct file_operations srm_env_proc_fops = { | ||
145 | .owner = THIS_MODULE, | ||
146 | .open = srm_env_proc_open, | ||
147 | .read = seq_read, | ||
148 | .llseek = seq_lseek, | ||
149 | .release = single_release, | ||
150 | .write = srm_env_proc_write, | ||
151 | }; | ||
152 | |||
143 | static void | 153 | static void |
144 | srm_env_cleanup(void) | 154 | srm_env_cleanup(void) |
145 | { | 155 | { |
@@ -245,15 +255,10 @@ srm_env_init(void) | |||
245 | */ | 255 | */ |
246 | entry = srm_named_entries; | 256 | entry = srm_named_entries; |
247 | while (entry->name && entry->id) { | 257 | while (entry->name && entry->id) { |
248 | entry->proc_entry = create_proc_entry(entry->name, | 258 | entry->proc_entry = proc_create_data(entry->name, 0644, named_dir, |
249 | 0644, named_dir); | 259 | &srm_env_proc_fops, entry); |
250 | if (!entry->proc_entry) | 260 | if (!entry->proc_entry) |
251 | goto cleanup; | 261 | goto cleanup; |
252 | |||
253 | entry->proc_entry->data = (void *) entry; | ||
254 | entry->proc_entry->read_proc = srm_env_read; | ||
255 | entry->proc_entry->write_proc = srm_env_write; | ||
256 | |||
257 | entry++; | 262 | entry++; |
258 | } | 263 | } |
259 | 264 | ||
@@ -264,15 +269,12 @@ srm_env_init(void) | |||
264 | entry = &srm_numbered_entries[var_num]; | 269 | entry = &srm_numbered_entries[var_num]; |
265 | entry->name = number[var_num]; | 270 | entry->name = number[var_num]; |
266 | 271 | ||
267 | entry->proc_entry = create_proc_entry(entry->name, | 272 | entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir, |
268 | 0644, numbered_dir); | 273 | &srm_env_proc_fops, entry); |
269 | if (!entry->proc_entry) | 274 | if (!entry->proc_entry) |
270 | goto cleanup; | 275 | goto cleanup; |
271 | 276 | ||
272 | entry->id = var_num; | 277 | entry->id = var_num; |
273 | entry->proc_entry->data = (void *) entry; | ||
274 | entry->proc_entry->read_proc = srm_env_read; | ||
275 | entry->proc_entry->write_proc = srm_env_write; | ||
276 | } | 278 | } |
277 | 279 | ||
278 | printk(KERN_INFO "%s: version %s loaded successfully\n", NAME, | 280 | printk(KERN_INFO "%s: version %s loaded successfully\n", NAME, |