From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932750AbcIENGY (ORCPT ); Mon, 5 Sep 2016 09:06:24 -0400 Received: from lb3-smtp-cloud6.xs4all.net ([194.109.24.31]:45144 "EHLO lb3-smtp-cloud6.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932461AbcIENGW (ORCPT ); Mon, 5 Sep 2016 09:06:22 -0400 Subject: Re: [PATCH v2] [media] v4l2-async: Always unregister the subdev on failure To: Alban Bedel , linux-media@vger.kernel.org References: <20160824134948.21607-1-alban.bedel@avionic-design.de> Cc: Mauro Carvalho Chehab , Javier Martinez Canillas , Sakari Ailus , linux-kernel@vger.kernel.org From: Hans Verkuil Message-ID: Date: Mon, 5 Sep 2016 15:06:14 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160824134948.21607-1-alban.bedel@avionic-design.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Alban, On 08/24/2016 03:49 PM, Alban Bedel wrote: > In v4l2_async_test_notify() if the registered_async callback or the > complete notifier returns an error the subdev is not unregistered. > This leave paths where v4l2_async_register_subdev() can fail but > leave the subdev still registered. > > Add the required calls to v4l2_device_unregister_subdev() to plug > these holes. This patch no longer applies after another patch from Javier was merged. Can you rebase and post a v3? Thanks! Hans > > Signed-off-by: Alban Bedel > --- > Changelog: > v2: * Added the missing unbind() calls as suggested by Javier. > --- > drivers/media/v4l2-core/v4l2-async.c | 29 +++++++++++++++++------------ > 1 file changed, 17 insertions(+), 12 deletions(-) > > diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c > index ceb28d47c3f9..abe512d0b4cb 100644 > --- a/drivers/media/v4l2-core/v4l2-async.c > +++ b/drivers/media/v4l2-core/v4l2-async.c > @@ -113,23 +113,28 @@ static int v4l2_async_test_notify(struct v4l2_async_notifier *notifier, > list_move(&sd->async_list, ¬ifier->done); > > ret = v4l2_device_register_subdev(notifier->v4l2_dev, sd); > - if (ret < 0) { > - if (notifier->unbind) > - notifier->unbind(notifier, sd, asd); > - return ret; > - } > + if (ret < 0) > + goto err_subdev_register; > > ret = v4l2_subdev_call(sd, core, registered_async); > - if (ret < 0 && ret != -ENOIOCTLCMD) { > - if (notifier->unbind) > - notifier->unbind(notifier, sd, asd); > - return ret; > + if (ret < 0 && ret != -ENOIOCTLCMD) > + goto err_subdev_call; > + > + if (list_empty(¬ifier->waiting) && notifier->complete) { > + ret = notifier->complete(notifier); > + if (ret < 0) > + goto err_subdev_call; > } > > - if (list_empty(¬ifier->waiting) && notifier->complete) > - return notifier->complete(notifier); > - > return 0; > + > +err_subdev_call: > + v4l2_device_unregister_subdev(sd); > +err_subdev_register: > + if (notifier->unbind) > + notifier->unbind(notifier, sd, asd); > + > + return ret; > } > > static void v4l2_async_cleanup(struct v4l2_subdev *sd) >