From patchwork Thu Aug 26 16:40:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460247 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCB48C432BE for ; Thu, 26 Aug 2021 16:42:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C47E360F39 for ; Thu, 26 Aug 2021 16:42:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243100AbhHZQnh (ORCPT ); Thu, 26 Aug 2021 12:43:37 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38058 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232835AbhHZQng (ORCPT ); Thu, 26 Aug 2021 12:43:36 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 4B7371FE58; Thu, 26 Aug 2021 16:42:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996168; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=s8CzQoWp/yYIArxuRsHWbcQjhbEj0/vo6cSvR8oo87c=; b=NAMdZ/EuNew3c52iV+roCJyAeqBPYzC58Y3WiBb2ve3yjyIbKeDlE8iFos+6vsU1CAINLI 7vJ3QkfMU/imXLcbSTsKAabIVYZk7E2Vya7BltCWvDyucOaV82Xej9whTvEMhmNSAMEukI UeTxEx+OmkDOUdwLbHecWlulQK/4fgI= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id F259D13B20; Thu, 26 Aug 2021 16:42:45 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id qHrHLoXEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:45 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 1/8] fs: btrfs: Introduce btrfs_for_each_slot Date: Thu, 26 Aug 2021 13:40:47 -0300 Message-Id: <20210826164054.14993-2-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org There is a common pattern when search for a key in btrfs: * Call btrfs_search_slot * Endless loop * If the found slot is bigger than the current items in the leaf, check the next one * If still not found in the next leaf, return 1 * Do something with the code * Increment current slot, and continue This pattern can be improved by creating an iterator macro, similar to those for_each_X already existing in the linux kernel. Using this approach means to reduce significantly boilerplate code, along making it easier to newcomers to understand how to code works. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/ctree.c | 28 ++++++++++++++++++++++++++++ fs/btrfs/ctree.h | 25 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 84627cbd5b5b..b1aa6e3987d0 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -2122,6 +2122,34 @@ int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key, return ret; } +/* Search for a valid slot for the given path. + * @root: The root node of the tree. + * @key: Will contain a valid item if found. + * @path: The start point to validate the slot. + * + * Return 0 if the item is valid, 1 if not found and < 0 if error. + */ +int btrfs_valid_slot(struct btrfs_root *root, struct btrfs_key *key, + struct btrfs_path *path) +{ + while (1) { + int ret; + const int slot = path->slots[0]; + const struct extent_buffer *leaf = path->nodes[0]; + + if (slot >= btrfs_header_nritems(leaf)) { + ret = btrfs_next_leaf(root, path); + if (ret) + return ret; + continue; + } + btrfs_item_key_to_cpu(leaf, key, slot); + break; + } + + return 0; +} + /* * adjust the pointers going up the tree, starting at level * making sure the right key of each node is points to 'key'. diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index f07c82fafa04..1e3c4a7741ca 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -2912,6 +2912,31 @@ int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key, struct btrfs_path *path); +int btrfs_valid_slot(struct btrfs_root *root, struct btrfs_key *key, + struct btrfs_path *path); + +/* Search in @root for a given @key, and store the slot found in @found_key. + * @root: The root node of the tree. + * @key: The key we are looking for. + * @found_key: Will hold the found item. + * @path: Holds the current slot/leaf. + * @iter_ret: Contains the returned value from btrfs_search_slot and + * btrfs_valid_slot, whatever is executed later. + * + * The iter_ret is an output variable that will contain the result of the + * btrfs_search_slot if it returns an error, or the value returned from + * btrfs_valid_slot otherwise. The return value can be 0 if the something was + * found, 1 if there weren't bigger leaves, and <0 if error. + */ +#define btrfs_for_each_slot(root, key, found_key, path, iter_ret) \ + for (iter_ret = btrfs_search_slot(NULL, root, key, path, 0, 0); \ + ( \ + iter_ret >= 0 && \ + (iter_ret = btrfs_valid_slot(root, found_key, path)) == 0 \ + ); \ + path->slots[0]++ \ + ) + static inline int btrfs_next_old_item(struct btrfs_root *root, struct btrfs_path *p, u64 time_seq) { From patchwork Thu Aug 26 16:40:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460245 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CABE1C4320A for ; Thu, 26 Aug 2021 16:42:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ADC466102A for ; Thu, 26 Aug 2021 16:42:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243114AbhHZQni (ORCPT ); Thu, 26 Aug 2021 12:43:38 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38066 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243106AbhHZQni (ORCPT ); Thu, 26 Aug 2021 12:43:38 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 3A8FD1FE58; Thu, 26 Aug 2021 16:42:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996170; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FTX6rOZiHdjmW9PHEniM14du06Yr497KPhWbg+ti1hM=; b=groNP+iRPKfNx3BqF5OXEO1sSz8s8R03tjzGSwbbWplxF4HGxwwXNc7rSqhSW+QiNzlxEP hd58ddOKLDTLCEEI+ycvbx7Whv3rBwsXlpjqrKpafXezPSITeyN0233i/MPOQsFhHbeZ16 tDl5kBbQhbLk0ZP7eo0NfAzpyjQNa3I= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BBCD113B20; Thu, 26 Aug 2021 16:42:48 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id cOt2HojEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:48 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 2/8] btrfs: block-group: use btrfs_for_each_slot in find_first_block_group Date: Thu, 26 Aug 2021 13:40:48 -0300 Message-Id: <20210826164054.14993-3-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the iterator like macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/block-group.c | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 1f8b06afbd03..0d999a3bfc84 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1654,38 +1654,15 @@ static int find_first_block_group(struct btrfs_fs_info *fs_info, struct btrfs_path *path, struct btrfs_key *key) { - struct btrfs_root *root = fs_info->extent_root; - int ret; struct btrfs_key found_key; - struct extent_buffer *leaf; - int slot; - - ret = btrfs_search_slot(NULL, root, key, path, 0, 0); - if (ret < 0) - return ret; - - while (1) { - slot = path->slots[0]; - leaf = path->nodes[0]; - if (slot >= btrfs_header_nritems(leaf)) { - ret = btrfs_next_leaf(root, path); - if (ret == 0) - continue; - if (ret < 0) - goto out; - break; - } - btrfs_item_key_to_cpu(leaf, &found_key, slot); + int ret; + btrfs_for_each_slot(fs_info->extent_root, key, &found_key, path, ret) { if (found_key.objectid >= key->objectid && - found_key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) { - ret = read_bg_from_eb(fs_info, &found_key, path); - break; - } - - path->slots[0]++; + found_key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) + return read_bg_from_eb(fs_info, &found_key, path); } -out: + return ret; } From patchwork Thu Aug 26 16:40:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460249 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EEB9BC432BE for ; Thu, 26 Aug 2021 16:43:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D2A7760F6F for ; Thu, 26 Aug 2021 16:43:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243126AbhHZQnp (ORCPT ); Thu, 26 Aug 2021 12:43:45 -0400 Received: from smtp-out1.suse.de ([195.135.220.28]:44424 "EHLO smtp-out1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243106AbhHZQnk (ORCPT ); Thu, 26 Aug 2021 12:43:40 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id D7E4A22208; Thu, 26 Aug 2021 16:42:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996171; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GftHQWxHc4ds/QciPzY+ZRPsVwPWIqYIbzR01JMbmYY=; b=dOMUY66zK5vM5FE0Wq8TV+PuxlREKyqiRmKxJqPXFBAHePmfsrf4Kh6KIzDCEm0cl8l0QH k9gr7ieCpzeeaDeGelTQUpe4ekhtrpah0ExHhRrVDyeTwri4UjClFgkaK+X8Yiy2Kvshvp QInKuphOFKD7l+4HI/5oT6Oyq9cOMI8= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BEF0B13B20; Thu, 26 Aug 2021 16:42:50 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id sA8sGYrEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:50 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 3/8] btrfs: dev-replace: Use btrfs_for_each_slot in mark_block_group_to_copy Date: Thu, 26 Aug 2021 13:40:49 -0300 Message-Id: <20210826164054.14993-4-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/dev-replace.c | 51 +++++++++--------------------------------- 1 file changed, 11 insertions(+), 40 deletions(-) diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index d029be40ea6f..6124f2e8e9f1 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c @@ -523,63 +523,34 @@ static int mark_block_group_to_copy(struct btrfs_fs_info *fs_info, key.type = BTRFS_DEV_EXTENT_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto free_path; - if (ret > 0) { - if (path->slots[0] >= - btrfs_header_nritems(path->nodes[0])) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto free_path; - if (ret > 0) { - ret = 0; - goto free_path; - } - } else { - ret = 0; - } - } - - while (1) { + btrfs_for_each_slot(root, &key, &found_key, path, ret) { struct extent_buffer *leaf = path->nodes[0]; - int slot = path->slots[0]; - - btrfs_item_key_to_cpu(leaf, &found_key, slot); - - if (found_key.objectid != src_dev->devid) - break; - if (found_key.type != BTRFS_DEV_EXTENT_KEY) + if (found_key.objectid != src_dev->devid || + found_key.type != BTRFS_DEV_EXTENT_KEY || + found_key.offset < key.offset) break; - if (found_key.offset < key.offset) - break; - - dev_extent = btrfs_item_ptr(leaf, slot, struct btrfs_dev_extent); + dev_extent = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_dev_extent); chunk_offset = btrfs_dev_extent_chunk_offset(leaf, dev_extent); cache = btrfs_lookup_block_group(fs_info, chunk_offset); if (!cache) - goto skip; + continue; spin_lock(&cache->lock); cache->to_copy = 1; spin_unlock(&cache->lock); btrfs_put_block_group(cache); - -skip: - ret = btrfs_next_item(root, path); - if (ret != 0) { - if (ret > 0) - ret = 0; - break; - } } -free_path: + /* Reset error if the key wasn't found. */ + if (ret > 0) + ret = 0; + btrfs_free_path(path); unlock: mutex_unlock(&fs_info->chunk_mutex); From patchwork Thu Aug 26 16:40:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460251 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF7D4C432BE for ; Thu, 26 Aug 2021 16:43:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D441A60F5B for ; Thu, 26 Aug 2021 16:43:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243036AbhHZQnz (ORCPT ); Thu, 26 Aug 2021 12:43:55 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38074 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243102AbhHZQnn (ORCPT ); Thu, 26 Aug 2021 12:43:43 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 7AC081FE58; Thu, 26 Aug 2021 16:42:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996174; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HcewAwXkTEy6MBkqxno1jMapsW5umEYUWtWsy9XfZkM=; b=ikAPQbU0pdBFoofLbEWzeLbQm4bzbWTnps5KA5VvqS8OySJdMbblCs9x0nA9ExXUQSZwu8 FnET6wimhD4fb7HiizS+38RRqkjGdA2jZHmKKcc+wVgkShbNfhhs8gZrjYicKmjKsSnKaH c0KxfifMPRp4IuHpbu2W3wPKIVl/IiI= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4824E13B20; Thu, 26 Aug 2021 16:42:52 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id OCznBIzEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:52 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 4/8] btrfs: dir-item: use btrfs_for_each_slot in btrfs_search_dir_index_item Date: Thu, 26 Aug 2021 13:40:50 -0300 Message-Id: <20210826164054.14993-5-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the iterator like macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/dir-item.c | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c index f1274d5c3805..10560663dae1 100644 --- a/fs/btrfs/dir-item.c +++ b/fs/btrfs/dir-item.c @@ -301,36 +301,15 @@ btrfs_search_dir_index_item(struct btrfs_root *root, struct btrfs_path *path, u64 dirid, const char *name, int name_len) { - struct extent_buffer *leaf; struct btrfs_dir_item *di; struct btrfs_key key; - u32 nritems; int ret; key.objectid = dirid; key.type = BTRFS_DIR_INDEX_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - return ERR_PTR(ret); - - leaf = path->nodes[0]; - nritems = btrfs_header_nritems(leaf); - - while (1) { - if (path->slots[0] >= nritems) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - return ERR_PTR(ret); - if (ret > 0) - break; - leaf = path->nodes[0]; - nritems = btrfs_header_nritems(leaf); - continue; - } - - btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); + btrfs_for_each_slot(root, &key, &key, path, ret) { if (key.objectid != dirid || key.type != BTRFS_DIR_INDEX_KEY) break; @@ -338,9 +317,9 @@ btrfs_search_dir_index_item(struct btrfs_root *root, name, name_len); if (di) return di; - - path->slots[0]++; } + if (ret < 0) + return ERR_PTR(ret); return NULL; } From patchwork Thu Aug 26 16:40:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460253 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF645C4320E for ; Thu, 26 Aug 2021 16:43:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BB37060F5B for ; Thu, 26 Aug 2021 16:43:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243136AbhHZQn6 (ORCPT ); Thu, 26 Aug 2021 12:43:58 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38084 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243123AbhHZQno (ORCPT ); Thu, 26 Aug 2021 12:43:44 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 315701FE6E; Thu, 26 Aug 2021 16:42:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996176; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h9QYK+LNyQ1V0iCtxp5yxOjvbViFVXFiwyZAcxAZa1M=; b=AbFb/CEX9V4w79TowkCYThszitOOI5NNIHf3zuHN4Up3QDPMv41TTXcWEms4whNfllF7qr pLNzVpENVnaEJfUg9YteDVzwEFTBpApOMsLhBT/SOc4oKOPgiuegJzTHL4Oq3dQnkibVSi MBFGgWMpOhZxZRZnCJlxYsji0eYh69g= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 06F6A13B20; Thu, 26 Aug 2021 16:42:54 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id EEoBLI7EJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:54 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 5/8] btrfs: inode: use btrfs_for_each_slot in btrfs_read_readdir Date: Thu, 26 Aug 2021 13:40:51 -0300 Message-Id: <20210826164054.14993-6-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/inode.c | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2aa9646bce56..12bee0107015 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6109,8 +6109,7 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx) struct list_head ins_list; struct list_head del_list; int ret; - struct extent_buffer *leaf; - int slot; + int iter_ret; char *name_ptr; int name_len; int entries = 0; @@ -6137,35 +6136,19 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx) key.offset = ctx->pos; key.objectid = btrfs_ino(BTRFS_I(inode)); - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto err; - - while (1) { + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { struct dir_entry *entry; + struct extent_buffer *leaf = path->nodes[0]; - leaf = path->nodes[0]; - slot = path->slots[0]; - if (slot >= btrfs_header_nritems(leaf)) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto err; - else if (ret > 0) - break; - continue; - } + if (found_key.objectid != key.objectid || + found_key.type != BTRFS_DIR_INDEX_KEY) + break; - btrfs_item_key_to_cpu(leaf, &found_key, slot); + if (found_key.offset < ctx->pos || + btrfs_should_delete_dir_index(&del_list, found_key.offset)) + continue; - if (found_key.objectid != key.objectid) - break; - if (found_key.type != BTRFS_DIR_INDEX_KEY) - break; - if (found_key.offset < ctx->pos) - goto next; - if (btrfs_should_delete_dir_index(&del_list, found_key.offset)) - goto next; - di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); + di = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dir_item); name_len = btrfs_dir_name_len(leaf, di); if ((total_len + sizeof(struct dir_entry) + name_len) >= PAGE_SIZE) { @@ -6192,9 +6175,14 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx) entries++; addr += sizeof(struct dir_entry) + name_len; total_len += sizeof(struct dir_entry) + name_len; -next: - path->slots[0]++; } + + /* Error found while searching. */ + if (iter_ret < 0) { + ret = iter_ret; + goto err; + } + btrfs_release_path(path); ret = btrfs_filldir(private->filldir_buf, entries, ctx); From patchwork Thu Aug 26 16:40:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 43D4DC432BE for ; Thu, 26 Aug 2021 16:43:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2A99860F6F for ; Thu, 26 Aug 2021 16:43:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243142AbhHZQn7 (ORCPT ); Thu, 26 Aug 2021 12:43:59 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38092 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243127AbhHZQnp (ORCPT ); Thu, 26 Aug 2021 12:43:45 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B0C561FE71; Thu, 26 Aug 2021 16:42:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996177; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JGf7j1PGQtnjKszBf1U/VVjtMGBhtQ4KVBrW3DzmsuI=; b=rUuwUZy/LaR0fHWR0Uw8xg5Y/2zXJmGE42dRdi6wwQkM5EwJBhtSUVgRN5WsOvzIln7Xvc 0vxj7Q6C1LtvuO6FWUbNbhMSRTQv/nL26UtJyPwrzWXrkLJzYwEOZXWS2QGJxa2MA2BJSG VU1piOsO1ePtseF4bv+nPb7aZQeQq60= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 8DF7913B20; Thu, 26 Aug 2021 16:42:56 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id aIzDFZDEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:56 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 6/8] btrfs: send: Use btrfs_for_each_slot macro Date: Thu, 26 Aug 2021 13:40:52 -0300 Message-Id: <20210826164054.14993-7-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This makes the code much simpler and smaller. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/send.c | 222 +++++++++++++----------------------------------- 1 file changed, 59 insertions(+), 163 deletions(-) diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index afdcbe7844e0..3e32886e171e 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -2647,6 +2647,7 @@ static int send_create_inode(struct send_ctx *sctx, u64 ino) */ static int did_create_dir(struct send_ctx *sctx, u64 dir) { + int iter_ret; int ret = 0; struct btrfs_path *path = NULL; struct btrfs_key key; @@ -2654,43 +2655,23 @@ static int did_create_dir(struct send_ctx *sctx, u64 dir) struct btrfs_key di_key; struct extent_buffer *eb; struct btrfs_dir_item *di; - int slot; path = alloc_path_for_send(); - if (!path) { - ret = -ENOMEM; - goto out; - } + if (!path) + return -ENOMEM; key.objectid = dir; key.type = BTRFS_DIR_INDEX_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, sctx->send_root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (1) { - eb = path->nodes[0]; - slot = path->slots[0]; - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(sctx->send_root, path); - if (ret < 0) { - goto out; - } else if (ret > 0) { - ret = 0; - break; - } - continue; - } - - btrfs_item_key_to_cpu(eb, &found_key, slot); + btrfs_for_each_slot(sctx->send_root, &key, &found_key, path, iter_ret) { if (found_key.objectid != key.objectid || found_key.type != key.type) { ret = 0; goto out; } - di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item); + eb = path->nodes[0]; + di = btrfs_item_ptr(eb, path->slots[0], struct btrfs_dir_item); btrfs_dir_item_key_to_cpu(eb, di, &di_key); if (di_key.type != BTRFS_ROOT_ITEM_KEY && @@ -2698,10 +2679,12 @@ static int did_create_dir(struct send_ctx *sctx, u64 dir) ret = 1; goto out; } - - path->slots[0]++; } + /* Only set ret if there was an error in the search. */ + if (iter_ret < 0) + ret = iter_ret; + out: btrfs_free_path(path); return ret; @@ -2905,6 +2888,7 @@ static void free_orphan_dir_info(struct send_ctx *sctx, static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, u64 send_progress) { + int iter_ret; int ret = 0; struct btrfs_root *root = sctx->parent_root; struct btrfs_path *path; @@ -2932,23 +2916,9 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, if (odi) key.offset = odi->last_dir_index_offset; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (1) { + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { struct waiting_dir_move *dm; - if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto out; - else if (ret > 0) - break; - continue; - } - btrfs_item_key_to_cpu(path->nodes[0], &found_key, - path->slots[0]); if (found_key.objectid != key.objectid || found_key.type != key.type) break; @@ -2984,8 +2954,13 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, goto out; } - path->slots[0]++; } + + if (iter_ret < 0) { + ret = iter_ret; + goto out; + } + free_orphan_dir_info(sctx, odi); ret = 1; @@ -3563,6 +3538,7 @@ static int is_ancestor(struct btrfs_root *root, struct fs_path *fs_path) { bool free_fs_path = false; + int iter_ret = 0; int ret = 0; struct btrfs_path *path = NULL; struct btrfs_key key; @@ -3584,26 +3560,12 @@ static int is_ancestor(struct btrfs_root *root, key.type = BTRFS_INODE_REF_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (true) { + btrfs_for_each_slot(root, &key, &key, path, iter_ret) { struct extent_buffer *leaf = path->nodes[0]; int slot = path->slots[0]; u32 cur_offset = 0; u32 item_size; - if (slot >= btrfs_header_nritems(leaf)) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto out; - if (ret > 0) - break; - continue; - } - - btrfs_item_key_to_cpu(leaf, &key, slot); if (key.objectid != ino2) break; if (key.type != BTRFS_INODE_REF_KEY && @@ -3641,8 +3603,13 @@ static int is_ancestor(struct btrfs_root *root, if (ret) goto out; } - path->slots[0]++; } + + if (iter_ret < 0) { + ret = iter_ret; + goto out; + } + ret = 0; out: btrfs_free_path(path); @@ -4524,13 +4491,12 @@ static int record_changed_ref(struct send_ctx *sctx) static int process_all_refs(struct send_ctx *sctx, enum btrfs_compare_tree_result cmd) { - int ret; + int iter_ret; + int ret = 0; struct btrfs_root *root; struct btrfs_path *path; struct btrfs_key key; struct btrfs_key found_key; - struct extent_buffer *eb; - int slot; iterate_inode_ref_t cb; int pending_move = 0; @@ -4554,24 +4520,7 @@ static int process_all_refs(struct send_ctx *sctx, key.objectid = sctx->cmp_key->objectid; key.type = BTRFS_INODE_REF_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (1) { - eb = path->nodes[0]; - slot = path->slots[0]; - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto out; - else if (ret > 0) - break; - continue; - } - - btrfs_item_key_to_cpu(eb, &found_key, slot); - + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { if (found_key.objectid != key.objectid || (found_key.type != BTRFS_INODE_REF_KEY && found_key.type != BTRFS_INODE_EXTREF_KEY)) @@ -4580,9 +4529,13 @@ static int process_all_refs(struct send_ctx *sctx, ret = iterate_inode_ref(root, path, &found_key, 0, cb, sctx); if (ret < 0) goto out; + } - path->slots[0]++; + if (iter_ret < 0) { + ret = iter_ret; + goto out; } + btrfs_release_path(path); /* @@ -4847,13 +4800,12 @@ static int process_changed_xattr(struct send_ctx *sctx) static int process_all_new_xattrs(struct send_ctx *sctx) { - int ret; + int iter_ret; + int ret = 0; struct btrfs_root *root; struct btrfs_path *path; struct btrfs_key key; struct btrfs_key found_key; - struct extent_buffer *eb; - int slot; path = alloc_path_for_send(); if (!path) @@ -4864,39 +4816,18 @@ static int process_all_new_xattrs(struct send_ctx *sctx) key.objectid = sctx->cmp_key->objectid; key.type = BTRFS_XATTR_ITEM_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (1) { - eb = path->nodes[0]; - slot = path->slots[0]; - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) { - goto out; - } else if (ret > 0) { - ret = 0; - break; - } - continue; - } - - btrfs_item_key_to_cpu(eb, &found_key, slot); + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { if (found_key.objectid != key.objectid || - found_key.type != key.type) { - ret = 0; - goto out; - } + found_key.type != key.type) + break; ret = iterate_dir_item(root, path, __process_new_xattr, sctx); if (ret < 0) - goto out; - - path->slots[0]++; + break; } + if (iter_ret < 0) + ret = iter_ret; -out: btrfs_free_path(path); return ret; } @@ -5938,13 +5869,12 @@ static int process_extent(struct send_ctx *sctx, static int process_all_extents(struct send_ctx *sctx) { - int ret; + int iter_ret; + int ret = 0; struct btrfs_root *root; struct btrfs_path *path; struct btrfs_key key; struct btrfs_key found_key; - struct extent_buffer *eb; - int slot; root = sctx->send_root; path = alloc_path_for_send(); @@ -5954,40 +5884,19 @@ static int process_all_extents(struct send_ctx *sctx) key.objectid = sctx->cmp_key->objectid; key.type = BTRFS_EXTENT_DATA_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - while (1) { - eb = path->nodes[0]; - slot = path->slots[0]; - - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(root, path); - if (ret < 0) { - goto out; - } else if (ret > 0) { - ret = 0; - break; - } - continue; - } - - btrfs_item_key_to_cpu(eb, &found_key, slot); - + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { if (found_key.objectid != key.objectid || - found_key.type != key.type) { - ret = 0; + found_key.type != key.type) goto out; - } ret = process_extent(sctx, path, &found_key); if (ret < 0) goto out; - - path->slots[0]++; } + if (iter_ret < 0) + ret = iter_ret; + out: btrfs_free_path(path); return ret; @@ -6180,36 +6089,20 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) struct btrfs_path *path; struct btrfs_key key; struct parent_paths_ctx ctx; - int ret; + int iter_ret; + int ret = 0; path = alloc_path_for_send(); if (!path) return -ENOMEM; - key.objectid = sctx->cur_ino; - key.type = BTRFS_INODE_REF_KEY; - key.offset = 0; - ret = btrfs_search_slot(NULL, sctx->parent_root, &key, path, 0, 0); - if (ret < 0) - goto out; - ctx.refs = &deleted_refs; ctx.sctx = sctx; - while (true) { - struct extent_buffer *eb = path->nodes[0]; - int slot = path->slots[0]; - - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(sctx->parent_root, path); - if (ret < 0) - goto out; - else if (ret > 0) - break; - continue; - } - - btrfs_item_key_to_cpu(eb, &key, slot); + key.objectid = sctx->cur_ino; + key.type = BTRFS_INODE_REF_KEY; + key.offset = 0; + btrfs_for_each_slot(sctx->parent_root, &key, &key, path, iter_ret) { if (key.objectid != sctx->cur_ino) break; if (key.type != BTRFS_INODE_REF_KEY && @@ -6220,8 +6113,11 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) record_parent_ref, &ctx); if (ret < 0) goto out; + } - path->slots[0]++; + if (iter_ret < 0) { + ret = iter_ret; + goto out; } while (!list_empty(&deleted_refs)) { From patchwork Thu Aug 26 16:40:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460257 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1DFBC4320E for ; Thu, 26 Aug 2021 16:43:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B936960FC0 for ; Thu, 26 Aug 2021 16:43:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243128AbhHZQoA (ORCPT ); Thu, 26 Aug 2021 12:44:00 -0400 Received: from smtp-out1.suse.de ([195.135.220.28]:44436 "EHLO smtp-out1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243133AbhHZQnt (ORCPT ); Thu, 26 Aug 2021 12:43:49 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 3D64622208; Thu, 26 Aug 2021 16:42:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996179; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=s7sfQD0oPGjiuW1/FkTs2WuclO+efJ7n5/7JRX7g3bI=; b=gbA1HX553FuuFgSo5qH/gOjmeDBsDu8IIIXIY8+iX2qTuJu9J9cGvzfjcvrKjcpGo0gs/y KhQIKiRzFGItgOomiMyE2ap07eA74J1GQFyqs5WojWLdH0Rf+Xl1pU5rJq+IRF03DphZFw iFxEHEmpqRSAPlrCJDhGz4jgxbdEZeY= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 218C413B20; Thu, 26 Aug 2021 16:42:57 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 8GzBNpHEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:57 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 7/8] btrfs: volumes: use btrfs_for_each_slot in btrfs_read_chunk_tree Date: Thu, 26 Aug 2021 13:40:53 -0300 Message-Id: <20210826164054.14993-8-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the iterator like macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/volumes.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index d72e4e3e02b1..998838ac106c 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -7428,8 +7428,9 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info) struct extent_buffer *leaf; struct btrfs_key key; struct btrfs_key found_key; - int ret; int slot; + int iter_ret; + int ret = 0; u64 total_dev = 0; u64 last_ra_node = 0; @@ -7460,22 +7461,12 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info) key.objectid = BTRFS_DEV_ITEMS_OBJECTID; key.offset = 0; key.type = 0; - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto error; - while (1) { + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { struct extent_buffer *node; leaf = path->nodes[0]; slot = path->slots[0]; - if (slot >= btrfs_header_nritems(leaf)) { - ret = btrfs_next_leaf(root, path); - if (ret == 0) - continue; - if (ret < 0) - goto error; - break; - } + /* * The nodes on level 1 are not locked but we don't need to do * that during mount time as nothing else can access the tree @@ -7513,7 +7504,11 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info) if (ret) goto error; } - path->slots[0]++; + } + + if (iter_ret < 0) { + ret = iter_ret; + goto error; } /* From patchwork Thu Aug 26 16:40:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Paulo de Souza X-Patchwork-Id: 12460259 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7FF2FC43214 for ; Thu, 26 Aug 2021 16:43:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 68F3D60F6F for ; Thu, 26 Aug 2021 16:43:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243133AbhHZQoA (ORCPT ); Thu, 26 Aug 2021 12:44:00 -0400 Received: from smtp-out2.suse.de ([195.135.220.29]:38100 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243135AbhHZQnt (ORCPT ); Thu, 26 Aug 2021 12:43:49 -0400 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id BFAF31FE95; Thu, 26 Aug 2021 16:43:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1629996180; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GOpOaHwibazhuWAgBwQn2kWcDPEOrE8UJJ0Xd2oPoaE=; b=IQmm2R3lEgzEOMBRhPCOv2Nx1sZ2tVSIJk3pIwacEVq3gKAGLUVhxFMajzYI3umD6zZMmO Q3Tqrh7kApTobkScwT4jEpzohB0oMADP0EJ8/Wr6CVB36gdxE2+0kodPAZRF64Oq5pF6t0 JVBEoocYs5DoG3H0kEvxvq7IaA50hNM= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id A3C2713B20; Thu, 26 Aug 2021 16:42:59 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id EDnYGpPEJ2EVIQAAMHmgww (envelope-from ); Thu, 26 Aug 2021 16:42:59 +0000 From: Marcos Paulo de Souza To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com, Marcos Paulo de Souza Subject: [PATCH 8/8] btrfs: xattr: Use btrfs_for_each_slot macro in btrfs_listxattr Date: Thu, 26 Aug 2021 13:40:54 -0300 Message-Id: <20210826164054.14993-9-mpdesouza@suse.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826164054.14993-1-mpdesouza@suse.com> References: <20210826164054.14993-1-mpdesouza@suse.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The function can be simplified by using the iterator like macro. No functional changes. Signed-off-by: Marcos Paulo de Souza --- fs/btrfs/xattr.c | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 8a4514283a4b..f85febba1891 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c @@ -274,10 +274,12 @@ int btrfs_setxattr_trans(struct inode *inode, const char *name, ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) { struct btrfs_key key; + struct btrfs_key found_key; struct inode *inode = d_inode(dentry); struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_path *path; int ret = 0; + int iter_ret = 0; size_t total_size = 0, size_left = size; /* @@ -295,44 +297,22 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) path->reada = READA_FORWARD; /* search for our xattrs */ - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto err; - - while (1) { + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { struct extent_buffer *leaf; int slot; struct btrfs_dir_item *di; - struct btrfs_key found_key; u32 item_size; u32 cur; leaf = path->nodes[0]; slot = path->slots[0]; - /* this is where we start walking through the path */ - if (slot >= btrfs_header_nritems(leaf)) { - /* - * if we've reached the last slot in this leaf we need - * to go to the next leaf and reset everything - */ - ret = btrfs_next_leaf(root, path); - if (ret < 0) - goto err; - else if (ret > 0) - break; - continue; - } - - btrfs_item_key_to_cpu(leaf, &found_key, slot); - /* check to make sure this item is what we want */ - if (found_key.objectid != key.objectid) - break; - if (found_key.type > BTRFS_XATTR_ITEM_KEY) + if (found_key.objectid != key.objectid || + found_key.type > BTRFS_XATTR_ITEM_KEY) break; if (found_key.type < BTRFS_XATTR_ITEM_KEY) - goto next_item; + continue; di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); item_size = btrfs_item_size_nr(leaf, slot); @@ -365,9 +345,13 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) cur += this_len; di = (struct btrfs_dir_item *)((char *)di + this_len); } -next_item: - path->slots[0]++; } + + if (iter_ret < 0) { + ret = iter_ret; + goto err; + } + ret = total_size; err: