Jan Beulich
2012-Mar-19 09:32 UTC
[PATCH] watchdog/xen: don''t clear is_active when xen_wdt_stop() failed
xen_wdt_release() shouldn''t clear is_active even when the watchdog didn''t get stopped (which by itself shouldn''t happen, but let''s return a proper error in this case rather than adding a BUG() upon hypercall failure). Signed-off-by: Jan Beulich <jbeulich@suse.com> --- drivers/watchdog/xen_wdt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) --- 3.3/drivers/watchdog/xen_wdt.c +++ 3.3-xen-watchdog-release/drivers/watchdog/xen_wdt.c @@ -131,16 +131,18 @@ static int xen_wdt_open(struct inode *in static int xen_wdt_release(struct inode *inode, struct file *file) { + int err = 0; + if (expect_release) - xen_wdt_stop(); + err = xen_wdt_stop(); else { printk(KERN_CRIT PFX "unexpected close, not stopping watchdog!\n"); xen_wdt_kick(); } - is_active = false; + is_active = err; expect_release = false; - return 0; + return err; } static ssize_t xen_wdt_write(struct file *file, const char __user *data,
Konrad Rzeszutek Wilk
2012-Mar-21 17:23 UTC
Re: [PATCH] watchdog/xen: don''t clear is_active when xen_wdt_stop() failed
On Mon, Mar 19, 2012 at 09:32:28AM +0000, Jan Beulich wrote:> xen_wdt_release() shouldn''t clear is_active even when the watchdog > didn''t get stopped (which by itself shouldn''t happen, but let''s return > a proper error in this case rather than adding a BUG() upon hypercall > failure). > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Looks good to me too. Wim, want me to carry it for 3.4?> > --- > drivers/watchdog/xen_wdt.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > --- 3.3/drivers/watchdog/xen_wdt.c > +++ 3.3-xen-watchdog-release/drivers/watchdog/xen_wdt.c > @@ -131,16 +131,18 @@ static int xen_wdt_open(struct inode *in > > static int xen_wdt_release(struct inode *inode, struct file *file) > { > + int err = 0; > + > if (expect_release) > - xen_wdt_stop(); > + err = xen_wdt_stop(); > else { > printk(KERN_CRIT PFX > "unexpected close, not stopping watchdog!\n"); > xen_wdt_kick(); > } > - is_active = false; > + is_active = err; > expect_release = false; > - return 0; > + return err; > } > > static ssize_t xen_wdt_write(struct file *file, const char __user *data, > >
Wim Van Sebroeck
2012-Mar-21 19:50 UTC
Re: [PATCH] watchdog/xen: don''t clear is_active when xen_wdt_stop() failed
Hi Jan,> xen_wdt_release() shouldn''t clear is_active even when the watchdog > didn''t get stopped (which by itself shouldn''t happen, but let''s return > a proper error in this case rather than adding a BUG() upon hypercall > failure). > > Signed-off-by: Jan Beulich <jbeulich@suse.com> > > --- > drivers/watchdog/xen_wdt.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > --- 3.3/drivers/watchdog/xen_wdt.c > +++ 3.3-xen-watchdog-release/drivers/watchdog/xen_wdt.c > @@ -131,16 +131,18 @@ static int xen_wdt_open(struct inode *in > > static int xen_wdt_release(struct inode *inode, struct file *file) > { > + int err = 0; > + > if (expect_release) > - xen_wdt_stop(); > + err = xen_wdt_stop(); > else { > printk(KERN_CRIT PFX > "unexpected close, not stopping watchdog!\n"); > xen_wdt_kick(); > } > - is_active = false; > + is_active = err; > expect_release = false; > - return 0; > + return err; > } > > static ssize_t xen_wdt_write(struct file *file, const char __user *data,Just for my understanding: is_active is a bool value and err is an integer. What values are returned by xen_wdt_stop? Kind regards, Wim.
Jan Beulich
2012-Mar-22 08:13 UTC
Re: [PATCH] watchdog/xen: don''t clear is_active when xen_wdt_stop() failed
>>> On 21.03.12 at 20:50, Wim Van Sebroeck <wim@iguana.be> wrote: > Hi Jan, > >> xen_wdt_release() shouldn''t clear is_active even when the watchdog >> didn''t get stopped (which by itself shouldn''t happen, but let''s return >> a proper error in this case rather than adding a BUG() upon hypercall >> failure). >> >> Signed-off-by: Jan Beulich <jbeulich@suse.com> >> >> --- >> drivers/watchdog/xen_wdt.c | 8 +++++--- >> 1 file changed, 5 insertions(+), 3 deletions(-) >> >> --- 3.3/drivers/watchdog/xen_wdt.c >> +++ 3.3-xen-watchdog-release/drivers/watchdog/xen_wdt.c >> @@ -131,16 +131,18 @@ static int xen_wdt_open(struct inode *in >> >> static int xen_wdt_release(struct inode *inode, struct file *file) >> { >> + int err = 0; >> + >> if (expect_release) >> - xen_wdt_stop(); >> + err = xen_wdt_stop(); >> else { >> printk(KERN_CRIT PFX >> "unexpected close, not stopping watchdog!\n"); >> xen_wdt_kick(); >> } >> - is_active = false; >> + is_active = err; >> expect_release = false; >> - return 0; >> + return err; >> } >> >> static ssize_t xen_wdt_write(struct file *file, const char __user *data, > > Just for my understanding: > is_active is a bool value and err is an integer. What values are returned by > xen_wdt_stop?xen_wdt_stop() returns the usual -errno values. Assignments from non-bool to bool convert the value (non-zero -> true, zero -> false), i.e. is_active gets set to false only if xen_wdt_stop() succeeded. Jan