Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

alpha: convert srm code to seq_file

Convert code away from ->read_proc/->write_proc interfaces. Switch to
proc_create()/proc_create_data() which make addition of proc entries
reliable wrt NULL ->proc_fops, NULL ->data and so on.

Problem with ->read_proc et al is described here commit
786d7e1612f0b0adb6046f19b906609e4fe8b1ba "Fix rmmod/read/write races in
/proc entries"

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alexey Dobriyan and committed by
Linus Torvalds
0ead0f84 4614a696

+34 -33
+34 -33
arch/alpha/kernel/srm_env.c
··· 33 33 #include <linux/module.h> 34 34 #include <linux/init.h> 35 35 #include <linux/proc_fs.h> 36 + #include <linux/seq_file.h> 36 37 #include <asm/console.h> 37 38 #include <asm/uaccess.h> 38 39 #include <asm/machvec.h> ··· 80 79 static srm_env_t srm_numbered_entries[256]; 81 80 82 81 83 - static int 84 - srm_env_read(char *page, char **start, off_t off, int count, int *eof, 85 - void *data) 82 + static int srm_env_proc_show(struct seq_file *m, void *v) 86 83 { 87 - int nbytes; 88 84 unsigned long ret; 89 85 srm_env_t *entry; 86 + char *page; 90 87 91 - if (off != 0) { 92 - *eof = 1; 93 - return 0; 94 - } 88 + entry = (srm_env_t *)m->private; 89 + page = (char *)__get_free_page(GFP_USER); 90 + if (!page) 91 + return -ENOMEM; 95 92 96 - entry = (srm_env_t *) data; 97 - ret = callback_getenv(entry->id, page, count); 93 + ret = callback_getenv(entry->id, page, PAGE_SIZE); 98 94 99 95 if ((ret >> 61) == 0) { 100 - nbytes = (int) ret; 101 - *eof = 1; 96 + seq_write(m, page, ret); 97 + ret = 0; 102 98 } else 103 - nbytes = -EFAULT; 104 - 105 - return nbytes; 99 + ret = -EFAULT; 100 + free_page((unsigned long)page); 101 + return ret; 106 102 } 107 103 108 - static int 109 - srm_env_write(struct file *file, const char __user *buffer, unsigned long count, 110 - void *data) 104 + static int srm_env_proc_open(struct inode *inode, struct file *file) 105 + { 106 + return single_open(file, srm_env_proc_show, PDE(inode)->data); 107 + } 108 + 109 + static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer, 110 + size_t count, loff_t *pos) 111 111 { 112 112 int res; 113 - srm_env_t *entry; 113 + srm_env_t *entry = PDE(file->f_path.dentry->d_inode)->data; 114 114 char *buf = (char *) __get_free_page(GFP_USER); 115 115 unsigned long ret1, ret2; 116 - 117 - entry = (srm_env_t *) data; 118 116 119 117 if (!buf) 120 118 return -ENOMEM; ··· 139 139 free_page((unsigned long)buf); 140 140 return res; 141 141 } 142 + 143 + static const struct file_operations srm_env_proc_fops = { 144 + .owner = THIS_MODULE, 145 + .open = srm_env_proc_open, 146 + .read = seq_read, 147 + .llseek = seq_lseek, 148 + .release = single_release, 149 + .write = srm_env_proc_write, 150 + }; 142 151 143 152 static void 144 153 srm_env_cleanup(void) ··· 254 245 */ 255 246 entry = srm_named_entries; 256 247 while (entry->name && entry->id) { 257 - entry->proc_entry = create_proc_entry(entry->name, 258 - 0644, named_dir); 248 + entry->proc_entry = proc_create_data(entry->name, 0644, named_dir, 249 + &srm_env_proc_fops, entry); 259 250 if (!entry->proc_entry) 260 251 goto cleanup; 261 - 262 - entry->proc_entry->data = (void *) entry; 263 - entry->proc_entry->read_proc = srm_env_read; 264 - entry->proc_entry->write_proc = srm_env_write; 265 - 266 252 entry++; 267 253 } 268 254 ··· 268 264 entry = &srm_numbered_entries[var_num]; 269 265 entry->name = number[var_num]; 270 266 271 - entry->proc_entry = create_proc_entry(entry->name, 272 - 0644, numbered_dir); 267 + entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir, 268 + &srm_env_proc_fops, entry); 273 269 if (!entry->proc_entry) 274 270 goto cleanup; 275 271 276 272 entry->id = var_num; 277 - entry->proc_entry->data = (void *) entry; 278 - entry->proc_entry->read_proc = srm_env_read; 279 - entry->proc_entry->write_proc = srm_env_write; 280 273 } 281 274 282 275 printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,