diff options
Diffstat (limited to 'drivers/net/xen-netback/xenbus.c')
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 4e56a27f9689..fab0d4b42f58 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -39,7 +39,7 @@ struct backend_info {  static int connect_rings(struct backend_info *be, struct xenvif_queue *queue);  static void connect(struct backend_info *be);  static int read_xenbus_vif_flags(struct backend_info *be); -static void backend_create_xenvif(struct backend_info *be); +static int backend_create_xenvif(struct backend_info *be);  static void unregister_hotplug_status_watch(struct backend_info *be);  static void set_backend_state(struct backend_info *be,  			      enum xenbus_state state); @@ -352,7 +352,9 @@ static int netback_probe(struct xenbus_device *dev,  	be->state = XenbusStateInitWait;  	/* This kicks hotplug scripts, so do it immediately. */ -	backend_create_xenvif(be); +	err = backend_create_xenvif(be); +	if (err) +		goto fail;  	return 0; @@ -397,19 +399,19 @@ static int netback_uevent(struct xenbus_device *xdev,  } -static void backend_create_xenvif(struct backend_info *be) +static int backend_create_xenvif(struct backend_info *be)  {  	int err;  	long handle;  	struct xenbus_device *dev = be->dev;  	if (be->vif != NULL) -		return; +		return 0;  	err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);  	if (err != 1) {  		xenbus_dev_fatal(dev, err, "reading handle"); -		return; +		return (err < 0) ? err : -EINVAL;  	}  	be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle); @@ -417,10 +419,11 @@ static void backend_create_xenvif(struct backend_info *be)  		err = PTR_ERR(be->vif);  		be->vif = NULL;  		xenbus_dev_fatal(dev, err, "creating interface"); -		return; +		return err;  	}  	kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE); +	return 0;  }  static void backend_disconnect(struct backend_info *be)  | 
