aboutsummaryrefslogtreecommitdiffstats
path: root/arch/alpha/kernel/srm_env.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /arch/alpha/kernel/srm_env.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c66
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[] = {
79static srm_env_t srm_numbered_entries[256]; 81static srm_env_t srm_numbered_entries[256];
80 82
81 83
82static int 84static int srm_env_proc_show(struct seq_file *m, void *v)
83srm_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; 106static 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
107static int 111static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
108srm_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
144static 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
143static void 153static void
144srm_env_cleanup(void) 154srm_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,