diff options
Diffstat (limited to 'arch/um/drivers/mconsole_kern.c')
-rw-r--r-- | arch/um/drivers/mconsole_kern.c | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 0f3c7d14a6e3..ebb265c07e4d 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -1,23 +1,25 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) | 2 | * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) |
3 | * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | 3 | * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
4 | * Licensed under the GPL | 4 | * Licensed under the GPL |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include "linux/console.h" | 7 | #include <linux/console.h> |
8 | #include "linux/ctype.h" | 8 | #include <linux/ctype.h> |
9 | #include "linux/interrupt.h" | 9 | #include <linux/interrupt.h> |
10 | #include "linux/list.h" | 10 | #include <linux/list.h> |
11 | #include "linux/mm.h" | 11 | #include <linux/mm.h> |
12 | #include "linux/module.h" | 12 | #include <linux/module.h> |
13 | #include "linux/notifier.h" | 13 | #include <linux/notifier.h> |
14 | #include "linux/reboot.h" | 14 | #include <linux/reboot.h> |
15 | #include "linux/proc_fs.h" | 15 | #include <linux/proc_fs.h> |
16 | #include "linux/slab.h" | 16 | #include <linux/slab.h> |
17 | #include "linux/syscalls.h" | 17 | #include <linux/syscalls.h> |
18 | #include "linux/utsname.h" | 18 | #include <linux/utsname.h> |
19 | #include "linux/workqueue.h" | 19 | #include <linux/workqueue.h> |
20 | #include "asm/uaccess.h" | 20 | #include <linux/mutex.h> |
21 | #include <asm/uaccess.h> | ||
22 | |||
21 | #include "init.h" | 23 | #include "init.h" |
22 | #include "irq_kern.h" | 24 | #include "irq_kern.h" |
23 | #include "irq_user.h" | 25 | #include "irq_user.h" |
@@ -305,7 +307,9 @@ void mconsole_stop(struct mc_request *req) | |||
305 | deactivate_fd(req->originating_fd, MCONSOLE_IRQ); | 307 | deactivate_fd(req->originating_fd, MCONSOLE_IRQ); |
306 | os_set_fd_block(req->originating_fd, 1); | 308 | os_set_fd_block(req->originating_fd, 1); |
307 | mconsole_reply(req, "stopped", 0, 0); | 309 | mconsole_reply(req, "stopped", 0, 0); |
308 | while (mconsole_get_request(req->originating_fd, req)) { | 310 | for (;;) { |
311 | if (!mconsole_get_request(req->originating_fd, req)) | ||
312 | continue; | ||
309 | if (req->cmd->handler == mconsole_go) | 313 | if (req->cmd->handler == mconsole_go) |
310 | break; | 314 | break; |
311 | if (req->cmd->handler == mconsole_stop) { | 315 | if (req->cmd->handler == mconsole_stop) { |
@@ -358,7 +362,7 @@ struct unplugged_pages { | |||
358 | void *pages[UNPLUGGED_PER_PAGE]; | 362 | void *pages[UNPLUGGED_PER_PAGE]; |
359 | }; | 363 | }; |
360 | 364 | ||
361 | static DECLARE_MUTEX(plug_mem_mutex); | 365 | static DEFINE_MUTEX(plug_mem_mutex); |
362 | static unsigned long long unplugged_pages_count = 0; | 366 | static unsigned long long unplugged_pages_count = 0; |
363 | static LIST_HEAD(unplugged_pages); | 367 | static LIST_HEAD(unplugged_pages); |
364 | static int unplug_index = UNPLUGGED_PER_PAGE; | 368 | static int unplug_index = UNPLUGGED_PER_PAGE; |
@@ -394,7 +398,7 @@ static int mem_config(char *str, char **error_out) | |||
394 | 398 | ||
395 | diff /= PAGE_SIZE; | 399 | diff /= PAGE_SIZE; |
396 | 400 | ||
397 | down(&plug_mem_mutex); | 401 | mutex_lock(&plug_mem_mutex); |
398 | for (i = 0; i < diff; i++) { | 402 | for (i = 0; i < diff; i++) { |
399 | struct unplugged_pages *unplugged; | 403 | struct unplugged_pages *unplugged; |
400 | void *addr; | 404 | void *addr; |
@@ -451,7 +455,7 @@ static int mem_config(char *str, char **error_out) | |||
451 | 455 | ||
452 | err = 0; | 456 | err = 0; |
453 | out_unlock: | 457 | out_unlock: |
454 | up(&plug_mem_mutex); | 458 | mutex_unlock(&plug_mem_mutex); |
455 | out: | 459 | out: |
456 | return err; | 460 | return err; |
457 | } | 461 | } |
@@ -741,7 +745,6 @@ void mconsole_stack(struct mc_request *req) | |||
741 | { | 745 | { |
742 | char *ptr = req->request.data; | 746 | char *ptr = req->request.data; |
743 | int pid_requested= -1; | 747 | int pid_requested= -1; |
744 | struct task_struct *from = NULL; | ||
745 | struct task_struct *to = NULL; | 748 | struct task_struct *to = NULL; |
746 | 749 | ||
747 | /* | 750 | /* |
@@ -763,9 +766,7 @@ void mconsole_stack(struct mc_request *req) | |||
763 | return; | 766 | return; |
764 | } | 767 | } |
765 | 768 | ||
766 | from = current; | 769 | to = find_task_by_pid_ns(pid_requested, &init_pid_ns); |
767 | |||
768 | to = find_task_by_pid(pid_requested); | ||
769 | if ((to == NULL) || (pid_requested == 0)) { | 770 | if ((to == NULL) || (pid_requested == 0)) { |
770 | mconsole_reply(req, "Couldn't find that pid", 1, 0); | 771 | mconsole_reply(req, "Couldn't find that pid", 1, 0); |
771 | return; | 772 | return; |
@@ -795,6 +796,8 @@ static int __init mconsole_init(void) | |||
795 | printk(KERN_ERR "Failed to initialize management console\n"); | 796 | printk(KERN_ERR "Failed to initialize management console\n"); |
796 | return 1; | 797 | return 1; |
797 | } | 798 | } |
799 | if (os_set_fd_block(sock, 0)) | ||
800 | goto out; | ||
798 | 801 | ||
799 | register_reboot_notifier(&reboot_notifier); | 802 | register_reboot_notifier(&reboot_notifier); |
800 | 803 | ||
@@ -803,7 +806,7 @@ static int __init mconsole_init(void) | |||
803 | "mconsole", (void *)sock); | 806 | "mconsole", (void *)sock); |
804 | if (err) { | 807 | if (err) { |
805 | printk(KERN_ERR "Failed to get IRQ for management console\n"); | 808 | printk(KERN_ERR "Failed to get IRQ for management console\n"); |
806 | return 1; | 809 | goto out; |
807 | } | 810 | } |
808 | 811 | ||
809 | if (notify_socket != NULL) { | 812 | if (notify_socket != NULL) { |
@@ -819,6 +822,10 @@ static int __init mconsole_init(void) | |||
819 | printk(KERN_INFO "mconsole (version %d) initialized on %s\n", | 822 | printk(KERN_INFO "mconsole (version %d) initialized on %s\n", |
820 | MCONSOLE_VERSION, mconsole_socket_name); | 823 | MCONSOLE_VERSION, mconsole_socket_name); |
821 | return 0; | 824 | return 0; |
825 | |||
826 | out: | ||
827 | os_close_file(sock); | ||
828 | return 1; | ||
822 | } | 829 | } |
823 | 830 | ||
824 | __initcall(mconsole_init); | 831 | __initcall(mconsole_init); |