From patchwork Mon Sep 11 06:36:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 9946705 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 011AC603F3 for ; Mon, 11 Sep 2017 06:36:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E90DA26B41 for ; Mon, 11 Sep 2017 06:36:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DCAC528AE7; Mon, 11 Sep 2017 06:36:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8353326B41 for ; Mon, 11 Sep 2017 06:36:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750992AbdIKGge (ORCPT ); Mon, 11 Sep 2017 02:36:34 -0400 Received: from mout.gmx.net ([212.227.15.15]:65416 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750878AbdIKGg0 (ORCPT ); Mon, 11 Sep 2017 02:36:26 -0400 Received: from localhost.localdomain ([45.32.39.184]) by mail.gmx.com (mrgmx002 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MfEMs-1e6DcQ1N8M-00OlPY; Mon, 11 Sep 2017 08:36:25 +0200 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.cz Subject: [PATCH v2 5/7] btrfs-progs: Avoid BUG_ON for chunk allocation when ENOSPC happens Date: Mon, 11 Sep 2017 15:36:10 +0900 Message-Id: <20170911063612.32114-6-quwenruo.btrfs@gmx.com> X-Mailer: git-send-email 2.13.3 In-Reply-To: <20170911063612.32114-1-quwenruo.btrfs@gmx.com> References: <20170911063612.32114-1-quwenruo.btrfs@gmx.com> X-Provags-ID: V03:K0:ewcZB/XAv3JV1yutCc1kmMPStsqmupTb4COfpA/zMI7ZD2gnZzi 9hBwWIcJ6nQY57ImDonz6tEkxtWHbTj95NL0PwMlFd7m/6i+Vh8MUJxrIqsL7jx/KrdcVYz igm+1K99G8Dgr9vZRJ0I7060PjCD8ORndjHqTM//UrUf16ZoRv1aFXGMglHRid+lctKOJtl hnaj7XK4kimKXXY317dww== X-UI-Out-Filterresults: notjunk:1; V01:K0:xMaU2ex8o5Y=:gbRxHMYxCwnbPw9Zu7v/KE gc2zYohZ3kxfHRxDz4yvqTdTgwaDsXX/QkhDDhmgaw6mrPnYtaThH/s0aCccFahYRBqGY2FQI gfkPnIYGmhqX//G1RqFlMnzmnokzqzyt41TACWspC1/GVsBXqDmRiogC4gnNsI9HvDz6wEVp6 +JrdEqVTzE7uwnXVGn7SgcqW8gVQcvxwEsmR/hmGMYHqLNQfIhkX3jz1U7xr0t5qCjkEHIgmT HYoxReCj4dwNh7YswOyZRkLljwpSec/blJgvHwqAcGGgUP+juWlQPM4Lr7x5vj0FXfx5/CSgu thhZOZvYM0U2P01EsWj6vL2ZrY95Y3xALRz3HTNJyk/7lQFDgZDOOaNZl5jcvKu6XAyq+cvRb dBFVqw+xIm+v6APWTtI4Z7Bf5mfJQXAbBbjIR0Cbo1fEGKQM+CR4Xt37EMwLkVg819DycFMRB AOAa5S1Mcp4+gNr2PPFKvG0ulLLRNiSVlOhqJZcxwM8MLKJZTTb3PLHFYDE9FMSC6r9VbaicP tL3WcC9Aj2BrYjezkrFgZ3xlZqm5nmugA8iNKRojEGbEVNQqbQH2CnwwQ3djcHCkNBdBWwyhj b+WkyaMbRwd6jPsdD/N/k4qUD+/KNnrN7ANT6LaqTzfZNnM0A26RfXkM64FPCN3v9FrHVIwpw MdVNqGfd/RQHvWF/JFUVZ6CMLX2jrM2mD1usmlRW3/deb9Ipijoej1bw67Nzhaa3jJfZkTDA8 CIlKE7aG1Qa23EuTlML2+lCpzEnGiTr5U7QkRDDN0d78zU9nr+KNhJJf3hozIcafppqGNSEhn 2g4yQbLdv0GH8YSVet9v5PtB0i1HQ== Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When passing directory larger than block device using --rootdir parameter, we get the following backtrace: ------ extent-tree.c:2693: btrfs_reserve_extent: BUG_ON `ret` triggered, value -28 ./mkfs.btrfs(+0x1a05d)[0x557939e6b05d] ./mkfs.btrfs(btrfs_reserve_extent+0xb5a)[0x557939e710c8] ./mkfs.btrfs(+0xb0b6)[0x557939e5c0b6] ./mkfs.btrfs(main+0x15d5)[0x557939e5de04] /usr/lib/libc.so.6(__libc_start_main+0xea)[0x7f83b101af6a] ./mkfs.btrfs(_start+0x2a)[0x557939e5af5a] ------ Nothing special, just BUG_ON() abusing from ancient code. Fix them by using correct return. Signed-off-by: Qu Wenruo --- extent-tree.c | 3 ++- volumes.c | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/extent-tree.c b/extent-tree.c index 525a237e..055582c3 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -2690,7 +2690,8 @@ int btrfs_reserve_extent(struct btrfs_trans_handle *trans, search_start, search_end, hint_byte, ins, trans->alloc_exclude_start, trans->alloc_exclude_nr, data); - BUG_ON(ret); + if (ret < 0) + return ret; clear_extent_dirty(&info->free_space_cache, ins->objectid, ins->objectid + ins->offset - 1); return ret; diff --git a/volumes.c b/volumes.c index 2209e5a9..e1ee27d5 100644 --- a/volumes.c +++ b/volumes.c @@ -1032,11 +1032,13 @@ again: info->chunk_root->root_key.objectid, BTRFS_FIRST_CHUNK_TREE_OBJECTID, key.offset, calc_size, &dev_offset, 0); - BUG_ON(ret); + if (ret < 0) + goto out_chunk_map; device->bytes_used += calc_size; ret = btrfs_update_device(trans, device); - BUG_ON(ret); + if (ret < 0) + goto out_chunk_map; map->stripes[index].dev = device; map->stripes[index].physical = dev_offset; @@ -1075,16 +1077,24 @@ again: map->ce.size = *num_bytes; ret = insert_cache_extent(&info->mapping_tree.cache_tree, &map->ce); - BUG_ON(ret); + if (ret < 0) + goto out_chunk_map; if (type & BTRFS_BLOCK_GROUP_SYSTEM) { ret = btrfs_add_system_chunk(info, &key, chunk, btrfs_chunk_item_size(num_stripes)); - BUG_ON(ret); + if (ret < 0) + goto out_chunk; } kfree(chunk); return ret; + +out_chunk_map: + kfree(map); +out_chunk: + kfree(chunk); + return ret; } /*