[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen/xenbus: Use 'void' instead of 'int' for the return of xenbus_switch_state()



On Fri, Sep 26, 2014 at 07:07:19PM +0100, David Vrabel wrote:
> On 26/09/14 17:36, Chen Gang wrote:
> > When xenbus_switch_state() fails, it will call xenbus_switch_fatal()
> > internally, so need not return any status value, then use 'void' instead
> > of 'int' for xenbus_switch_state() and __xenbus_switch_state().
> > 
> > Also need be sure that all callers which check the return value must let
> > 'err' be 0.
> 
> I've rewritten the commit message as:
> 
>     xen/xenbus: don't return errors from xenbus_switch_state()
> 
>     Most users of xenbus_switch_state() weren't handling the failure of
>     xenbus_switch_state() correctly.  They either called
>     xenbus_dev_fatal() (which xenbus_switch_state() has effectively
>     already tried to do), or ignored errors.
> 
>     xenbus_switch_state() may fail because:
> 
>     a) The device is being unplugged by the toolstack. The device will
>     shortly be removed and the error does not need to be handled.
> 
>     b) Xenstore is broken.  There isn't much the driver can do in this
>     case since xenstore is required to signal failure to the toolstack.
> 
>     So, don't report any errors from xenbus_switch_state() which removes
>     some unnecessary error handling in some of the drivers.
> 
> I'd appreciate a review from some of the other front/backend driver
> maintainers on whether this is sensible reasoning.

Done that but I am not too keen about this patch - as I think it will
cause memory leaks on failure paths.

