From patchwork Fri Jun 26 09:02:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 50336 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f197.google.com (mail-lb0-f197.google.com [209.85.217.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 2566522902 for ; Fri, 26 Jun 2015 09:04:45 +0000 (UTC) Received: by lbcak1 with SMTP id ak1sf24980978lbc.2 for ; Fri, 26 Jun 2015 02:04:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=oHIqC4rP0uqrAYWqsQMWULa2vnA/Dl8x0EAiCnCe2GI=; b=F2OyOEUdL6TZogHmIh9a/NveEO38DTlzvbIdaZvV9f06zqRAh/ACwfl9eLT3xqEu4Z IMi7mTpiVADdvL24E4XaNCHvkuK+mtmFFftx8g9GM9kL2IGGEZcWc6y0U2IpRfjPZrtb F/cKEhRkofR+G/Gum+ozWdde/Nv+SCpPaqho+mUr7oZo3iuZIZPBHPLrayaPgVkqfi9Y MPyiq8TQCTiiiwJuVzhp4rZUP8AGPGdCadcES0Up3iquer6uxzt82iGft8wMR+3tfsry MgO4y9YoxQghSiP/8Dmw6HvuAufo0FKTlcW8aTSthcsWyuz/RbrcQsTSL/dSAJQO0u3K 2aoA== X-Gm-Message-State: ALoCoQnjkBf6XxXaC/FxZJrGmd+sCuTj4/wxhjC3dGu6ZtZNHFHJXU3BDnWA6mXu4M6qs7VPNKq2 X-Received: by 10.112.219.200 with SMTP id pq8mr442873lbc.7.1435309483437; Fri, 26 Jun 2015 02:04:43 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.4.1 with SMTP id g1ls443637lag.46.gmail; Fri, 26 Jun 2015 02:04:43 -0700 (PDT) X-Received: by 10.152.3.97 with SMTP id b1mr620456lab.54.1435309483068; Fri, 26 Jun 2015 02:04:43 -0700 (PDT) Received: from mail-la0-f43.google.com (mail-la0-f43.google.com. [209.85.215.43]) by mx.google.com with ESMTPS id w6si8108387lag.171.2015.06.26.02.04.43 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 26 Jun 2015 02:04:43 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.43 as permitted sender) client-ip=209.85.215.43; Received: by lacny3 with SMTP id ny3so59638938lac.3 for ; Fri, 26 Jun 2015 02:04:43 -0700 (PDT) X-Received: by 10.152.7.7 with SMTP id f7mr604179laa.106.1435309482314; Fri, 26 Jun 2015 02:04:42 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1157670lbb; Fri, 26 Jun 2015 02:04:41 -0700 (PDT) X-Received: by 10.66.62.202 with SMTP id a10mr1362082pas.42.1435309480600; Fri, 26 Jun 2015 02:04:40 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e5si9040362pdf.100.2015.06.26.02.04.39; Fri, 26 Jun 2015 02:04:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752859AbbFZJEi (ORCPT + 2 others); Fri, 26 Jun 2015 05:04:38 -0400 Received: from mail-pd0-f182.google.com ([209.85.192.182]:35551 "EHLO mail-pd0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752115AbbFZJE0 (ORCPT ); Fri, 26 Jun 2015 05:04:26 -0400 Received: by pdbci14 with SMTP id ci14so71440761pdb.2 for ; Fri, 26 Jun 2015 02:04:25 -0700 (PDT) X-Received: by 10.68.131.65 with SMTP id ok1mr1369251pbb.16.1435309465078; Fri, 26 Jun 2015 02:04:25 -0700 (PDT) Received: from localhost ([122.167.134.127]) by mx.google.com with ESMTPSA id ud3sm32567033pbc.10.2015.06.26.02.04.23 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 26 Jun 2015 02:04:24 -0700 (PDT) From: Viresh Kumar To: gregkh@linuxfoundation.org Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Rafael Wysocki , pi-cheng.chen@linaro.org, Viresh Kumar , "3.3+" Subject: [PATCH] bus: subsys: propagate errors from subsys interface's ->add_dev() Date: Fri, 26 Jun 2015 14:32:47 +0530 Message-Id: X-Mailer: git-send-email 2.4.0 Sender: stable-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: stable@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: viresh.kumar@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.43 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , ->add_dev() may fail and the error returned from it can be useful for the caller. For example, if some of the resources aren't ready yet and -EPROBE_DEFER is returned from ->add_dev(), then the owner of 'struct subsys_interface' may want to try probing again at a later point of time. And that requires a proper return value from ->add_dev(). Also, if we hit an error while registering subsys_interface, then we should stop proceeding further and rollback whatever has been done until then. Break part of subsys_interface_unregister() into another routine, which lets us call ->remove_dev() for all devices for which ->add_dev() is already called. Cc: 3.3+ # 3.3+ Fixes: ca22e56debc5 ("driver-core: implement 'sysdev' functionality for regular devices and buses") Reported-and-tested-by: Pi-Cheng Chen Signed-off-by: Viresh Kumar --- drivers/base/bus.c | 55 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 79bc203f51ef..d92dc109ba51 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -1112,11 +1112,36 @@ void subsys_dev_iter_exit(struct subsys_dev_iter *iter) } EXPORT_SYMBOL_GPL(subsys_dev_iter_exit); +static void __subsys_interface_unregister(struct subsys_interface *sif, + struct device *lastdev) +{ + struct bus_type *subsys = sif->subsys; + struct subsys_dev_iter iter; + struct device *dev; + + mutex_lock(&subsys->p->mutex); + list_del_init(&sif->node); + if (sif->remove_dev) { + subsys_dev_iter_init(&iter, subsys, NULL, NULL); + while ((dev = subsys_dev_iter_next(&iter))) { + if (dev == lastdev) + break; + + sif->remove_dev(dev, sif); + } + subsys_dev_iter_exit(&iter); + } + mutex_unlock(&subsys->p->mutex); + + bus_put(subsys); +} + int subsys_interface_register(struct subsys_interface *sif) { struct bus_type *subsys; struct subsys_dev_iter iter; struct device *dev; + int ret = 0; if (!sif || !sif->subsys) return -ENODEV; @@ -1129,38 +1154,28 @@ int subsys_interface_register(struct subsys_interface *sif) list_add_tail(&sif->node, &subsys->p->interfaces); if (sif->add_dev) { subsys_dev_iter_init(&iter, subsys, NULL, NULL); - while ((dev = subsys_dev_iter_next(&iter))) - sif->add_dev(dev, sif); + while ((dev = subsys_dev_iter_next(&iter))) { + ret = sif->add_dev(dev, sif); + if (ret) + break; + } subsys_dev_iter_exit(&iter); } mutex_unlock(&subsys->p->mutex); - return 0; + if (ret) + __subsys_interface_unregister(sif, dev); + + return ret; } EXPORT_SYMBOL_GPL(subsys_interface_register); void subsys_interface_unregister(struct subsys_interface *sif) { - struct bus_type *subsys; - struct subsys_dev_iter iter; - struct device *dev; - if (!sif || !sif->subsys) return; - subsys = sif->subsys; - - mutex_lock(&subsys->p->mutex); - list_del_init(&sif->node); - if (sif->remove_dev) { - subsys_dev_iter_init(&iter, subsys, NULL, NULL); - while ((dev = subsys_dev_iter_next(&iter))) - sif->remove_dev(dev, sif); - subsys_dev_iter_exit(&iter); - } - mutex_unlock(&subsys->p->mutex); - - bus_put(subsys); + __subsys_interface_unregister(sif, NULL); } EXPORT_SYMBOL_GPL(subsys_interface_unregister);