Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1594845ybv; Thu, 20 Feb 2020 23:58:16 -0800 (PST) X-Google-Smtp-Source: APXvYqwrsvbsvbiCEJrqJ+BGuNrFGc1WSqcDntZXAaY3yq6FqgZ+FXsbho6O393xjA3W6orJFE3K X-Received: by 2002:aca:1b11:: with SMTP id b17mr958643oib.45.1582271896064; Thu, 20 Feb 2020 23:58:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582271896; cv=none; d=google.com; s=arc-20160816; b=Tugt9dtkeJNzLfsXZFv2Kc9sEiP8xOQhj7RvQYirURPvExMD3BqavGHhwX8hlfCQ0u z5/2+Q/zhlShMP2oAQL9cXaufD06HDXb0X6bebfrAIxRI7O2ZNLyGwbxgpojZ0aVP0zj MLLvgzl+0GreQPEayAuEAwv/heTJTuJB5Jokmg8SOYfA1mgxsWVFBqqAXjpdbeLK2Emr o7460tUIBDt5KCmO69MuN2UkiFBX9tXEbmpv6q/sspJ9bQ0/BP3dIGGL6L9KDcEIlLf8 OsfJ86utPtiQpepL9PJBVysJr/A9BXvqf0LMDKlaxT6r+IC++9rLvdAErmo4Y87AMqwu 6ogw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SqSVza8+QSgnUH4J2VxzkSxt+5wcRP+tmKmO9t22dVQ=; b=L+1EuLEQAMQK/z9Cs5mF6T3VaU/huxkWKVli1DBFGwTI3ucJllupEQ1PmBGOHTMNPm Vcdi3MqSED3LUS8lPgcpjtE68ndHsYXWgzklcx47m+BPZJAeMksrLRGnICo0DabOs7jF C/tXXFFSDzSAlHKsoA/B+dV26wfrGVVVpSj2pkoKd2ZBzq+eRE3nI4UeC812lVUoQmns NlzN/CGnD74+wt/s4P+dckCM5tQKH2003IXTME902dqmRHccKhW9mbm8MkyREUeU32v1 7twoWlvDVhMWpWMVfw6tr8yatcdqOytx1muBw4/6WJENIAI9Cv79MZHglmRkoEFe8Cic C2jQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=c7USGFYH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v21si980240otj.282.2020.02.20.23.58.03; Thu, 20 Feb 2020 23:58:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=c7USGFYH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730722AbgBUH6C (ORCPT + 99 others); Fri, 21 Feb 2020 02:58:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:57706 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730551AbgBUH6B (ORCPT ); Fri, 21 Feb 2020 02:58:01 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 30B9620578; Fri, 21 Feb 2020 07:58:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582271880; bh=sjVY1Z5Q4dyM/6xX10VTEQpm72RuUKhACVpanJEy6kw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c7USGFYHk26hXVv1yHNvIjQHGvDhkvHJ1RRPESmEbeSFpDLGuYBhjvWO1zlJwoXuA uC4xifnrpVGGpZB6uAxyAAEw/FhGnGejTquaQia1Wu4qM3uVzrdq3bDXg1ZZEUfg72 +wN0JLPSqOwF/ag1jONSz461qdGKMDLB8sNgzSkk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Christoph Hellwig , Coly Li , Jens Axboe , Sasha Levin Subject: [PATCH 5.5 333/399] bcache: rework error unwinding in register_bcache Date: Fri, 21 Feb 2020 08:40:58 +0100 Message-Id: <20200221072433.446073031@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200221072402.315346745@linuxfoundation.org> References: <20200221072402.315346745@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Christoph Hellwig [ Upstream commit 50246693f81fe887f4db78bf7089051d7f1894cc ] Split the successful and error return path, and use one goto label for each resource to unwind. This also fixes some small errors like leaking the module reference count in the reboot case (which seems entirely harmless) or printing the wrong warning messages for early failures. Signed-off-by: Christoph Hellwig Signed-off-by: Coly Li Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/md/bcache/super.c | 75 +++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index a573ce1d85aae..bd2ae1d78fe15 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -2375,29 +2375,33 @@ static bool bch_is_open(struct block_device *bdev) static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, const char *buffer, size_t size) { - ssize_t ret = -EINVAL; - const char *err = "cannot allocate memory"; - char *path = NULL; - struct cache_sb *sb = NULL; + const char *err; + char *path; + struct cache_sb *sb; struct block_device *bdev = NULL; - struct page *sb_page = NULL; + struct page *sb_page; + ssize_t ret; + ret = -EBUSY; if (!try_module_get(THIS_MODULE)) - return -EBUSY; + goto out; /* For latest state of bcache_is_reboot */ smp_mb(); if (bcache_is_reboot) - return -EBUSY; + goto out_module_put; + ret = -ENOMEM; + err = "cannot allocate memory"; path = kstrndup(buffer, size, GFP_KERNEL); if (!path) - goto err; + goto out_module_put; sb = kmalloc(sizeof(struct cache_sb), GFP_KERNEL); if (!sb) - goto err; + goto out_free_path; + ret = -EINVAL; err = "failed to open device"; bdev = blkdev_get_by_path(strim(path), FMODE_READ|FMODE_WRITE|FMODE_EXCL, @@ -2414,57 +2418,68 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, if (!IS_ERR(bdev)) bdput(bdev); if (attr == &ksysfs_register_quiet) - goto quiet_out; + goto done; } - goto err; + goto out_free_sb; } err = "failed to set blocksize"; if (set_blocksize(bdev, 4096)) - goto err_close; + goto out_blkdev_put; err = read_super(sb, bdev, &sb_page); if (err) - goto err_close; + goto out_blkdev_put; err = "failed to register device"; if (SB_IS_BDEV(sb)) { struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); if (!dc) - goto err_close; + goto out_put_sb_page; mutex_lock(&bch_register_lock); ret = register_bdev(sb, sb_page, bdev, dc); mutex_unlock(&bch_register_lock); /* blkdev_put() will be called in cached_dev_free() */ - if (ret < 0) - goto err; + if (ret < 0) { + bdev = NULL; + goto out_put_sb_page; + } } else { struct cache *ca = kzalloc(sizeof(*ca), GFP_KERNEL); if (!ca) - goto err_close; + goto out_put_sb_page; /* blkdev_put() will be called in bch_cache_release() */ - if (register_cache(sb, sb_page, bdev, ca) != 0) - goto err; + if (register_cache(sb, sb_page, bdev, ca) != 0) { + bdev = NULL; + goto out_put_sb_page; + } } -quiet_out: - ret = size; -out: - if (sb_page) - put_page(sb_page); + + put_page(sb_page); +done: kfree(sb); kfree(path); module_put(THIS_MODULE); - return ret; - -err_close: - blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); -err: + return size; + +out_put_sb_page: + put_page(sb_page); +out_blkdev_put: + if (bdev) + blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); +out_free_sb: + kfree(sb); +out_free_path: + kfree(path); +out_module_put: + module_put(THIS_MODULE); +out: pr_info("error %s: %s", path, err); - goto out; + return ret; } -- 2.20.1