From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932338AbbIYPPs (ORCPT ); Fri, 25 Sep 2015 11:15:48 -0400 Received: from mail-wi0-f179.google.com ([209.85.212.179]:37184 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932227AbbIYPPq (ORCPT ); Fri, 25 Sep 2015 11:15:46 -0400 Date: Fri, 25 Sep 2015 17:15:43 +0200 From: Thierry Reding To: Jani Nikula Cc: dri-devel@lists.freedesktop.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/6] driver-core: platform: Provide helpers for multi-driver modules Message-ID: <20150925151543.GC22463@ulmo> References: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> <87wpven69b.fsf@intel.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="96YOpH+ONegL0A3E" Content-Disposition: inline In-Reply-To: <87wpven69b.fsf@intel.com> User-Agent: Mutt/1.5.23+102 (2ca89bed6448) (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --96YOpH+ONegL0A3E Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Sep 25, 2015 at 01:27:28PM +0300, Jani Nikula wrote: > On Thu, 24 Sep 2015, Thierry Reding wrote: [...] > > diff --git a/drivers/base/platform.c b/drivers/base/platform.c [...] > > +/** > > + * platform_register_drivers - register an array of platform drivers > > + * @drivers: an array of drivers to register > > + * @count: the number of drivers to register > > + * > > + * Registers platform drivers specified by an array. On failure to reg= ister a > > + * driver, all previously registered drivers will be unregistered. Cal= lers of > > + * this API should use platform_unregister_drivers() to unregister dri= vers in > > + * the reverse order. > > + * > > + * Returns: 0 on success or a negative error code on failure. > > + */ > > +int platform_register_drivers(struct platform_driver * const *drivers, > > + unsigned int count) > > +{ > > + unsigned int i; > > + int err; > > + > > + for (i =3D 0; i < count; i++) { > > + pr_debug("registering platform driver %ps\n", drivers[i]); > > + > > + err =3D platform_driver_register(drivers[i]); > > + if (err < 0) { > > + pr_err("failed to register platform driver %ps: %d\n", > > + drivers[i], err); > > + goto error; > > + } > > + } > > + > > + return 0; > > + > > +error: > > + while (i--) { > > + pr_debug("unregistering platform driver %ps\n", drivers[i]); > > + platform_driver_unregister(drivers[i]); > > + } >=20 > This will call platform_driver_unregister() on the driver that failed, > but not the first driver. >=20 > You should probably make i an int, and use while (--i >=3D 0). Actually it won't. I was especially careful and even tested this with one driver by instrumenting platform_driver_register() to return failure at various points in the sequence. This works fine. Thierry --96YOpH+ONegL0A3E Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJWBWUdAAoJEN0jrNd/PrOh3NoP/1Atp7kQAHesX1kuBrnUUkSK yVTo0fySCOL1fao401Z0avLF2CExxHSLHRZQldksgfhen9IeB/pDPK1r21IuPYuT D06IBkNuPI3dQnMtIrwBGGjziaRoUF9q8YbYDk6SnPWOlnCKBiT9njtxpugVUFG7 ZIkcgcZGTdO3xBkPJj4/k9Uu3lYN3XmJt4eqY4ScDBVxPvl1pN+zn1+GDvv6Fstc RfNh+rMoGIszPvzC/CHETvPE/cjneP7lDmLnL/lXoCkdhACxQ9rt974ynX0O01ow rQV+yUo/tITuGk9nVkXMoGz1FWijExtVIHTVDKfcvtvRP9UpXO2ulsu0JKdXG9nD lcxjauw64ubULlLCse8ArO185ormE/f8vd0Qrwv/FkscxtJ3swfCyMxni7VgpdCa vdml9eX4WmIrUsHQzcOy68sC20ZZPHuDkUdnGxxT9Qo5wm9ZWfpvru5l93zz9ivu EEj3RidmCqXDd5BtjMrquMMSX6+Q5qmlAD68ENg8MxYQitZM3EB4fibrB5HmUj4y Ycl4Zv49X+G/1xw8QIbJHXRTadwosU/8XIVrJOBjNyptQU4fbp8Lc90kn9h00u57 I+ydwQv8ieKtSuAKQ+MT8Rv+PRYq3xgmMTTDIj/Z2wQGQKRoFslT7FaSDDc7+UKw Af7hQwT9II4JtAjsQbkA =Bvwu -----END PGP SIGNATURE----- --96YOpH+ONegL0A3E--