|
@@ -34,6 +34,8 @@ struct backend_info {
|
|
enum xenbus_state frontend_state;
|
|
enum xenbus_state frontend_state;
|
|
struct xenbus_watch hotplug_status_watch;
|
|
struct xenbus_watch hotplug_status_watch;
|
|
u8 have_hotplug_status_watch:1;
|
|
u8 have_hotplug_status_watch:1;
|
|
|
|
+
|
|
|
|
+ const char *hotplug_script;
|
|
};
|
|
};
|
|
|
|
|
|
static int connect_rings(struct backend_info *be, struct xenvif_queue *queue);
|
|
static int connect_rings(struct backend_info *be, struct xenvif_queue *queue);
|
|
@@ -238,6 +240,7 @@ static int netback_remove(struct xenbus_device *dev)
|
|
xenvif_free(be->vif);
|
|
xenvif_free(be->vif);
|
|
be->vif = NULL;
|
|
be->vif = NULL;
|
|
}
|
|
}
|
|
|
|
+ kfree(be->hotplug_script);
|
|
kfree(be);
|
|
kfree(be);
|
|
dev_set_drvdata(&dev->dev, NULL);
|
|
dev_set_drvdata(&dev->dev, NULL);
|
|
return 0;
|
|
return 0;
|
|
@@ -255,6 +258,7 @@ static int netback_probe(struct xenbus_device *dev,
|
|
struct xenbus_transaction xbt;
|
|
struct xenbus_transaction xbt;
|
|
int err;
|
|
int err;
|
|
int sg;
|
|
int sg;
|
|
|
|
+ const char *script;
|
|
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
|
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
|
GFP_KERNEL);
|
|
GFP_KERNEL);
|
|
if (!be) {
|
|
if (!be) {
|
|
@@ -347,6 +351,15 @@ static int netback_probe(struct xenbus_device *dev,
|
|
if (err)
|
|
if (err)
|
|
pr_debug("Error writing multi-queue-max-queues\n");
|
|
pr_debug("Error writing multi-queue-max-queues\n");
|
|
|
|
|
|
|
|
+ script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
|
|
|
+ if (IS_ERR(script)) {
|
|
|
|
+ err = PTR_ERR(script);
|
|
|
|
+ xenbus_dev_fatal(dev, err, "reading script");
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ be->hotplug_script = script;
|
|
|
|
+
|
|
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
|
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
|
if (err)
|
|
if (err)
|
|
goto fail;
|
|
goto fail;
|
|
@@ -379,22 +392,14 @@ static int netback_uevent(struct xenbus_device *xdev,
|
|
struct kobj_uevent_env *env)
|
|
struct kobj_uevent_env *env)
|
|
{
|
|
{
|
|
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
|
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
|
- char *val;
|
|
|
|
|
|
|
|
- val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
|
|
|
|
- if (IS_ERR(val)) {
|
|
|
|
- int err = PTR_ERR(val);
|
|
|
|
- xenbus_dev_fatal(xdev, err, "reading script");
|
|
|
|
- return err;
|
|
|
|
- } else {
|
|
|
|
- if (add_uevent_var(env, "script=%s", val)) {
|
|
|
|
- kfree(val);
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
- kfree(val);
|
|
|
|
- }
|
|
|
|
|
|
+ if (!be)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (add_uevent_var(env, "script=%s", be->hotplug_script))
|
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- if (!be || !be->vif)
|
|
|
|
|
|
+ if (!be->vif)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|
|
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|