diff options
Diffstat (limited to 'drivers/xen/xenbus/xenbus_xs.c')
| -rw-r--r-- | drivers/xen/xenbus/xenbus_xs.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c index 5534690075a..b3b8f2f3ad1 100644 --- a/drivers/xen/xenbus/xenbus_xs.c +++ b/drivers/xen/xenbus/xenbus_xs.c @@ -45,6 +45,7 @@  #include <linux/module.h>  #include <linux/mutex.h>  #include <xen/xenbus.h> +#include <xen/xen.h>  #include "xenbus_comms.h"  struct xs_stored_msg { @@ -620,6 +621,15 @@ static struct xenbus_watch *find_watch(const char *token)  	return NULL;  } +static void xs_reset_watches(void) +{ +	int err; + +	err = xs_error(xs_single(XBT_NIL, XS_RESET_WATCHES, "", NULL)); +	if (err && err != -EEXIST) +		printk(KERN_WARNING "xs_reset_watches failed: %d\n", err); +} +  /* Register callback to watch this node. */  int register_xenbus_watch(struct xenbus_watch *watch)  { @@ -638,8 +648,7 @@ int register_xenbus_watch(struct xenbus_watch *watch)  	err = xs_watch(watch->node, token); -	/* Ignore errors due to multiple registration. */ -	if ((err != 0) && (err != -EEXIST)) { +	if (err) {  		spin_lock(&watches_lock);  		list_del(&watch->list);  		spin_unlock(&watches_lock); @@ -897,5 +906,9 @@ int xs_init(void)  	if (IS_ERR(task))  		return PTR_ERR(task); +	/* shutdown watches for kexec boot */ +	if (xen_hvm_domain()) +		xs_reset_watches(); +  	return 0;  }  |