From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH 08/32] btrfs: extent_io: sink less common parameters for __set_extent_bit()
Date: Tue, 3 Nov 2020 21:30:44 +0800 [thread overview]
Message-ID: <20201103133108.148112-9-wqu@suse.com> (raw)
In-Reply-To: <20201103133108.148112-1-wqu@suse.com>
For __set_extent_bit(), those parameter are less common for most
callers:
- exclusive_bits
- failed_start
Mostly for extent locking.
- extent_changeset
For qgroup usage.
As a common design principle, less common parameters should have their
default values and only callers really need them will set the parameters
to non-default values.
Sink those parameters into a new structure, extent_io_extra_options.
So most callers won't bother those less used parameters, and make later
expansion easier.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
fs/btrfs/extent-io-tree.h | 22 ++++++++++++++
fs/btrfs/extent_io.c | 61 ++++++++++++++++++++++++---------------
2 files changed, 59 insertions(+), 24 deletions(-)
diff --git a/fs/btrfs/extent-io-tree.h b/fs/btrfs/extent-io-tree.h
index cab4273ff8d3..c93065794567 100644
--- a/fs/btrfs/extent-io-tree.h
+++ b/fs/btrfs/extent-io-tree.h
@@ -82,6 +82,28 @@ struct extent_state {
#endif
};
+/*
+ * Extra options for extent io tree operations.
+ *
+ * All of these options are initialized to 0/false/NULL by default,
+ * and most callers should utilize the wrappers other than the extra options.
+ */
+struct extent_io_extra_options {
+ /*
+ * For __set_extent_bit(), to return -EEXIST when hit an extent with
+ * @excl_bits set, and update @excl_failed_start.
+ * Utizlied by EXTENT_LOCKED wrappers.
+ */
+ u32 excl_bits;
+ u64 excl_failed_start;
+
+ /*
+ * For __set/__clear_extent_bit() to record how many bytes is modified.
+ * For qgroup related functions.
+ */
+ struct extent_changeset *changeset;
+};
+
int __init extent_state_cache_init(void);
void __cold extent_state_cache_exit(void);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index a90cdcf01b7f..1fd92815553d 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -29,6 +29,7 @@ static struct kmem_cache *extent_state_cache;
static struct kmem_cache *extent_buffer_cache;
static struct bio_set btrfs_bioset;
+static struct extent_io_extra_options default_opts = { 0 };
static inline bool extent_state_in_tree(const struct extent_state *state)
{
return !RB_EMPTY_NODE(&state->rb_node);
@@ -952,10 +953,10 @@ static void cache_state(struct extent_state *state,
}
/*
- * set some bits on a range in the tree. This may require allocations or
+ * Set some bits on a range in the tree. This may require allocations or
* sleeping, so the gfp mask is used to indicate what is allowed.
*
- * If any of the exclusive bits are set, this will fail with -EEXIST if some
+ * If *any* of the exclusive bits are set, this will fail with -EEXIST if some
* part of the range already has the desired bits set. The start of the
* existing range is returned in failed_start in this case.
*
@@ -964,26 +965,30 @@ static void cache_state(struct extent_state *state,
static int __must_check
__set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
- unsigned bits, unsigned exclusive_bits,
- u64 *failed_start, struct extent_state **cached_state,
- gfp_t mask, struct extent_changeset *changeset)
+ unsigned bits, struct extent_state **cached_state,
+ gfp_t mask, struct extent_io_extra_options *extra_opts)
{
struct extent_state *state;
struct extent_state *prealloc = NULL;
struct rb_node *node;
struct rb_node **p;
struct rb_node *parent;
+ struct extent_changeset *changeset;
int err = 0;
+ u32 exclusive_bits;
+ u64 *failed_start;
u64 last_start;
u64 last_end;
btrfs_debug_check_extent_io_range(tree, start, end);
trace_btrfs_set_extent_bit(tree, start, end - start + 1, bits);
- if (exclusive_bits)
- ASSERT(failed_start);
- else
- ASSERT(failed_start == NULL);
+ if (!extra_opts)
+ extra_opts = &default_opts;
+ exclusive_bits = extra_opts->excl_bits;
+ failed_start = &extra_opts->excl_failed_start;
+ changeset = extra_opts->changeset;
+
again:
if (!prealloc && gfpflags_allow_blocking(mask)) {
/*
@@ -1186,7 +1191,7 @@ __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
unsigned bits, struct extent_state **cached_state, gfp_t mask)
{
- return __set_extent_bit(tree, start, end, bits, 0, NULL, cached_state,
+ return __set_extent_bit(tree, start, end, bits, cached_state,
mask, NULL);
}
@@ -1413,6 +1418,10 @@ int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
unsigned bits, struct extent_changeset *changeset)
{
+ struct extent_io_extra_options extra_opts = {
+ .changeset = changeset,
+ };
+
/*
* We don't support EXTENT_LOCKED yet, as current changeset will
* record any bits changed, so for EXTENT_LOCKED case, it will
@@ -1421,15 +1430,14 @@ int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
*/
BUG_ON(bits & EXTENT_LOCKED);
- return __set_extent_bit(tree, start, end, bits, 0, NULL, NULL, GFP_NOFS,
- changeset);
+ return __set_extent_bit(tree, start, end, bits, NULL, GFP_NOFS,
+ &extra_opts);
}
int set_extent_bits_nowait(struct extent_io_tree *tree, u64 start, u64 end,
unsigned bits)
{
- return __set_extent_bit(tree, start, end, bits, 0, NULL, NULL,
- GFP_NOWAIT, NULL);
+ return __set_extent_bit(tree, start, end, bits, NULL, GFP_NOWAIT, NULL);
}
int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
@@ -1460,16 +1468,18 @@ int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
struct extent_state **cached_state)
{
+ struct extent_io_extra_options extra_opts = {
+ .excl_bits = EXTENT_LOCKED,
+ };
int err;
- u64 failed_start;
while (1) {
err = __set_extent_bit(tree, start, end, EXTENT_LOCKED,
- EXTENT_LOCKED, &failed_start,
- cached_state, GFP_NOFS, NULL);
+ cached_state, GFP_NOFS, &extra_opts);
if (err == -EEXIST) {
- wait_extent_bit(tree, failed_start, end, EXTENT_LOCKED);
- start = failed_start;
+ wait_extent_bit(tree, extra_opts.excl_failed_start, end,
+ EXTENT_LOCKED);
+ start = extra_opts.excl_failed_start;
} else
break;
WARN_ON(start > end);
@@ -1479,14 +1489,17 @@ int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
{
+ struct extent_io_extra_options extra_opts = {
+ .excl_bits = EXTENT_LOCKED,
+ };
int err;
- u64 failed_start;
- err = __set_extent_bit(tree, start, end, EXTENT_LOCKED, EXTENT_LOCKED,
- &failed_start, NULL, GFP_NOFS, NULL);
+ err = __set_extent_bit(tree, start, end, EXTENT_LOCKED,
+ NULL, GFP_NOFS, &extra_opts);
if (err == -EEXIST) {
- if (failed_start > start)
- clear_extent_bit(tree, start, failed_start - 1,
+ if (extra_opts.excl_failed_start > start)
+ clear_extent_bit(tree, start,
+ extra_opts.excl_failed_start - 1,
EXTENT_LOCKED, 1, 0, NULL);
return 0;
}
--
2.29.2
next prev parent reply other threads:[~2020-11-03 13:31 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-03 13:30 [PATCH 00/32] btrfs: preparation patches for subpage support Qu Wenruo
2020-11-03 13:30 ` [PATCH 01/32] btrfs: extent_io: remove the extent_start/extent_len for end_bio_extent_readpage() Qu Wenruo
2020-11-05 9:46 ` Nikolay Borisov
2020-11-05 10:15 ` Qu Wenruo
2020-11-05 10:32 ` Nikolay Borisov
2020-11-06 2:01 ` Qu Wenruo
2020-11-06 7:19 ` Qu Wenruo
2020-11-05 19:40 ` Josef Bacik
2020-11-06 1:52 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 02/32] btrfs: extent_io: integrate page status update into endio_readpage_release_extent() Qu Wenruo
2020-11-05 10:26 ` Nikolay Borisov
2020-11-05 11:15 ` Qu Wenruo
2020-11-05 10:35 ` Nikolay Borisov
2020-11-05 11:25 ` Qu Wenruo
2020-11-05 19:34 ` Josef Bacik
2020-11-03 13:30 ` [PATCH 03/32] btrfs: extent_io: add lockdep_assert_held() for attach_extent_buffer_page() Qu Wenruo
2020-11-03 13:30 ` [PATCH 04/32] btrfs: extent_io: extract the btree page submission code into its own helper function Qu Wenruo
2020-11-05 10:47 ` Nikolay Borisov
2020-11-06 18:11 ` David Sterba
2020-11-03 13:30 ` [PATCH 05/32] btrfs: extent-io-tests: remove invalid tests Qu Wenruo
2020-11-03 13:30 ` [PATCH 06/32] btrfs: extent_io: calculate inline extent buffer page size based on page size Qu Wenruo
2020-11-05 12:54 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 07/32] btrfs: extent_io: make btrfs_fs_info::buffer_radix to take sector size devided values Qu Wenruo
2020-11-03 13:30 ` Qu Wenruo [this message]
2020-11-05 13:35 ` [PATCH 08/32] btrfs: extent_io: sink less common parameters for __set_extent_bit() Nikolay Borisov
2020-11-05 13:55 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 09/32] btrfs: extent_io: sink less common parameters for __clear_extent_bit() Qu Wenruo
2020-11-03 13:30 ` [PATCH 10/32] btrfs: disk_io: grab fs_info from extent_buffer::fs_info directly for btrfs_mark_buffer_dirty() Qu Wenruo
2020-11-05 13:45 ` Nikolay Borisov
2020-11-05 13:49 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 11/32] btrfs: disk-io: make csum_tree_block() handle sectorsize smaller than page size Qu Wenruo
2020-11-06 18:58 ` David Sterba
2020-11-07 0:04 ` Qu Wenruo
2020-11-10 14:33 ` David Sterba
2020-11-11 0:08 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 12/32] btrfs: disk-io: extract the extent buffer verification from btrfs_validate_metadata_buffer() Qu Wenruo
2020-11-05 13:57 ` Nikolay Borisov
2020-11-06 19:03 ` David Sterba
2020-11-09 6:44 ` Qu Wenruo
2020-11-10 14:37 ` David Sterba
2020-11-03 13:30 ` [PATCH 13/32] btrfs: disk-io: accept bvec directly for csum_dirty_buffer() Qu Wenruo
2020-11-05 14:13 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 14/32] btrfs: inode: make btrfs_readpage_end_io_hook() follow sector size Qu Wenruo
2020-11-05 14:28 ` Nikolay Borisov
2020-11-06 19:16 ` David Sterba
2020-11-06 19:20 ` David Sterba
2020-11-06 19:28 ` David Sterba
2020-11-03 13:30 ` [PATCH 15/32] btrfs: introduce a helper to determine if the sectorsize is smaller than PAGE_SIZE Qu Wenruo
2020-11-05 15:01 ` Nikolay Borisov
2020-11-05 22:52 ` Qu Wenruo
2020-11-06 17:28 ` David Sterba
2020-11-07 0:00 ` Qu Wenruo
2020-11-10 14:53 ` David Sterba
2020-11-11 1:34 ` Qu Wenruo
2020-11-11 2:21 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 16/32] btrfs: extent_io: allow find_first_extent_bit() to find a range with exact bits match Qu Wenruo
2020-11-05 15:03 ` Nikolay Borisov
2020-11-05 22:55 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 17/32] btrfs: extent_io: don't allow tree block to cross page boundary for subpage support Qu Wenruo
2020-11-06 11:54 ` Nikolay Borisov
2020-11-06 12:03 ` Nikolay Borisov
2020-11-06 13:25 ` Qu Wenruo
2020-11-06 14:04 ` Nikolay Borisov
2020-11-06 23:56 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 18/32] btrfs: extent_io: update num_extent_pages() to support subpage sized extent buffer Qu Wenruo
2020-11-06 12:09 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 19/32] btrfs: handle sectorsize < PAGE_SIZE case for extent buffer accessors Qu Wenruo
2020-11-06 12:51 ` Nikolay Borisov
2020-11-09 5:49 ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 20/32] btrfs: disk-io: only clear EXTENT_LOCK bit for extent_invalidatepage() Qu Wenruo
2020-11-06 13:17 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 21/32] btrfs: extent-io: make type of extent_state::state to be at least 32 bits Qu Wenruo
2020-11-06 13:38 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 22/32] btrfs: file-item: use nodesize to determine whether we need readahead for btrfs_lookup_bio_sums() Qu Wenruo
2020-11-06 13:55 ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 23/32] btrfs: file-item: remove the btrfs_find_ordered_sum() call in btrfs_lookup_bio_sums() Qu Wenruo
2020-11-06 14:28 ` Nikolay Borisov
2020-11-03 13:31 ` [PATCH 24/32] btrfs: file-item: refactor btrfs_lookup_bio_sums() to handle out-of-order bvecs Qu Wenruo
2020-11-06 15:22 ` Nikolay Borisov
2020-11-03 13:31 ` [PATCH 25/32] btrfs: scrub: distinguish scrub_page from regular page Qu Wenruo
2020-11-03 13:31 ` [PATCH 26/32] btrfs: scrub: remove the @force parameter of scrub_pages() Qu Wenruo
2020-11-03 13:31 ` [PATCH 27/32] btrfs: scrub: use flexible array for scrub_page::csums Qu Wenruo
2020-11-09 17:44 ` David Sterba
2020-11-10 0:53 ` Qu Wenruo
2020-11-10 14:22 ` David Sterba
2020-11-03 13:31 ` [PATCH 28/32] btrfs: scrub: refactor scrub_find_csum() Qu Wenruo
2020-11-03 13:31 ` [PATCH 29/32] btrfs: scrub: introduce scrub_page::page_len for subpage support Qu Wenruo
2020-11-09 18:17 ` David Sterba
2020-11-10 0:54 ` Qu Wenruo
2020-11-09 18:25 ` David Sterba
2020-11-10 0:56 ` Qu Wenruo
2020-11-10 14:27 ` David Sterba
2020-11-03 13:31 ` [PATCH 30/32] btrfs: scrub: always allocate one full page for one sector for RAID56 Qu Wenruo
2020-11-03 13:31 ` [PATCH 31/32] btrfs: scrub: support subpage tree block scrub Qu Wenruo
2020-11-09 18:31 ` David Sterba
2020-11-03 13:31 ` [PATCH 32/32] btrfs: scrub: support subpage data scrub Qu Wenruo
2020-11-05 19:28 ` [PATCH 00/32] btrfs: preparation patches for subpage support Josef Bacik
2020-11-06 0:02 ` Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201103133108.148112-9-wqu@suse.com \
--to=wqu@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).