diff options
Diffstat (limited to 'arch/um/drivers/harddog_kern.c')
-rw-r--r-- | arch/um/drivers/harddog_kern.c | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/arch/um/drivers/harddog_kern.c b/arch/um/drivers/harddog_kern.c index 64ff22aa077b..55601687b3bc 100644 --- a/arch/um/drivers/harddog_kern.c +++ b/arch/um/drivers/harddog_kern.c | |||
@@ -9,10 +9,10 @@ | |||
9 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
10 | * as published by the Free Software Foundation; either version | 10 | * as published by the Free Software Foundation; either version |
11 | * 2 of the License, or (at your option) any later version. | 11 | * 2 of the License, or (at your option) any later version. |
12 | * | 12 | * |
13 | * Neither Alan Cox nor CymruNet Ltd. admit liability nor provide | 13 | * Neither Alan Cox nor CymruNet Ltd. admit liability nor provide |
14 | * warranty for any of this software. This material is provided | 14 | * warranty for any of this software. This material is provided |
15 | * "AS-IS" and at no charge. | 15 | * "AS-IS" and at no charge. |
16 | * | 16 | * |
17 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> | 17 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
18 | * | 18 | * |
@@ -29,11 +29,11 @@ | |||
29 | * Made SMP safe for 2.3.x | 29 | * Made SMP safe for 2.3.x |
30 | * | 30 | * |
31 | * 20011127 Joel Becker (jlbec@evilplan.org> | 31 | * 20011127 Joel Becker (jlbec@evilplan.org> |
32 | * Added soft_noboot; Allows testing the softdog trigger without | 32 | * Added soft_noboot; Allows testing the softdog trigger without |
33 | * requiring a recompile. | 33 | * requiring a recompile. |
34 | * Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT. | 34 | * Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include <linux/module.h> | 37 | #include <linux/module.h> |
38 | #include <linux/types.h> | 38 | #include <linux/types.h> |
39 | #include <linux/kernel.h> | 39 | #include <linux/kernel.h> |
@@ -44,12 +44,13 @@ | |||
44 | #include <linux/reboot.h> | 44 | #include <linux/reboot.h> |
45 | #include <linux/smp_lock.h> | 45 | #include <linux/smp_lock.h> |
46 | #include <linux/init.h> | 46 | #include <linux/init.h> |
47 | #include <linux/spinlock.h> | ||
47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
48 | #include "mconsole.h" | 49 | #include "mconsole.h" |
49 | 50 | ||
50 | MODULE_LICENSE("GPL"); | 51 | MODULE_LICENSE("GPL"); |
51 | 52 | ||
52 | /* Locked by the BKL in harddog_open and harddog_release */ | 53 | static DEFINE_SPINLOCK(lock); |
53 | static int timer_alive; | 54 | static int timer_alive; |
54 | static int harddog_in_fd = -1; | 55 | static int harddog_in_fd = -1; |
55 | static int harddog_out_fd = -1; | 56 | static int harddog_out_fd = -1; |
@@ -57,18 +58,18 @@ static int harddog_out_fd = -1; | |||
57 | /* | 58 | /* |
58 | * Allow only one person to hold it open | 59 | * Allow only one person to hold it open |
59 | */ | 60 | */ |
60 | 61 | ||
61 | extern int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock); | 62 | extern int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock); |
62 | 63 | ||
63 | static int harddog_open(struct inode *inode, struct file *file) | 64 | static int harddog_open(struct inode *inode, struct file *file) |
64 | { | 65 | { |
65 | int err; | 66 | int err = -EBUSY; |
66 | char *sock = NULL; | 67 | char *sock = NULL; |
67 | 68 | ||
68 | lock_kernel(); | 69 | spin_lock(&lock); |
69 | if(timer_alive) | 70 | if(timer_alive) |
70 | return -EBUSY; | 71 | goto err; |
71 | #ifdef CONFIG_HARDDOG_NOWAYOUT | 72 | #ifdef CONFIG_HARDDOG_NOWAYOUT |
72 | __module_get(THIS_MODULE); | 73 | __module_get(THIS_MODULE); |
73 | #endif | 74 | #endif |
74 | 75 | ||
@@ -76,11 +77,15 @@ static int harddog_open(struct inode *inode, struct file *file) | |||
76 | sock = mconsole_notify_socket(); | 77 | sock = mconsole_notify_socket(); |
77 | #endif | 78 | #endif |
78 | err = start_watchdog(&harddog_in_fd, &harddog_out_fd, sock); | 79 | err = start_watchdog(&harddog_in_fd, &harddog_out_fd, sock); |
79 | if(err) return(err); | 80 | if(err) |
81 | goto err; | ||
80 | 82 | ||
81 | timer_alive = 1; | 83 | timer_alive = 1; |
82 | unlock_kernel(); | 84 | spin_unlock(&lock); |
83 | return nonseekable_open(inode, file); | 85 | return nonseekable_open(inode, file); |
86 | err: | ||
87 | spin_unlock(&lock); | ||
88 | return err; | ||
84 | } | 89 | } |
85 | 90 | ||
86 | extern void stop_watchdog(int in_fd, int out_fd); | 91 | extern void stop_watchdog(int in_fd, int out_fd); |
@@ -90,14 +95,16 @@ static int harddog_release(struct inode *inode, struct file *file) | |||
90 | /* | 95 | /* |
91 | * Shut off the timer. | 96 | * Shut off the timer. |
92 | */ | 97 | */ |
93 | lock_kernel(); | 98 | |
99 | spin_lock(&lock); | ||
94 | 100 | ||
95 | stop_watchdog(harddog_in_fd, harddog_out_fd); | 101 | stop_watchdog(harddog_in_fd, harddog_out_fd); |
96 | harddog_in_fd = -1; | 102 | harddog_in_fd = -1; |
97 | harddog_out_fd = -1; | 103 | harddog_out_fd = -1; |
98 | 104 | ||
99 | timer_alive=0; | 105 | timer_alive=0; |
100 | unlock_kernel(); | 106 | spin_unlock(&lock); |
107 | |||
101 | return 0; | 108 | return 0; |
102 | } | 109 | } |
103 | 110 | ||
@@ -110,7 +117,7 @@ static ssize_t harddog_write(struct file *file, const char __user *data, size_t | |||
110 | * Refresh the timer. | 117 | * Refresh the timer. |
111 | */ | 118 | */ |
112 | if(len) | 119 | if(len) |
113 | return(ping_watchdog(harddog_out_fd)); | 120 | return ping_watchdog(harddog_out_fd); |
114 | return 0; | 121 | return 0; |
115 | } | 122 | } |
116 | 123 | ||
@@ -134,11 +141,11 @@ static int harddog_ioctl(struct inode *inode, struct file *file, | |||
134 | case WDIOC_GETBOOTSTATUS: | 141 | case WDIOC_GETBOOTSTATUS: |
135 | return put_user(0,(int __user *)argp); | 142 | return put_user(0,(int __user *)argp); |
136 | case WDIOC_KEEPALIVE: | 143 | case WDIOC_KEEPALIVE: |
137 | return(ping_watchdog(harddog_out_fd)); | 144 | return ping_watchdog(harddog_out_fd); |
138 | } | 145 | } |
139 | } | 146 | } |
140 | 147 | ||
141 | static struct file_operations harddog_fops = { | 148 | static const struct file_operations harddog_fops = { |
142 | .owner = THIS_MODULE, | 149 | .owner = THIS_MODULE, |
143 | .write = harddog_write, | 150 | .write = harddog_write, |
144 | .ioctl = harddog_ioctl, | 151 | .ioctl = harddog_ioctl, |
@@ -165,7 +172,7 @@ static int __init harddog_init(void) | |||
165 | 172 | ||
166 | printk(banner); | 173 | printk(banner); |
167 | 174 | ||
168 | return(0); | 175 | return 0; |
169 | } | 176 | } |
170 | 177 | ||
171 | static void __exit harddog_exit(void) | 178 | static void __exit harddog_exit(void) |
@@ -175,14 +182,3 @@ static void __exit harddog_exit(void) | |||
175 | 182 | ||
176 | module_init(harddog_init); | 183 | module_init(harddog_init); |
177 | module_exit(harddog_exit); | 184 | module_exit(harddog_exit); |
178 | |||
179 | /* | ||
180 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
181 | * Emacs will notice this stuff at the end of the file and automatically | ||
182 | * adjust the settings for this buffer only. This must remain at the end | ||
183 | * of the file. | ||
184 | * --------------------------------------------------------------------------- | ||
185 | * Local variables: | ||
186 | * c-file-style: "linux" | ||
187 | * End: | ||
188 | */ | ||