[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re: [Bug 1612] Can't start VM when vif set and udev version is greater than 151
On 07/07/2010 07:48 AM, Konrad Rzeszutek Wilk wrote: > On Wed, Jul 07, 2010 at 08:30:19AM +0100, Jan Beulich wrote: > >>>>> On 06.07.10 at 18:46, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> >>>>> wrote: >>>>> >>>> For reference, below is the diff for what we're now using. >>>> >>> Ah nice.. >>> >>> I get this: >>> patch -p1 --dry-run < ~/p.patch >>> patching file drivers/xen/netback/xenbus.c >>> Hunk #1 succeeded at 19 with fuzz 1. >>> Hunk #2 FAILED at 29. >>> Hunk #3 FAILED at 40. >>> patch: **** malformed patch at line 120: nv *env) >>> >>> If it would not be too much trouble, can you attach it as an attachment? >>> >> Sure, here you go. >> > And attached is it redone against the pv-ops kernel. Let me poke the > folks on the BZ to see if they would be willing to test this. > > > diff --git a/drivers/xen/netback/xenbus.c b/drivers/xen/netback/xenbus.c > index ba7b1de..805ce48 100644 > --- a/drivers/xen/netback/xenbus.c > +++ b/drivers/xen/netback/xenbus.c > @@ -19,6 +19,7 @@ > > #include <stdarg.h> > #include <linux/module.h> > +#include <linux/rwsem.h> > #include <xen/xenbus.h> > #include "common.h" > > @@ -28,6 +29,7 @@ > printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, > ##args) > #endif > > +static DECLARE_RWSEM(teardown_sem); > > static int connect_rings(struct backend_info *); > static void connect(struct backend_info *); > @@ -41,14 +43,19 @@ static int netback_remove(struct xenbus_device *dev) > //netback_remove_accelerators(be, dev); > > unregister_hotplug_status_watch(be); > - if (be->netif) { > + if (be->netif) > kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE); > + > + down_write(&teardown_sem); > + if (be->netif) { > xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status"); > netif_disconnect(be->netif); > be->netif = NULL; > } > - kfree(be); > dev_set_drvdata(&dev->dev, NULL); > + up_write(&teardown_sem); > + kfree(be); > + > return 0; > } > > @@ -168,7 +175,7 @@ static int netback_uevent(struct xenbus_device *xdev, > struct kobj_uevent_env *en > > DPRINTK("netback_uevent"); > > - be = dev_get_drvdata(&xdev->dev); > + be = dev_get_drvdata(&xdev->dev);/ > Hm. Post-compile typo? > if (!be) > return 0; > netif = be->netif; > @@ -187,9 +194,14 @@ static int netback_uevent(struct xenbus_device *xdev, > struct kobj_uevent_env *en > kfree(val); > } > > - if (add_uevent_var(env, "vif=%s", netif->dev->name)) > - return -ENOMEM; > - > + down_read(&teardown_sem); > + be = dev_get_drvdata(&xdev->dev); > + if (be && be->netif) > + if (add_uevent_var(env, "vif=%s", netif->dev->name)) { > I would tend to fold these into a single if(); the double if looks odd. > + up_read(&teardown_sem); > + return -ENOMEM; > + } > + up_read(&teardown_sem); > return 0; > } > > @@ -199,6 +211,7 @@ static void backend_create_netif(struct backend_info *be) > int err; > long handle; > struct xenbus_device *dev = be->dev; > + netif_t *netif; > > if (be->netif != NULL) > return; > @@ -209,13 +222,13 @@ static void backend_create_netif(struct backend_info > *be) > return; > } > > - be->netif = netif_alloc(&dev->dev, dev->otherend_id, handle); > - if (IS_ERR(be->netif)) { > - err = PTR_ERR(be->netif); > - be->netif = NULL; > + netif = netif_alloc(&dev->dev, dev->otherend_id, handle); > + if (IS_ERR(netif)) { > + err = PTR_ERR(netif); > xenbus_dev_fatal(dev, err, "creating interface"); > return; > } > + be->netif = netif; > > kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE); > } > J _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |