diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 02:55:20 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 02:55:20 -0500 |
| commit | 35858adbfca13678af99fb31618ef4428d6dedb0 (patch) | |
| tree | 3336feaa61324486945816cb52c347733e7c0821 /arch/um/kernel | |
| parent | 197d4db752e67160d79fed09968c2140376a80a3 (diff) | |
| parent | 4b70858ba8d4537daf782defebe5f2ff80ccef2b (diff) | |
Merge branch 'next' into for-linus
Diffstat (limited to 'arch/um/kernel')
| -rw-r--r-- | arch/um/kernel/exitcode.c | 43 | ||||
| -rw-r--r-- | arch/um/kernel/irq.c | 4 | ||||
| -rw-r--r-- | arch/um/kernel/process.c | 31 |
3 files changed, 46 insertions, 32 deletions
diff --git a/arch/um/kernel/exitcode.c b/arch/um/kernel/exitcode.c index 6540d2c9fbb7..829df49dee99 100644 --- a/arch/um/kernel/exitcode.c +++ b/arch/um/kernel/exitcode.c | |||
| @@ -6,7 +6,9 @@ | |||
| 6 | #include <linux/ctype.h> | 6 | #include <linux/ctype.h> |
| 7 | #include <linux/init.h> | 7 | #include <linux/init.h> |
| 8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
| 9 | #include <linux/module.h> | ||
| 9 | #include <linux/proc_fs.h> | 10 | #include <linux/proc_fs.h> |
| 11 | #include <linux/seq_file.h> | ||
| 10 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| 11 | #include <asm/uaccess.h> | 13 | #include <asm/uaccess.h> |
| 12 | 14 | ||
| @@ -16,30 +18,26 @@ | |||
| 16 | */ | 18 | */ |
| 17 | int uml_exitcode = 0; | 19 | int uml_exitcode = 0; |
| 18 | 20 | ||
| 19 | static int read_proc_exitcode(char *page, char **start, off_t off, | 21 | static int exitcode_proc_show(struct seq_file *m, void *v) |
| 20 | int count, int *eof, void *data) | ||
| 21 | { | 22 | { |
| 22 | int len, val; | 23 | int val; |
| 23 | 24 | ||
| 24 | /* | 25 | /* |
| 25 | * Save uml_exitcode in a local so that we don't need to guarantee | 26 | * Save uml_exitcode in a local so that we don't need to guarantee |
| 26 | * that sprintf accesses it atomically. | 27 | * that sprintf accesses it atomically. |
| 27 | */ | 28 | */ |
| 28 | val = uml_exitcode; | 29 | val = uml_exitcode; |
| 29 | len = sprintf(page, "%d\n", val); | 30 | seq_printf(m, "%d\n", val); |
| 30 | len -= off; | 31 | return 0; |
| 31 | if (len <= off+count) | 32 | } |
| 32 | *eof = 1; | 33 | |
| 33 | *start = page + off; | 34 | static int exitcode_proc_open(struct inode *inode, struct file *file) |
| 34 | if (len > count) | 35 | { |
| 35 | len = count; | 36 | return single_open(file, exitcode_proc_show, NULL); |
| 36 | if (len < 0) | ||
| 37 | len = 0; | ||
| 38 | return len; | ||
| 39 | } | 37 | } |
| 40 | 38 | ||
| 41 | static int write_proc_exitcode(struct file *file, const char __user *buffer, | 39 | static ssize_t exitcode_proc_write(struct file *file, |
| 42 | unsigned long count, void *data) | 40 | const char __user *buffer, size_t count, loff_t *pos) |
| 43 | { | 41 | { |
| 44 | char *end, buf[sizeof("nnnnn\0")]; | 42 | char *end, buf[sizeof("nnnnn\0")]; |
| 45 | int tmp; | 43 | int tmp; |
| @@ -55,20 +53,25 @@ static int write_proc_exitcode(struct file *file, const char __user *buffer, | |||
| 55 | return count; | 53 | return count; |
| 56 | } | 54 | } |
| 57 | 55 | ||
| 56 | static const struct file_operations exitcode_proc_fops = { | ||
| 57 | .owner = THIS_MODULE, | ||
| 58 | .open = exitcode_proc_open, | ||
| 59 | .read = seq_read, | ||
| 60 | .llseek = seq_lseek, | ||
| 61 | .release = single_release, | ||
| 62 | .write = exitcode_proc_write, | ||
| 63 | }; | ||
| 64 | |||
| 58 | static int make_proc_exitcode(void) | 65 | static int make_proc_exitcode(void) |
| 59 | { | 66 | { |
| 60 | struct proc_dir_entry *ent; | 67 | struct proc_dir_entry *ent; |
| 61 | 68 | ||
| 62 | ent = create_proc_entry("exitcode", 0600, NULL); | 69 | ent = proc_create("exitcode", 0600, NULL, &exitcode_proc_fops); |
| 63 | if (ent == NULL) { | 70 | if (ent == NULL) { |
| 64 | printk(KERN_WARNING "make_proc_exitcode : Failed to register " | 71 | printk(KERN_WARNING "make_proc_exitcode : Failed to register " |
| 65 | "/proc/exitcode\n"); | 72 | "/proc/exitcode\n"); |
| 66 | return 0; | 73 | return 0; |
| 67 | } | 74 | } |
| 68 | |||
| 69 | ent->read_proc = read_proc_exitcode; | ||
| 70 | ent->write_proc = write_proc_exitcode; | ||
| 71 | |||
| 72 | return 0; | 75 | return 0; |
| 73 | } | 76 | } |
| 74 | 77 | ||
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 039270b9b73b..89474ba0741e 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
| @@ -34,7 +34,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | if (i < NR_IRQS) { | 36 | if (i < NR_IRQS) { |
| 37 | spin_lock_irqsave(&irq_desc[i].lock, flags); | 37 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); |
| 38 | action = irq_desc[i].action; | 38 | action = irq_desc[i].action; |
| 39 | if (!action) | 39 | if (!action) |
| 40 | goto skip; | 40 | goto skip; |
| @@ -53,7 +53,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
| 53 | 53 | ||
| 54 | seq_putc(p, '\n'); | 54 | seq_putc(p, '\n'); |
| 55 | skip: | 55 | skip: |
| 56 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 56 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
| 57 | } else if (i == NR_IRQS) | 57 | } else if (i == NR_IRQS) |
| 58 | seq_putc(p, '\n'); | 58 | seq_putc(p, '\n'); |
| 59 | 59 | ||
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 4a28a1568d85..2f910a1b7454 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
| @@ -9,11 +9,13 @@ | |||
| 9 | #include <linux/hardirq.h> | 9 | #include <linux/hardirq.h> |
| 10 | #include <linux/gfp.h> | 10 | #include <linux/gfp.h> |
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| 12 | #include <linux/module.h> | ||
| 12 | #include <linux/personality.h> | 13 | #include <linux/personality.h> |
| 13 | #include <linux/proc_fs.h> | 14 | #include <linux/proc_fs.h> |
| 14 | #include <linux/ptrace.h> | 15 | #include <linux/ptrace.h> |
| 15 | #include <linux/random.h> | 16 | #include <linux/random.h> |
| 16 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
| 18 | #include <linux/seq_file.h> | ||
| 17 | #include <linux/tick.h> | 19 | #include <linux/tick.h> |
| 18 | #include <linux/threads.h> | 20 | #include <linux/threads.h> |
| 19 | #include <asm/current.h> | 21 | #include <asm/current.h> |
| @@ -336,16 +338,19 @@ int get_using_sysemu(void) | |||
| 336 | return atomic_read(&using_sysemu); | 338 | return atomic_read(&using_sysemu); |
| 337 | } | 339 | } |
| 338 | 340 | ||
| 339 | static int proc_read_sysemu(char *buf, char **start, off_t offset, int size,int *eof, void *data) | 341 | static int sysemu_proc_show(struct seq_file *m, void *v) |
| 340 | { | 342 | { |
| 341 | if (snprintf(buf, size, "%d\n", get_using_sysemu()) < size) | 343 | seq_printf(m, "%d\n", get_using_sysemu()); |
| 342 | /* No overflow */ | 344 | return 0; |
| 343 | *eof = 1; | 345 | } |
| 344 | 346 | ||
| 345 | return strlen(buf); | 347 | static int sysemu_proc_open(struct inode *inode, struct file *file) |
| 348 | { | ||
| 349 | return single_open(file, sysemu_proc_show, NULL); | ||
| 346 | } | 350 | } |
| 347 | 351 | ||
| 348 | static int proc_write_sysemu(struct file *file,const char __user *buf, unsigned long count,void *data) | 352 | static ssize_t sysemu_proc_write(struct file *file, const char __user *buf, |
| 353 | size_t count, loff_t *pos) | ||
| 349 | { | 354 | { |
| 350 | char tmp[2]; | 355 | char tmp[2]; |
| 351 | 356 | ||
| @@ -358,13 +363,22 @@ static int proc_write_sysemu(struct file *file,const char __user *buf, unsigned | |||
| 358 | return count; | 363 | return count; |
| 359 | } | 364 | } |
| 360 | 365 | ||
| 366 | static const struct file_operations sysemu_proc_fops = { | ||
| 367 | .owner = THIS_MODULE, | ||
| 368 | .open = sysemu_proc_open, | ||
| 369 | .read = seq_read, | ||
| 370 | .llseek = seq_lseek, | ||
| 371 | .release = single_release, | ||
| 372 | .write = sysemu_proc_write, | ||
| 373 | }; | ||
| 374 | |||
| 361 | int __init make_proc_sysemu(void) | 375 | int __init make_proc_sysemu(void) |
| 362 | { | 376 | { |
| 363 | struct proc_dir_entry *ent; | 377 | struct proc_dir_entry *ent; |
| 364 | if (!sysemu_supported) | 378 | if (!sysemu_supported) |
| 365 | return 0; | 379 | return 0; |
| 366 | 380 | ||
| 367 | ent = create_proc_entry("sysemu", 0600, NULL); | 381 | ent = proc_create("sysemu", 0600, NULL, &sysemu_proc_fops); |
| 368 | 382 | ||
| 369 | if (ent == NULL) | 383 | if (ent == NULL) |
| 370 | { | 384 | { |
| @@ -372,9 +386,6 @@ int __init make_proc_sysemu(void) | |||
| 372 | return 0; | 386 | return 0; |
| 373 | } | 387 | } |
| 374 | 388 | ||
| 375 | ent->read_proc = proc_read_sysemu; | ||
| 376 | ent->write_proc = proc_write_sysemu; | ||
| 377 | |||
| 378 | return 0; | 389 | return 0; |
| 379 | } | 390 | } |
| 380 | 391 | ||
