Commit 2dd34339 authored by Alexey Khoroshilov's avatar Alexey Khoroshilov Committed by David S. Miller

xen-netback: do not report success if backend_create_xenvif() fails

If xenvif_alloc() or xenbus_scanf() fail in backend_create_xenvif(),
xenbus is left in offline mode but netback_probe() reports success.

The patch implements propagation of error code for backend_create_xenvif().

Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
Acked-by: default avatarWei Liu <wei.liu2@citrix.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent be6572fd
...@@ -39,7 +39,7 @@ struct backend_info { ...@@ -39,7 +39,7 @@ struct backend_info {
static int connect_rings(struct backend_info *be, struct xenvif_queue *queue); static int connect_rings(struct backend_info *be, struct xenvif_queue *queue);
static void connect(struct backend_info *be); static void connect(struct backend_info *be);
static int read_xenbus_vif_flags(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 unregister_hotplug_status_watch(struct backend_info *be);
static void set_backend_state(struct backend_info *be, static void set_backend_state(struct backend_info *be,
enum xenbus_state state); enum xenbus_state state);
...@@ -352,7 +352,9 @@ static int netback_probe(struct xenbus_device *dev, ...@@ -352,7 +352,9 @@ static int netback_probe(struct xenbus_device *dev,
be->state = XenbusStateInitWait; be->state = XenbusStateInitWait;
/* This kicks hotplug scripts, so do it immediately. */ /* This kicks hotplug scripts, so do it immediately. */
backend_create_xenvif(be); err = backend_create_xenvif(be);
if (err)
goto fail;
return 0; return 0;
...@@ -397,19 +399,19 @@ static int netback_uevent(struct xenbus_device *xdev, ...@@ -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; int err;
long handle; long handle;
struct xenbus_device *dev = be->dev; struct xenbus_device *dev = be->dev;
if (be->vif != NULL) if (be->vif != NULL)
return; return 0;
err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle); err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
if (err != 1) { if (err != 1) {
xenbus_dev_fatal(dev, err, "reading handle"); xenbus_dev_fatal(dev, err, "reading handle");
return; return (err < 0) ? err : -EINVAL;
} }
be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle); be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
...@@ -417,10 +419,11 @@ static void backend_create_xenvif(struct backend_info *be) ...@@ -417,10 +419,11 @@ static void backend_create_xenvif(struct backend_info *be)
err = PTR_ERR(be->vif); err = PTR_ERR(be->vif);
be->vif = NULL; be->vif = NULL;
xenbus_dev_fatal(dev, err, "creating interface"); xenbus_dev_fatal(dev, err, "creating interface");
return; return err;
} }
kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE); kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
return 0;
} }
static void backend_disconnect(struct backend_info *be) static void backend_disconnect(struct backend_info *be)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment