ipq806x: set v4.9 as default
[openwrt/openwrt.git] / target / linux / ipq806x / patches-4.4 / 009-6-watchdog-Separate-and-maintain-variables-based-on-variable-lifetime.patch
1 From b4ffb1909843b28f3b1b60197d517b123b7a9b66 Mon Sep 17 00:00:00 2001
2 From: Guenter Roeck <linux@roeck-us.net>
3 Date: Fri, 25 Dec 2015 16:01:42 -0800
4 Subject: watchdog: Separate and maintain variables based on variable lifetime
5
6 All variables required by the watchdog core to manage a watchdog are
7 currently stored in struct watchdog_device. The lifetime of those
8 variables is determined by the watchdog driver. However, the lifetime
9 of variables used by the watchdog core differs from the lifetime of
10 struct watchdog_device. To remedy this situation, watchdog drivers
11 can implement ref and unref callbacks, to be used by the watchdog
12 core to lock struct watchdog_device in memory.
13
14 While this solves the immediate problem, it depends on watchdog drivers
15 to actually implement the ref/unref callbacks. This is error prone,
16 often not implemented in the first place, or not implemented correctly.
17
18 To solve the problem without requiring driver support, split the variables
19 in struct watchdog_device into two data structures - one for variables
20 associated with the watchdog driver, one for variables associated with
21 the watchdog core. With this approach, the watchdog core can keep track
22 of its variable lifetime and no longer depends on ref/unref callbacks
23 in the driver. As a side effect, some of the variables originally in
24 struct watchdog_driver are now private to the watchdog core and no longer
25 visible in watchdog drivers.
26
27 As a side effect of the changes made, an ioctl will now always fail
28 with -ENODEV after a watchdog device was unregistered with the character
29 device still open. Previously, it would only fail with -ENODEV in some
30 situations. Also, ioctl operations are now atomic from driver perspective.
31 With this change, it is now guaranteed that the driver will not unregister
32 a watchdog between a timeout change and the subsequent ping.
33
34 The 'ref' and 'unref' callbacks in struct watchdog_driver are no longer
35 used and marked as deprecated.
36
37 Signed-off-by: Guenter Roeck <linux@roeck-us.net>
38 Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
39 ---
40 Documentation/watchdog/watchdog-kernel-api.txt | 45 +--
41 drivers/watchdog/watchdog_core.c | 2 -
42 drivers/watchdog/watchdog_dev.c | 383 +++++++++++++------------
43 include/linux/watchdog.h | 22 +-
44 4 files changed, 218 insertions(+), 234 deletions(-)
45
46 --- a/Documentation/watchdog/watchdog-kernel-api.txt
47 +++ b/Documentation/watchdog/watchdog-kernel-api.txt
48 @@ -44,7 +44,6 @@ The watchdog device structure looks like
49
50 struct watchdog_device {
51 int id;
52 - struct cdev cdev;
53 struct device *dev;
54 struct device *parent;
55 const struct watchdog_info *info;
56 @@ -56,7 +55,7 @@ struct watchdog_device {
57 struct notifier_block reboot_nb;
58 struct notifier_block restart_nb;
59 void *driver_data;
60 - struct mutex lock;
61 + struct watchdog_core_data *wd_data;
62 unsigned long status;
63 struct list_head deferred;
64 };
65 @@ -66,8 +65,6 @@ It contains following fields:
66 /dev/watchdog0 cdev (dynamic major, minor 0) as well as the old
67 /dev/watchdog miscdev. The id is set automatically when calling
68 watchdog_register_device.
69 -* cdev: cdev for the dynamic /dev/watchdog<id> device nodes. This
70 - field is also populated by watchdog_register_device.
71 * dev: device under the watchdog class (created by watchdog_register_device).
72 * parent: set this to the parent device (or NULL) before calling
73 watchdog_register_device.
74 @@ -89,11 +86,10 @@ It contains following fields:
75 * driver_data: a pointer to the drivers private data of a watchdog device.
76 This data should only be accessed via the watchdog_set_drvdata and
77 watchdog_get_drvdata routines.
78 -* lock: Mutex for WatchDog Timer Driver Core internal use only.
79 +* wd_data: a pointer to watchdog core internal data.
80 * status: this field contains a number of status bits that give extra
81 information about the status of the device (Like: is the watchdog timer
82 - running/active, is the nowayout bit set, is the device opened via
83 - the /dev/watchdog interface or not, ...).
84 + running/active, or is the nowayout bit set).
85 * deferred: entry in wtd_deferred_reg_list which is used to
86 register early initialized watchdogs.
87
88 @@ -110,8 +106,8 @@ struct watchdog_ops {
89 int (*set_timeout)(struct watchdog_device *, unsigned int);
90 unsigned int (*get_timeleft)(struct watchdog_device *);
91 int (*restart)(struct watchdog_device *);
92 - void (*ref)(struct watchdog_device *);
93 - void (*unref)(struct watchdog_device *);
94 + void (*ref)(struct watchdog_device *) __deprecated;
95 + void (*unref)(struct watchdog_device *) __deprecated;
96 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
97 };
98
99 @@ -120,20 +116,6 @@ driver's operations. This module owner w
100 the watchdog is active. (This to avoid a system crash when you unload the
101 module and /dev/watchdog is still open).
102
103 -If the watchdog_device struct is dynamically allocated, just locking the module
104 -is not enough and a driver also needs to define the ref and unref operations to
105 -ensure the structure holding the watchdog_device does not go away.
106 -
107 -The simplest (and usually sufficient) implementation of this is to:
108 -1) Add a kref struct to the same structure which is holding the watchdog_device
109 -2) Define a release callback for the kref which frees the struct holding both
110 -3) Call kref_init on this kref *before* calling watchdog_register_device()
111 -4) Define a ref operation calling kref_get on this kref
112 -5) Define a unref operation calling kref_put on this kref
113 -6) When it is time to cleanup:
114 - * Do not kfree() the struct holding both, the last kref_put will do this!
115 - * *After* calling watchdog_unregister_device() call kref_put on the kref
116 -
117 Some operations are mandatory and some are optional. The mandatory operations
118 are:
119 * start: this is a pointer to the routine that starts the watchdog timer
120 @@ -176,34 +158,21 @@ they are supported. These optional routi
121 * get_timeleft: this routines returns the time that's left before a reset.
122 * restart: this routine restarts the machine. It returns 0 on success or a
123 negative errno code for failure.
124 -* ref: the operation that calls kref_get on the kref of a dynamically
125 - allocated watchdog_device struct.
126 -* unref: the operation that calls kref_put on the kref of a dynamically
127 - allocated watchdog_device struct.
128 * ioctl: if this routine is present then it will be called first before we do
129 our own internal ioctl call handling. This routine should return -ENOIOCTLCMD
130 if a command is not supported. The parameters that are passed to the ioctl
131 call are: watchdog_device, cmd and arg.
132
133 +The 'ref' and 'unref' operations are no longer used and deprecated.
134 +
135 The status bits should (preferably) be set with the set_bit and clear_bit alike
136 bit-operations. The status bits that are defined are:
137 * WDOG_ACTIVE: this status bit indicates whether or not a watchdog timer device
138 is active or not. When the watchdog is active after booting, then you should
139 set this status bit (Note: when you register the watchdog timer device with
140 this bit set, then opening /dev/watchdog will skip the start operation)
141 -* WDOG_DEV_OPEN: this status bit shows whether or not the watchdog device
142 - was opened via /dev/watchdog.
143 - (This bit should only be used by the WatchDog Timer Driver Core).
144 -* WDOG_ALLOW_RELEASE: this bit stores whether or not the magic close character
145 - has been sent (so that we can support the magic close feature).
146 - (This bit should only be used by the WatchDog Timer Driver Core).
147 * WDOG_NO_WAY_OUT: this bit stores the nowayout setting for the watchdog.
148 If this bit is set then the watchdog timer will not be able to stop.
149 -* WDOG_UNREGISTERED: this bit gets set by the WatchDog Timer Driver Core
150 - after calling watchdog_unregister_device, and then checked before calling
151 - any watchdog_ops, so that you can be sure that no operations (other then
152 - unref) will get called after unregister, even if userspace still holds a
153 - reference to /dev/watchdog
154
155 To set the WDOG_NO_WAY_OUT status bit (before registering your watchdog
156 timer device) you can either:
157 --- a/drivers/watchdog/watchdog_core.c
158 +++ b/drivers/watchdog/watchdog_core.c
159 @@ -210,8 +210,6 @@ static int __watchdog_register_device(st
160 * corrupted in a later stage then we expect a kernel panic!
161 */
162
163 - mutex_init(&wdd->lock);
164 -
165 /* Use alias for watchdog id if possible */
166 if (wdd->parent) {
167 ret = of_alias_get_id(wdd->parent->of_node, "watchdog");
168 --- a/drivers/watchdog/watchdog_dev.c
169 +++ b/drivers/watchdog/watchdog_dev.c
170 @@ -32,27 +32,51 @@
171
172 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
173
174 -#include <linux/module.h> /* For module stuff/... */
175 -#include <linux/types.h> /* For standard types (like size_t) */
176 +#include <linux/cdev.h> /* For character device */
177 #include <linux/errno.h> /* For the -ENODEV/... values */
178 -#include <linux/kernel.h> /* For printk/panic/... */
179 #include <linux/fs.h> /* For file operations */
180 -#include <linux/watchdog.h> /* For watchdog specific items */
181 -#include <linux/miscdevice.h> /* For handling misc devices */
182 #include <linux/init.h> /* For __init/__exit/... */
183 +#include <linux/kernel.h> /* For printk/panic/... */
184 +#include <linux/kref.h> /* For data references */
185 +#include <linux/miscdevice.h> /* For handling misc devices */
186 +#include <linux/module.h> /* For module stuff/... */
187 +#include <linux/mutex.h> /* For mutexes */
188 +#include <linux/slab.h> /* For memory functions */
189 +#include <linux/types.h> /* For standard types (like size_t) */
190 +#include <linux/watchdog.h> /* For watchdog specific items */
191 #include <linux/uaccess.h> /* For copy_to_user/put_user/... */
192
193 #include "watchdog_core.h"
194
195 +/*
196 + * struct watchdog_core_data - watchdog core internal data
197 + * @kref: Reference count.
198 + * @cdev: The watchdog's Character device.
199 + * @wdd: Pointer to watchdog device.
200 + * @lock: Lock for watchdog core.
201 + * @status: Watchdog core internal status bits.
202 + */
203 +struct watchdog_core_data {
204 + struct kref kref;
205 + struct cdev cdev;
206 + struct watchdog_device *wdd;
207 + struct mutex lock;
208 + unsigned long status; /* Internal status bits */
209 +#define _WDOG_DEV_OPEN 0 /* Opened ? */
210 +#define _WDOG_ALLOW_RELEASE 1 /* Did we receive the magic char ? */
211 +};
212 +
213 /* the dev_t structure to store the dynamically allocated watchdog devices */
214 static dev_t watchdog_devt;
215 -/* the watchdog device behind /dev/watchdog */
216 -static struct watchdog_device *old_wdd;
217 +/* Reference to watchdog device behind /dev/watchdog */
218 +static struct watchdog_core_data *old_wd_data;
219
220 /*
221 * watchdog_ping: ping the watchdog.
222 * @wdd: the watchdog device to ping
223 *
224 + * The caller must hold wd_data->lock.
225 + *
226 * If the watchdog has no own ping operation then it needs to be
227 * restarted via the start operation. This wrapper function does
228 * exactly that.
229 @@ -61,25 +85,16 @@ static struct watchdog_device *old_wdd;
230
231 static int watchdog_ping(struct watchdog_device *wdd)
232 {
233 - int err = 0;
234 -
235 - mutex_lock(&wdd->lock);
236 -
237 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
238 - err = -ENODEV;
239 - goto out_ping;
240 - }
241 + int err;
242
243 if (!watchdog_active(wdd))
244 - goto out_ping;
245 + return 0;
246
247 if (wdd->ops->ping)
248 err = wdd->ops->ping(wdd); /* ping the watchdog */
249 else
250 err = wdd->ops->start(wdd); /* restart watchdog */
251
252 -out_ping:
253 - mutex_unlock(&wdd->lock);
254 return err;
255 }
256
257 @@ -87,6 +102,8 @@ out_ping:
258 * watchdog_start: wrapper to start the watchdog.
259 * @wdd: the watchdog device to start
260 *
261 + * The caller must hold wd_data->lock.
262 + *
263 * Start the watchdog if it is not active and mark it active.
264 * This function returns zero on success or a negative errno code for
265 * failure.
266 @@ -94,24 +111,15 @@ out_ping:
267
268 static int watchdog_start(struct watchdog_device *wdd)
269 {
270 - int err = 0;
271 -
272 - mutex_lock(&wdd->lock);
273 -
274 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
275 - err = -ENODEV;
276 - goto out_start;
277 - }
278 + int err;
279
280 if (watchdog_active(wdd))
281 - goto out_start;
282 + return 0;
283
284 err = wdd->ops->start(wdd);
285 if (err == 0)
286 set_bit(WDOG_ACTIVE, &wdd->status);
287
288 -out_start:
289 - mutex_unlock(&wdd->lock);
290 return err;
291 }
292
293 @@ -119,6 +127,8 @@ out_start:
294 * watchdog_stop: wrapper to stop the watchdog.
295 * @wdd: the watchdog device to stop
296 *
297 + * The caller must hold wd_data->lock.
298 + *
299 * Stop the watchdog if it is still active and unmark it active.
300 * This function returns zero on success or a negative errno code for
301 * failure.
302 @@ -127,93 +137,58 @@ out_start:
303
304 static int watchdog_stop(struct watchdog_device *wdd)
305 {
306 - int err = 0;
307 -
308 - mutex_lock(&wdd->lock);
309 -
310 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
311 - err = -ENODEV;
312 - goto out_stop;
313 - }
314 + int err;
315
316 if (!watchdog_active(wdd))
317 - goto out_stop;
318 + return 0;
319
320 if (test_bit(WDOG_NO_WAY_OUT, &wdd->status)) {
321 dev_info(wdd->dev, "nowayout prevents watchdog being stopped!\n");
322 - err = -EBUSY;
323 - goto out_stop;
324 + return -EBUSY;
325 }
326
327 err = wdd->ops->stop(wdd);
328 if (err == 0)
329 clear_bit(WDOG_ACTIVE, &wdd->status);
330
331 -out_stop:
332 - mutex_unlock(&wdd->lock);
333 return err;
334 }
335
336 /*
337 * watchdog_get_status: wrapper to get the watchdog status
338 * @wdd: the watchdog device to get the status from
339 - * @status: the status of the watchdog device
340 + *
341 + * The caller must hold wd_data->lock.
342 *
343 * Get the watchdog's status flags.
344 */
345
346 -static int watchdog_get_status(struct watchdog_device *wdd,
347 - unsigned int *status)
348 +static unsigned int watchdog_get_status(struct watchdog_device *wdd)
349 {
350 - int err = 0;
351 -
352 - *status = 0;
353 if (!wdd->ops->status)
354 - return -EOPNOTSUPP;
355 -
356 - mutex_lock(&wdd->lock);
357 -
358 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
359 - err = -ENODEV;
360 - goto out_status;
361 - }
362 -
363 - *status = wdd->ops->status(wdd);
364 + return 0;
365
366 -out_status:
367 - mutex_unlock(&wdd->lock);
368 - return err;
369 + return wdd->ops->status(wdd);
370 }
371
372 /*
373 * watchdog_set_timeout: set the watchdog timer timeout
374 * @wdd: the watchdog device to set the timeout for
375 * @timeout: timeout to set in seconds
376 + *
377 + * The caller must hold wd_data->lock.
378 */
379
380 static int watchdog_set_timeout(struct watchdog_device *wdd,
381 unsigned int timeout)
382 {
383 - int err;
384 -
385 if (!wdd->ops->set_timeout || !(wdd->info->options & WDIOF_SETTIMEOUT))
386 return -EOPNOTSUPP;
387
388 if (watchdog_timeout_invalid(wdd, timeout))
389 return -EINVAL;
390
391 - mutex_lock(&wdd->lock);
392 -
393 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
394 - err = -ENODEV;
395 - goto out_timeout;
396 - }
397 -
398 - err = wdd->ops->set_timeout(wdd, timeout);
399 -
400 -out_timeout:
401 - mutex_unlock(&wdd->lock);
402 - return err;
403 + return wdd->ops->set_timeout(wdd, timeout);
404 }
405
406 /*
407 @@ -221,30 +196,22 @@ out_timeout:
408 * @wdd: the watchdog device to get the remaining time from
409 * @timeleft: the time that's left
410 *
411 + * The caller must hold wd_data->lock.
412 + *
413 * Get the time before a watchdog will reboot (if not pinged).
414 */
415
416 static int watchdog_get_timeleft(struct watchdog_device *wdd,
417 unsigned int *timeleft)
418 {
419 - int err = 0;
420 -
421 *timeleft = 0;
422 +
423 if (!wdd->ops->get_timeleft)
424 return -EOPNOTSUPP;
425
426 - mutex_lock(&wdd->lock);
427 -
428 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
429 - err = -ENODEV;
430 - goto out_timeleft;
431 - }
432 -
433 *timeleft = wdd->ops->get_timeleft(wdd);
434
435 -out_timeleft:
436 - mutex_unlock(&wdd->lock);
437 - return err;
438 + return 0;
439 }
440
441 #ifdef CONFIG_WATCHDOG_SYSFS
442 @@ -261,14 +228,14 @@ static ssize_t status_show(struct device
443 char *buf)
444 {
445 struct watchdog_device *wdd = dev_get_drvdata(dev);
446 - ssize_t status;
447 - unsigned int val;
448 + struct watchdog_core_data *wd_data = wdd->wd_data;
449 + unsigned int status;
450
451 - status = watchdog_get_status(wdd, &val);
452 - if (!status)
453 - status = sprintf(buf, "%u\n", val);
454 + mutex_lock(&wd_data->lock);
455 + status = watchdog_get_status(wdd);
456 + mutex_unlock(&wd_data->lock);
457
458 - return status;
459 + return sprintf(buf, "%u\n", status);
460 }
461 static DEVICE_ATTR_RO(status);
462
463 @@ -285,10 +252,13 @@ static ssize_t timeleft_show(struct devi
464 char *buf)
465 {
466 struct watchdog_device *wdd = dev_get_drvdata(dev);
467 + struct watchdog_core_data *wd_data = wdd->wd_data;
468 ssize_t status;
469 unsigned int val;
470
471 + mutex_lock(&wd_data->lock);
472 status = watchdog_get_timeleft(wdd, &val);
473 + mutex_unlock(&wd_data->lock);
474 if (!status)
475 status = sprintf(buf, "%u\n", val);
476
477 @@ -365,28 +335,17 @@ __ATTRIBUTE_GROUPS(wdt);
478 * @wdd: the watchdog device to do the ioctl on
479 * @cmd: watchdog command
480 * @arg: argument pointer
481 + *
482 + * The caller must hold wd_data->lock.
483 */
484
485 static int watchdog_ioctl_op(struct watchdog_device *wdd, unsigned int cmd,
486 unsigned long arg)
487 {
488 - int err;
489 -
490 if (!wdd->ops->ioctl)
491 return -ENOIOCTLCMD;
492
493 - mutex_lock(&wdd->lock);
494 -
495 - if (test_bit(WDOG_UNREGISTERED, &wdd->status)) {
496 - err = -ENODEV;
497 - goto out_ioctl;
498 - }
499 -
500 - err = wdd->ops->ioctl(wdd, cmd, arg);
501 -
502 -out_ioctl:
503 - mutex_unlock(&wdd->lock);
504 - return err;
505 + return wdd->ops->ioctl(wdd, cmd, arg);
506 }
507
508 /*
509 @@ -404,10 +363,11 @@ out_ioctl:
510 static ssize_t watchdog_write(struct file *file, const char __user *data,
511 size_t len, loff_t *ppos)
512 {
513 - struct watchdog_device *wdd = file->private_data;
514 + struct watchdog_core_data *wd_data = file->private_data;
515 + struct watchdog_device *wdd;
516 + int err;
517 size_t i;
518 char c;
519 - int err;
520
521 if (len == 0)
522 return 0;
523 @@ -416,18 +376,25 @@ static ssize_t watchdog_write(struct fil
524 * Note: just in case someone wrote the magic character
525 * five months ago...
526 */
527 - clear_bit(WDOG_ALLOW_RELEASE, &wdd->status);
528 + clear_bit(_WDOG_ALLOW_RELEASE, &wd_data->status);
529
530 /* scan to see whether or not we got the magic character */
531 for (i = 0; i != len; i++) {
532 if (get_user(c, data + i))
533 return -EFAULT;
534 if (c == 'V')
535 - set_bit(WDOG_ALLOW_RELEASE, &wdd->status);
536 + set_bit(_WDOG_ALLOW_RELEASE, &wd_data->status);
537 }
538
539 /* someone wrote to us, so we send the watchdog a keepalive ping */
540 - err = watchdog_ping(wdd);
541 +
542 + err = -ENODEV;
543 + mutex_lock(&wd_data->lock);
544 + wdd = wd_data->wdd;
545 + if (wdd)
546 + err = watchdog_ping(wdd);
547 + mutex_unlock(&wd_data->lock);
548 +
549 if (err < 0)
550 return err;
551
552 @@ -447,71 +414,94 @@ static ssize_t watchdog_write(struct fil
553 static long watchdog_ioctl(struct file *file, unsigned int cmd,
554 unsigned long arg)
555 {
556 - struct watchdog_device *wdd = file->private_data;
557 + struct watchdog_core_data *wd_data = file->private_data;
558 void __user *argp = (void __user *)arg;
559 + struct watchdog_device *wdd;
560 int __user *p = argp;
561 unsigned int val;
562 int err;
563
564 + mutex_lock(&wd_data->lock);
565 +
566 + wdd = wd_data->wdd;
567 + if (!wdd) {
568 + err = -ENODEV;
569 + goto out_ioctl;
570 + }
571 +
572 err = watchdog_ioctl_op(wdd, cmd, arg);
573 if (err != -ENOIOCTLCMD)
574 - return err;
575 + goto out_ioctl;
576
577 switch (cmd) {
578 case WDIOC_GETSUPPORT:
579 - return copy_to_user(argp, wdd->info,
580 + err = copy_to_user(argp, wdd->info,
581 sizeof(struct watchdog_info)) ? -EFAULT : 0;
582 + break;
583 case WDIOC_GETSTATUS:
584 - err = watchdog_get_status(wdd, &val);
585 - if (err == -ENODEV)
586 - return err;
587 - return put_user(val, p);
588 + val = watchdog_get_status(wdd);
589 + err = put_user(val, p);
590 + break;
591 case WDIOC_GETBOOTSTATUS:
592 - return put_user(wdd->bootstatus, p);
593 + err = put_user(wdd->bootstatus, p);
594 + break;
595 case WDIOC_SETOPTIONS:
596 - if (get_user(val, p))
597 - return -EFAULT;
598 + if (get_user(val, p)) {
599 + err = -EFAULT;
600 + break;
601 + }
602 if (val & WDIOS_DISABLECARD) {
603 err = watchdog_stop(wdd);
604 if (err < 0)
605 - return err;
606 + break;
607 }
608 - if (val & WDIOS_ENABLECARD) {
609 + if (val & WDIOS_ENABLECARD)
610 err = watchdog_start(wdd);
611 - if (err < 0)
612 - return err;
613 - }
614 - return 0;
615 + break;
616 case WDIOC_KEEPALIVE:
617 - if (!(wdd->info->options & WDIOF_KEEPALIVEPING))
618 - return -EOPNOTSUPP;
619 - return watchdog_ping(wdd);
620 + if (!(wdd->info->options & WDIOF_KEEPALIVEPING)) {
621 + err = -EOPNOTSUPP;
622 + break;
623 + }
624 + err = watchdog_ping(wdd);
625 + break;
626 case WDIOC_SETTIMEOUT:
627 - if (get_user(val, p))
628 - return -EFAULT;
629 + if (get_user(val, p)) {
630 + err = -EFAULT;
631 + break;
632 + }
633 err = watchdog_set_timeout(wdd, val);
634 if (err < 0)
635 - return err;
636 + break;
637 /* If the watchdog is active then we send a keepalive ping
638 * to make sure that the watchdog keep's running (and if
639 * possible that it takes the new timeout) */
640 err = watchdog_ping(wdd);
641 if (err < 0)
642 - return err;
643 + break;
644 /* Fall */
645 case WDIOC_GETTIMEOUT:
646 /* timeout == 0 means that we don't know the timeout */
647 - if (wdd->timeout == 0)
648 - return -EOPNOTSUPP;
649 - return put_user(wdd->timeout, p);
650 + if (wdd->timeout == 0) {
651 + err = -EOPNOTSUPP;
652 + break;
653 + }
654 + err = put_user(wdd->timeout, p);
655 + break;
656 case WDIOC_GETTIMELEFT:
657 err = watchdog_get_timeleft(wdd, &val);
658 - if (err)
659 - return err;
660 - return put_user(val, p);
661 + if (err < 0)
662 + break;
663 + err = put_user(val, p);
664 + break;
665 default:
666 - return -ENOTTY;
667 + err = -ENOTTY;
668 + break;
669 }
670 +
671 +out_ioctl:
672 + mutex_unlock(&wd_data->lock);
673 + return err;
674 }
675
676 /*
677 @@ -526,45 +516,59 @@ static long watchdog_ioctl(struct file *
678
679 static int watchdog_open(struct inode *inode, struct file *file)
680 {
681 - int err = -EBUSY;
682 + struct watchdog_core_data *wd_data;
683 struct watchdog_device *wdd;
684 + int err;
685
686 /* Get the corresponding watchdog device */
687 if (imajor(inode) == MISC_MAJOR)
688 - wdd = old_wdd;
689 + wd_data = old_wd_data;
690 else
691 - wdd = container_of(inode->i_cdev, struct watchdog_device, cdev);
692 + wd_data = container_of(inode->i_cdev, struct watchdog_core_data,
693 + cdev);
694
695 /* the watchdog is single open! */
696 - if (test_and_set_bit(WDOG_DEV_OPEN, &wdd->status))
697 + if (test_and_set_bit(_WDOG_DEV_OPEN, &wd_data->status))
698 return -EBUSY;
699
700 + wdd = wd_data->wdd;
701 +
702 /*
703 * If the /dev/watchdog device is open, we don't want the module
704 * to be unloaded.
705 */
706 - if (!try_module_get(wdd->ops->owner))
707 - goto out;
708 + if (!try_module_get(wdd->ops->owner)) {
709 + err = -EBUSY;
710 + goto out_clear;
711 + }
712
713 err = watchdog_start(wdd);
714 if (err < 0)
715 goto out_mod;
716
717 - file->private_data = wdd;
718 + file->private_data = wd_data;
719
720 - if (wdd->ops->ref)
721 - wdd->ops->ref(wdd);
722 + kref_get(&wd_data->kref);
723
724 /* dev/watchdog is a virtual (and thus non-seekable) filesystem */
725 return nonseekable_open(inode, file);
726
727 out_mod:
728 - module_put(wdd->ops->owner);
729 -out:
730 - clear_bit(WDOG_DEV_OPEN, &wdd->status);
731 + module_put(wd_data->wdd->ops->owner);
732 +out_clear:
733 + clear_bit(_WDOG_DEV_OPEN, &wd_data->status);
734 return err;
735 }
736
737 +static void watchdog_core_data_release(struct kref *kref)
738 +{
739 + struct watchdog_core_data *wd_data;
740 +
741 + wd_data = container_of(kref, struct watchdog_core_data, kref);
742 +
743 + kfree(wd_data);
744 +}
745 +
746 /*
747 * watchdog_release: release the watchdog device.
748 * @inode: inode of device
749 @@ -577,9 +581,16 @@ out:
750
751 static int watchdog_release(struct inode *inode, struct file *file)
752 {
753 - struct watchdog_device *wdd = file->private_data;
754 + struct watchdog_core_data *wd_data = file->private_data;
755 + struct watchdog_device *wdd;
756 int err = -EBUSY;
757
758 + mutex_lock(&wd_data->lock);
759 +
760 + wdd = wd_data->wdd;
761 + if (!wdd)
762 + goto done;
763 +
764 /*
765 * We only stop the watchdog if we received the magic character
766 * or if WDIOF_MAGICCLOSE is not set. If nowayout was set then
767 @@ -587,29 +598,24 @@ static int watchdog_release(struct inode
768 */
769 if (!test_bit(WDOG_ACTIVE, &wdd->status))
770 err = 0;
771 - else if (test_and_clear_bit(WDOG_ALLOW_RELEASE, &wdd->status) ||
772 + else if (test_and_clear_bit(_WDOG_ALLOW_RELEASE, &wd_data->status) ||
773 !(wdd->info->options & WDIOF_MAGICCLOSE))
774 err = watchdog_stop(wdd);
775
776 /* If the watchdog was not stopped, send a keepalive ping */
777 if (err < 0) {
778 - mutex_lock(&wdd->lock);
779 - if (!test_bit(WDOG_UNREGISTERED, &wdd->status))
780 - dev_crit(wdd->dev, "watchdog did not stop!\n");
781 - mutex_unlock(&wdd->lock);
782 + dev_crit(wdd->dev, "watchdog did not stop!\n");
783 watchdog_ping(wdd);
784 }
785
786 - /* Allow the owner module to be unloaded again */
787 - module_put(wdd->ops->owner);
788 -
789 /* make sure that /dev/watchdog can be re-opened */
790 - clear_bit(WDOG_DEV_OPEN, &wdd->status);
791 -
792 - /* Note wdd may be gone after this, do not use after this! */
793 - if (wdd->ops->unref)
794 - wdd->ops->unref(wdd);
795 + clear_bit(_WDOG_DEV_OPEN, &wd_data->status);
796
797 +done:
798 + mutex_unlock(&wd_data->lock);
799 + /* Allow the owner module to be unloaded again */
800 + module_put(wd_data->cdev.owner);
801 + kref_put(&wd_data->kref, watchdog_core_data_release);
802 return 0;
803 }
804
805 @@ -639,10 +645,20 @@ static struct miscdevice watchdog_miscde
806
807 static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno)
808 {
809 + struct watchdog_core_data *wd_data;
810 int err;
811
812 + wd_data = kzalloc(sizeof(struct watchdog_core_data), GFP_KERNEL);
813 + if (!wd_data)
814 + return -ENOMEM;
815 + kref_init(&wd_data->kref);
816 + mutex_init(&wd_data->lock);
817 +
818 + wd_data->wdd = wdd;
819 + wdd->wd_data = wd_data;
820 +
821 if (wdd->id == 0) {
822 - old_wdd = wdd;
823 + old_wd_data = wd_data;
824 watchdog_miscdev.parent = wdd->parent;
825 err = misc_register(&watchdog_miscdev);
826 if (err != 0) {
827 @@ -651,23 +667,25 @@ static int watchdog_cdev_register(struct
828 if (err == -EBUSY)
829 pr_err("%s: a legacy watchdog module is probably present.\n",
830 wdd->info->identity);
831 - old_wdd = NULL;
832 + old_wd_data = NULL;
833 + kfree(wd_data);
834 return err;
835 }
836 }
837
838 /* Fill in the data structures */
839 - cdev_init(&wdd->cdev, &watchdog_fops);
840 - wdd->cdev.owner = wdd->ops->owner;
841 + cdev_init(&wd_data->cdev, &watchdog_fops);
842 + wd_data->cdev.owner = wdd->ops->owner;
843
844 /* Add the device */
845 - err = cdev_add(&wdd->cdev, devno, 1);
846 + err = cdev_add(&wd_data->cdev, devno, 1);
847 if (err) {
848 pr_err("watchdog%d unable to add device %d:%d\n",
849 wdd->id, MAJOR(watchdog_devt), wdd->id);
850 if (wdd->id == 0) {
851 misc_deregister(&watchdog_miscdev);
852 - old_wdd = NULL;
853 + old_wd_data = NULL;
854 + kref_put(&wd_data->kref, watchdog_core_data_release);
855 }
856 }
857 return err;
858 @@ -683,15 +701,20 @@ static int watchdog_cdev_register(struct
859
860 static void watchdog_cdev_unregister(struct watchdog_device *wdd)
861 {
862 - mutex_lock(&wdd->lock);
863 - set_bit(WDOG_UNREGISTERED, &wdd->status);
864 - mutex_unlock(&wdd->lock);
865 + struct watchdog_core_data *wd_data = wdd->wd_data;
866
867 - cdev_del(&wdd->cdev);
868 + cdev_del(&wd_data->cdev);
869 if (wdd->id == 0) {
870 misc_deregister(&watchdog_miscdev);
871 - old_wdd = NULL;
872 + old_wd_data = NULL;
873 }
874 +
875 + mutex_lock(&wd_data->lock);
876 + wd_data->wdd = NULL;
877 + wdd->wd_data = NULL;
878 + mutex_unlock(&wd_data->lock);
879 +
880 + kref_put(&wd_data->kref, watchdog_core_data_release);
881 }
882
883 static struct class watchdog_class = {
884 @@ -742,9 +765,9 @@ int watchdog_dev_register(struct watchdo
885
886 void watchdog_dev_unregister(struct watchdog_device *wdd)
887 {
888 - watchdog_cdev_unregister(wdd);
889 device_destroy(&watchdog_class, wdd->dev->devt);
890 wdd->dev = NULL;
891 + watchdog_cdev_unregister(wdd);
892 }
893
894 /*
895 --- a/include/linux/watchdog.h
896 +++ b/include/linux/watchdog.h
897 @@ -17,6 +17,7 @@
898
899 struct watchdog_ops;
900 struct watchdog_device;
901 +struct watchdog_core_data;
902
903 /** struct watchdog_ops - The watchdog-devices operations
904 *
905 @@ -28,8 +29,6 @@ struct watchdog_device;
906 * @set_timeout:The routine for setting the watchdog devices timeout value (in seconds).
907 * @get_timeleft:The routine that gets the time left before a reset (in seconds).
908 * @restart: The routine for restarting the machine.
909 - * @ref: The ref operation for dyn. allocated watchdog_device structs
910 - * @unref: The unref operation for dyn. allocated watchdog_device structs
911 * @ioctl: The routines that handles extra ioctl calls.
912 *
913 * The watchdog_ops structure contains a list of low-level operations
914 @@ -48,15 +47,14 @@ struct watchdog_ops {
915 int (*set_timeout)(struct watchdog_device *, unsigned int);
916 unsigned int (*get_timeleft)(struct watchdog_device *);
917 int (*restart)(struct watchdog_device *);
918 - void (*ref)(struct watchdog_device *);
919 - void (*unref)(struct watchdog_device *);
920 + void (*ref)(struct watchdog_device *) __deprecated;
921 + void (*unref)(struct watchdog_device *) __deprecated;
922 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
923 };
924
925 /** struct watchdog_device - The structure that defines a watchdog device
926 *
927 * @id: The watchdog's ID. (Allocated by watchdog_register_device)
928 - * @cdev: The watchdog's Character device.
929 * @dev: The device for our watchdog
930 * @parent: The parent bus device
931 * @info: Pointer to a watchdog_info structure.
932 @@ -67,8 +65,8 @@ struct watchdog_ops {
933 * @max_timeout:The watchdog devices maximum timeout value (in seconds).
934 * @reboot_nb: The notifier block to stop watchdog on reboot.
935 * @restart_nb: The notifier block to register a restart function.
936 - * @driver-data:Pointer to the drivers private data.
937 - * @lock: Lock for watchdog core internal use only.
938 + * @driver_data:Pointer to the drivers private data.
939 + * @wd_data: Pointer to watchdog core internal data.
940 * @status: Field that contains the devices internal status bits.
941 * @deferred: entry in wtd_deferred_reg_list which is used to
942 * register early initialized watchdogs.
943 @@ -84,7 +82,6 @@ struct watchdog_ops {
944 */
945 struct watchdog_device {
946 int id;
947 - struct cdev cdev;
948 struct device *dev;
949 struct device *parent;
950 const struct watchdog_info *info;
951 @@ -96,15 +93,12 @@ struct watchdog_device {
952 struct notifier_block reboot_nb;
953 struct notifier_block restart_nb;
954 void *driver_data;
955 - struct mutex lock;
956 + struct watchdog_core_data *wd_data;
957 unsigned long status;
958 /* Bit numbers for status flags */
959 #define WDOG_ACTIVE 0 /* Is the watchdog running/active */
960 -#define WDOG_DEV_OPEN 1 /* Opened via /dev/watchdog ? */
961 -#define WDOG_ALLOW_RELEASE 2 /* Did we receive the magic char ? */
962 -#define WDOG_NO_WAY_OUT 3 /* Is 'nowayout' feature set ? */
963 -#define WDOG_UNREGISTERED 4 /* Has the device been unregistered */
964 -#define WDOG_STOP_ON_REBOOT 5 /* Should be stopped on reboot */
965 +#define WDOG_NO_WAY_OUT 1 /* Is 'nowayout' feature set ? */
966 +#define WDOG_STOP_ON_REBOOT 2 /* Should be stopped on reboot */
967 struct list_head deferred;
968 };
969