> 
> David
> 
> > 
> > And also need change the related comments for xenbus_switch_state().
> > 
> > Signed-off-by: Chen Gang <gang.chen.5i5j@xxxxxxxxx>
> > ---
> >  drivers/block/xen-blkback/xenbus.c |  9 ++-------
> >  drivers/net/xen-netback/xenbus.c   |  5 +----
> >  drivers/pci/xen-pcifront.c         | 15 ++++++---------
> >  drivers/xen/xen-pciback/xenbus.c   | 21 ++++-----------------
> >  drivers/xen/xen-scsiback.c         |  5 +----
> >  drivers/xen/xenbus/xenbus_client.c | 16 ++++++++--------
> >  include/xen/xenbus.h               |  3 ++-
> >  7 files changed, 24 insertions(+), 50 deletions(-)
> > 
> > diff --git a/drivers/block/xen-blkback/xenbus.c 
> > b/drivers/block/xen-blkback/xenbus.c
> > index 3a8b810..fdcc584 100644
> > --- a/drivers/block/xen-blkback/xenbus.c
> > +++ b/drivers/block/xen-blkback/xenbus.c
> > @@ -587,9 +587,7 @@ static int xen_blkbk_probe(struct xenbus_device *dev,
> >     if (err)
> >             goto fail;
> >  
> > -   err = xenbus_switch_state(dev, XenbusStateInitWait);
> > -   if (err)
> > -           goto fail;
> > +   xenbus_switch_state(dev, XenbusStateInitWait);
> >  
> >     return 0;
> >  
> > @@ -837,10 +835,7 @@ again:
> >     if (err)
> >             xenbus_dev_fatal(dev, err, "ending transaction");
> >  
> > -   err = xenbus_switch_state(dev, XenbusStateConnected);
> > -   if (err)
> > -           xenbus_dev_fatal(dev, err, "%s: switching to Connected state",
> > -                            dev->nodename);
> > +   xenbus_switch_state(dev, XenbusStateConnected);
> >  
> >     return;
> >   abort:
> > diff --git a/drivers/net/xen-netback/xenbus.c 
> > b/drivers/net/xen-netback/xenbus.c
> > index 9c47b89..b5c3d47 100644
> > --- a/drivers/net/xen-netback/xenbus.c
> > +++ b/drivers/net/xen-netback/xenbus.c
> > @@ -337,10 +337,7 @@ static int netback_probe(struct xenbus_device *dev,
> >     if (err)
> >             pr_debug("Error writing multi-queue-max-queues\n");
> >  
> > -   err = xenbus_switch_state(dev, XenbusStateInitWait);
> > -   if (err)
> > -           goto fail;
> > -
> > +   xenbus_switch_state(dev, XenbusStateInitWait);
> >     be->state = XenbusStateInitWait;
> >  
> >     /* This kicks hotplug scripts, so do it immediately. */
> > diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
> > index 53df39a..c1d73b7 100644
> > --- a/drivers/pci/xen-pcifront.c
> > +++ b/drivers/pci/xen-pcifront.c
> > @@ -901,18 +901,16 @@ static int pcifront_try_connect(struct 
> > pcifront_device *pdev)
> >             }
> >     }
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
> > -
> > +   xenbus_switch_state(pdev->xdev, XenbusStateConnected);
> > +   return 0;
> >  out:
> >     return err;
> >  }
> >  
> >  static int pcifront_try_disconnect(struct pcifront_device *pdev)
> >  {
> > -   int err = 0;
> >     enum xenbus_state prev_state;
> >  
> > -
> >     prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
> >  
> >     if (prev_state >= XenbusStateClosing)
> > @@ -923,11 +921,10 @@ static int pcifront_try_disconnect(struct 
> > pcifront_device *pdev)
> >             pcifront_disconnect(pdev);
> >     }
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateClosed);
> > +   xenbus_switch_state(pdev->xdev, XenbusStateClosed);
> >  
> >  out:
> > -
> > -   return err;
> > +   return 0;
> >  }
> >  
> >  static int pcifront_attach_devices(struct pcifront_device *pdev)
> > @@ -1060,8 +1057,8 @@ static int pcifront_detach_devices(struct 
> > pcifront_device *pdev)
> >                     domain, bus, slot, func);
> >     }
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateReconfiguring);
> > -
> > +   xenbus_switch_state(pdev->xdev, XenbusStateReconfiguring);
> > +   return 0;
> >  out:
> >     return err;
> >  }
> > diff --git a/drivers/xen/xen-pciback/xenbus.c 
> > b/drivers/xen/xen-pciback/xenbus.c
> > index c214daa..630a215 100644
> > --- a/drivers/xen/xen-pciback/xenbus.c
> > +++ b/drivers/xen/xen-pciback/xenbus.c
> > @@ -184,10 +184,7 @@ static int xen_pcibk_attach(struct xen_pcibk_device 
> > *pdev)
> >  
> >     dev_dbg(&pdev->xdev->dev, "Connecting...\n");
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
> > -   if (err)
> > -           xenbus_dev_fatal(pdev->xdev, err,
> > -                            "Error switching to connected state!");
> > +   xenbus_switch_state(pdev->xdev, XenbusStateConnected);
> >  
> >     dev_dbg(&pdev->xdev->dev, "Connected? %d\n", err);
> >  out:
> > @@ -500,12 +497,7 @@ static int xen_pcibk_reconfigure(struct 
> > xen_pcibk_device *pdev)
> >             }
> >     }
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
> > -   if (err) {
> > -           xenbus_dev_fatal(pdev->xdev, err,
> > -                            "Error switching to reconfigured state!");
> > -           goto out;
> > -   }
> > +   xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
> >  
> >  out:
> >     mutex_unlock(&pdev->dev_lock);
> > @@ -640,10 +632,7 @@ static int xen_pcibk_setup_backend(struct 
> > xen_pcibk_device *pdev)
> >             goto out;
> >     }
> >  
> > -   err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
> > -   if (err)
> > -           xenbus_dev_fatal(pdev->xdev, err,
> > -                            "Error switching to initialised state!");
> > +   xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
> >  
> >  out:
> >     mutex_unlock(&pdev->dev_lock);
> > @@ -683,9 +672,7 @@ static int xen_pcibk_xenbus_probe(struct xenbus_device 
> > *dev,
> >     }
> >  
> >     /* wait for xend to configure us */
> > -   err = xenbus_switch_state(dev, XenbusStateInitWait);
> > -   if (err)
> > -           goto out;
> > +   xenbus_switch_state(dev, XenbusStateInitWait);
> >  
> >     /* watch the backend node for backend configuration information */
> >     err = xenbus_watch_path(dev, dev->nodename, &pdev->be_watch,
> > diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
> > index ad11258..847bc9c 100644
> > --- a/drivers/xen/xen-scsiback.c
> > +++ b/drivers/xen/xen-scsiback.c
> > @@ -1225,10 +1225,7 @@ static int scsiback_probe(struct xenbus_device *dev,
> >     if (err)
> >             xenbus_dev_error(dev, err, "writing feature-sg-grant");
> >  
> > -   err = xenbus_switch_state(dev, XenbusStateInitWait);
> > -   if (err)
> > -           goto fail;
> > -
> > +   xenbus_switch_state(dev, XenbusStateInitWait);
> >     return 0;
> >  
> >  fail:
> > diff --git a/drivers/xen/xenbus/xenbus_client.c 
> > b/drivers/xen/xenbus/xenbus_client.c
> > index ca74410..e2bcd1d 100644
> > --- a/drivers/xen/xenbus/xenbus_client.c
> > +++ b/drivers/xen/xenbus/xenbus_client.c
> > @@ -166,7 +166,7 @@ EXPORT_SYMBOL_GPL(xenbus_watch_pathfmt);
> >  static void xenbus_switch_fatal(struct xenbus_device *, int, int,
> >                             const char *, ...);
> >  
> > -static int
> > +static void
> >  __xenbus_switch_state(struct xenbus_device *dev,
> >                   enum xenbus_state state, int depth)
> >  {
> > @@ -188,7 +188,7 @@ __xenbus_switch_state(struct xenbus_device *dev,
> >     int err, abort;
> >  
> >     if (state == dev->state)
> > -           return 0;
> > +           return;
> >  
> >  again:
> >     abort = 1;
> > @@ -196,7 +196,7 @@ again:
> >     err = xenbus_transaction_start(&xbt);
> >     if (err) {
> >             xenbus_switch_fatal(dev, depth, err, "starting transaction");
> > -           return 0;
> > +           return;
> >     }
> >  
> >     err = xenbus_scanf(xbt, dev->nodename, "state", "%d", &current_state);
> > @@ -219,7 +219,7 @@ abort:
> >     } else
> >             dev->state = state;
> >  
> > -   return 0;
> > +   return;
> >  }
> >  
> >  /**
> > @@ -228,12 +228,12 @@ abort:
> >   * @state: new state
> >   *
> >   * Advertise in the store a change of the given driver to the given 
> > new_state.
> > - * Return 0 on success, or -errno on error.  On error, the device will 
> > switch
> > - * to XenbusStateClosing, and the error will be saved in the store.
> > + * When failure occurs, it will call xenbus_switch_fatal() internally, so 
> > need
> > + * not return value to notify upper caller.
> >   */
> > -int xenbus_switch_state(struct xenbus_device *dev, enum xenbus_state state)
> > +void xenbus_switch_state(struct xenbus_device *dev, enum xenbus_state 
> > state)
> >  {
> > -   return __xenbus_switch_state(dev, state, 0);
> > +   __xenbus_switch_state(dev, state, 0);
> >  }
> >  
> >  EXPORT_SYMBOL_GPL(xenbus_switch_state);
> > diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h
> > index 0324c6d..587c53d 100644
> > --- a/include/xen/xenbus.h
> > +++ b/include/xen/xenbus.h
> > @@ -195,7 +195,8 @@ int xenbus_watch_pathfmt(struct xenbus_device *dev, 
> > struct xenbus_watch *watch,
> >                                       const char **, unsigned int),
> >                      const char *pathfmt, ...);
> >  
> > -int xenbus_switch_state(struct xenbus_device *dev, enum xenbus_state 
> > new_state);
> > +void xenbus_switch_state(struct xenbus_device *dev,
> > +                    enum xenbus_state new_state);
> >  int xenbus_grant_ring(struct xenbus_device *dev, unsigned long ring_mfn);
> >  int xenbus_map_ring_valloc(struct xenbus_device *dev,
> >                        int gnt_ref, void **vaddr);
> > 
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.