[PATCH 3/6] staging: unisys: visorbus: git rid of gotos in devmajorminor_create_file

Neil Horman nhorman at redhat.com
Wed Mar 9 18:48:14 UTC 2016


On Wed, Mar 09, 2016 at 05:10:28PM +0000, Sell, Timothy C wrote:
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman at redhat.com]
> > Sent: Wednesday, March 09, 2016 11:09 AM
> > To: external-ges-unisys at redhat.com
> > Cc: gregkh at linuxfoundation.org; driverdev-devel at linuxdriverproject.org;
> > *S-Par-Maintainer
> > Subject: Re: [PATCH 3/6] staging: unisys: visorbus: git rid of gotos in
> > devmajorminor_create_file
> > 
> > On Tue, Mar 08, 2016 at 08:22:45PM -0500, David Kershner wrote:
> > > The gotos in devmajorminor_create_file aren't needed, get rid of them.
> > >
> > > Signed-off-by: David Kershner <david.kershner at unisys.com>
> > > Signed-off-by: Timothy Sell <timothy.sell at unisys.com>
> > > ---
> > >  drivers/staging/unisys/visorbus/visorbus_main.c | 25 ++++++++-------------
> > ----
> > >  1 file changed, 8 insertions(+), 17 deletions(-)
> > >
> > > diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c
> > b/drivers/staging/unisys/visorbus/visorbus_main.c
> > > index e1ec0b8..37a60ec 100644
> > > --- a/drivers/staging/unisys/visorbus/visorbus_main.c
> > > +++ b/drivers/staging/unisys/visorbus/visorbus_main.c
> > > @@ -306,21 +306,17 @@ devmajorminor_create_file(struct visor_device
> > *dev, const char *name,
> > >  {
> > >  	int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev-
> > >devnodes[0]);
> > >  	struct devmajorminor_attribute *myattr = NULL;
> > > -	int x = -1, rc = 0, slot = -1;
> > > +	int x = -1, slot = -1;
> > >
> > >  	register_devmajorminor_attributes(dev);
> > >  	for (slot = 0; slot < maxdevnodes; slot++)
> > >  		if (!dev->devnodes[slot].attr)
> > >  			break;
> > > -	if (slot == maxdevnodes) {
> > > -		rc = -ENOMEM;
> > > -		goto away;
> > > -	}
> > > +	if (slot == maxdevnodes)
> > > +		return -ENOMEM;
> > >  	myattr = kzalloc(sizeof(*myattr), GFP_KERNEL);
> > > -	if (!myattr) {
> > > -		rc = -ENOMEM;
> > > -		goto away;
> > > -	}
> > > +	if (!myattr)
> > > +		return -ENOMEM;
> > >  	myattr->show = DEVMAJORMINOR_ATTR;
> > >  	myattr->store = NULL;
> > >  	myattr->slot = slot;
> > > @@ -331,17 +327,12 @@ devmajorminor_create_file(struct visor_device
> > *dev, const char *name,
> > >  	dev->devnodes[slot].minor = minor;
> > >  	x = sysfs_create_file(&dev->kobjdevmajorminor, &myattr->attr);
> > >  	if (x < 0) {
> > > -		rc = x;
> > > -		goto away;
> > > -	}
> > > -	kobject_uevent(&dev->device.kobj, KOBJ_ONLINE);
> > > -away:
> > > -	if (rc < 0) {
> > >  		kfree(myattr);
> > > -		myattr = NULL;
> > >  		dev->devnodes[slot].attr = NULL;
> > > +		return x;
> > >  	}
> > > -	return rc;
> > > +	kobject_uevent(&dev->device.kobj, KOBJ_ONLINE);
> > > +	return 0;
> > >  }
> > >
> > >  static void
> > > --
> > > 1.9.1
> > >
> > 
> > This problem wasn't introduced by this patch, but removing the gotos makes
> > it
> > harder to fix.  The first thing you do is call
> > register_devmajorminor_attributes, and if the code fails, you should really
> > unregister those.  What you really need to do is keep the label and gotos,
> > and
> > add an unregister call at the same place you use the kfree call
> > 
> > Neil
> 
> As part of our code audit to get this code out of staging,
> Dan Carpenter has expressed some criticims regarding our use of gotos,
> which included our use of vague label names like "away", and many places
> were we have a single exit-point for both success and failure exits.
> (I believe Dan has researched this and determined this practice to be
> error-prone.)  We have been attempting to clean these up, and as a result
> have found some places where it is cleaner to just remove the gotos
> altogether.  It looks like this was one of those places.
> 
ok, but I don't think dans criticism of your label names needs to translate into
a wholesale removal of goto statements.  Its very common practice to use (when
done appropriately). In fact, Documentation/CodingStyle has an entire chapter
(chapter 7) on the cetralization of function exit paths implemented with goto,
with very valid rationale, and I think Dan would agree with it.

Neil

> I see your point about register_devmajorminor_attributes, which is valid,
> but we just so-happen to have a subsequent patch that removes all
> of the devmajorminor stuff, as we don't really need that.  This was a
> result of criticism from Greg about our usages of "raw kobjects".
> 
> Tim Sell


More information about the devel mailing list