|
@@ -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)
|