Skip to content

Commit 31b706d

Browse files
committed
Merge tag 'for-7.2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs updates from David Sterba: "The most noticeable change is to enable large folios by default, it's been in testing for a few releases. Related to that is huge folio support (still under experimental config). Otherwise a few ioctl updates, performance improvements and usual fixes and core changes. User visible changes: - enable large folios by default, added in 6.17 (under experimental build), no feature limitations, a big change internally - new ioctl to return raw checksums to userspace (a bit tricky given compression and tail extents), can be used for mkfs and deduplication optimizations - provide stable UUID for e.g. overlayfs and temp_fsid, also reflected in statvfs() field f_fsid, internal dev_t is hashed in to allow cloning - add 32bit compat version of GET_SUBVOL_INFO ioctl - in experimental build, support huge folios (up to 2M) Performance related improvements/changes: - limit bio size to the estimated optimum derived from the queue, this prevents build up of too much data for writeback, which could cause latency spikes (reported improvement 15% on sequential writes) - don't force direct IO to be serialized, forgotten change during mount API port, brings back +60% of throughput - lockless calculation of number of shrinkable extent maps, improve performance with many memcg allocated objects Notable fixes: - in zoned mode, fix a deadlock due to zone reclaim and relocation when space needs to be flushed - don't trim device which is internally not tracked as writeable (e.g. when missing device is being rescanned) - fix deadlock when cloning inline extent and mounted with flushoncommit - fix false IO failures after direct IO falls back to buffered write in some cases Core: - remove COW fixup mechanism completely; detect and fix changes to pages outside of filesystem tracking, guaranteed since 5.8, grace period is over - remove 2K block size support, experimental to test subpage code on x86_64 but now it would block folio changes - tree-checker improvements of: - free-space cache and tree items - root reference and backref items - extent state exceptions in reloc tree - subpage mode updates: - code optimizations, simplify tracking bitmaps - re-enable readahead of compressed extent - extend bitmap size to cover huge folios - add tracepoints related to sync, tree-log and transactions - device stats item tracking unification, remove item if there are no stats recorded, also don't leave stale stats on replaced device - allow extent buffer pages to be allocated as movable, to help page migration - added checks for proper extent buffer release - btrfs.ko code size reduction due to transaction abort call simplifications - several struct size reductions - more auto free conversions - more verbose assertions" * tag 'for-7.2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: (130 commits) btrfs: fix use-after-free after relocation failure with concurrent COW btrfs: move WARN_ON on unexpected error in __add_tree_block() btrfs: move locking into btrfs_get_reloc_bg_bytenr() btrfs: lzo: reject compressed segment that overflows the compressed input btrfs: retry faulting in the pages after a zero sized short direct write btrfs: fix incorrect buffered IO fallback for append direct writes btrfs: fix false IO failure after falling back to buffered write btrfs: use verbose assertions in backref.c btrfs: print a message when a missing device re-appears btrfs: do not trim a device which is not writeable btrfs: return real error after lookup failure in btrfs_ioctl_default_subvol() btrfs: use mapping shared locking for reading super block btrfs: use lockless read in nr_cached_objects shrinker callback btrfs: switch local indicator variables to bools btrfs: send: pass bool for pending_move and refs_processed parameters btrfs: use shifts for sectorsize and nodesize btrfs: fix deadlock cloning inline extent when using flushoncommit btrfs: allocate eb-attached btree pages as movable btrfs: add 32-bit compat ioctl for BTRFS_IOC_GET_SUBVOL_INFO btrfs: derive f_fsid from on-disk fsid and dev_t ...
2 parents 477c122 + ae2eb64 commit 31b706d

58 files changed

Lines changed: 3475 additions & 1904 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

fs/btrfs/Kconfig

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ config BTRFS_EXPERIMENTAL
9393

9494
Current list:
9595

96-
- COW fixup worker warning - last warning before removing the
97-
functionality catching out-of-band page
98-
dirtying, not necessary since 5.8
99-
10096
- RAID mirror read policy - additional read policies for balancing
10197
reading from redundant block group
10298
profiles (currently: pid, round-robin,
@@ -110,7 +106,9 @@ config BTRFS_EXPERIMENTAL
110106

111107
- extent tree v2 - complex rework of extent tracking
112108

113-
- large folio and block size (> page size) support
109+
- block size > page size support
110+
111+
- huge folios for data - folios can be as large as 2MiB now
114112

115113
- asynchronous checksum generation for data writes
116114

fs/btrfs/backref.c

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ static bool lookup_backref_shared_cache(struct btrfs_backref_share_check_ctx *ct
12561256
* realizing. We cache results only for extent buffers that lead from
12571257
* the root node down to the leaf with the file extent item.
12581258
*/
1259-
ASSERT(level >= 0);
1259+
ASSERT(level >= 0, "level=%d", level);
12601260

12611261
entry = &ctx->path_cache_entries[level];
12621262

@@ -1327,7 +1327,7 @@ static void store_backref_shared_cache(struct btrfs_backref_share_check_ctx *ctx
13271327
* realizing. We cache results only for extent buffers that lead from
13281328
* the root node down to the leaf with the file extent item.
13291329
*/
1330-
ASSERT(level >= 0);
1330+
ASSERT(level >= 0, "level=%d", level);
13311331

13321332
if (is_shared)
13331333
gen = btrfs_get_last_root_drop_gen(fs_info);
@@ -2367,7 +2367,7 @@ int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
23672367
info = (struct btrfs_tree_block_info *)(ei + 1);
23682368
*out_level = btrfs_tree_block_level(eb, info);
23692369
} else {
2370-
ASSERT(key->type == BTRFS_METADATA_ITEM_KEY);
2370+
ASSERT(key->type == BTRFS_METADATA_ITEM_KEY, "key->type=%hhu", key->type);
23712371
*out_level = (u8)key->offset;
23722372
}
23732373

@@ -2814,26 +2814,17 @@ struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
28142814
return ifp;
28152815
}
28162816

2817-
struct btrfs_backref_iter *btrfs_backref_iter_alloc(struct btrfs_fs_info *fs_info)
2817+
int btrfs_backref_iter_init(struct btrfs_backref_iter *iter)
28182818
{
2819-
struct btrfs_backref_iter *ret;
2820-
2821-
ret = kzalloc_obj(*ret, GFP_NOFS);
2822-
if (!ret)
2823-
return NULL;
2824-
2825-
ret->path = btrfs_alloc_path();
2826-
if (!ret->path) {
2827-
kfree(ret);
2828-
return NULL;
2829-
}
2819+
iter->path = btrfs_alloc_path();
2820+
if (!iter->path)
2821+
return -ENOMEM;
28302822

28312823
/* Current backref iterator only supports iteration in commit root */
2832-
ret->path->search_commit_root = true;
2833-
ret->path->skip_locking = true;
2834-
ret->fs_info = fs_info;
2824+
iter->path->search_commit_root = true;
2825+
iter->path->skip_locking = true;
28352826

2836-
return ret;
2827+
return 0;
28372828
}
28382829

28392830
static void btrfs_backref_iter_release(struct btrfs_backref_iter *iter)
@@ -2846,9 +2837,8 @@ static void btrfs_backref_iter_release(struct btrfs_backref_iter *iter)
28462837
memset(&iter->cur_key, 0, sizeof(iter->cur_key));
28472838
}
28482839

2849-
int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
2840+
int btrfs_backref_iter_start(struct btrfs_fs_info *fs_info, struct btrfs_backref_iter *iter, u64 bytenr)
28502841
{
2851-
struct btrfs_fs_info *fs_info = iter->fs_info;
28522842
struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr);
28532843
struct btrfs_path *path = iter->path;
28542844
struct btrfs_extent_item *ei;
@@ -2963,7 +2953,7 @@ static bool btrfs_backref_iter_is_inline_ref(struct btrfs_backref_iter *iter)
29632953
* Return >0 if there is no extra backref for this bytenr.
29642954
* Return <0 if there is something wrong happened.
29652955
*/
2966-
int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
2956+
int btrfs_backref_iter_next(struct btrfs_fs_info *fs_info, struct btrfs_backref_iter *iter)
29672957
{
29682958
struct extent_buffer *eb = iter->path->nodes[0];
29692959
struct btrfs_root *extent_root;
@@ -2974,7 +2964,9 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
29742964

29752965
if (btrfs_backref_iter_is_inline_ref(iter)) {
29762966
/* We're still inside the inline refs */
2977-
ASSERT(iter->cur_ptr < iter->end_ptr);
2967+
ASSERT(iter->cur_ptr < iter->end_ptr,
2968+
"iter->cur_ptr=%u iter->end_ptr=%u",
2969+
iter->cur_ptr, iter->end_ptr);
29782970

29792971
if (btrfs_backref_has_tree_block_info(iter)) {
29802972
/* First tree block info */
@@ -2997,10 +2989,9 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
29972989
}
29982990

29992991
/* We're at keyed items, there is no inline item, go to the next one */
3000-
extent_root = btrfs_extent_root(iter->fs_info, iter->bytenr);
2992+
extent_root = btrfs_extent_root(fs_info, iter->bytenr);
30012993
if (unlikely(!extent_root)) {
3002-
btrfs_err(iter->fs_info,
3003-
"missing extent root for extent at bytenr %llu",
2994+
btrfs_err(fs_info, "missing extent root for extent at bytenr %llu",
30042995
iter->bytenr);
30052996
return -EUCLEAN;
30062997
}
@@ -3041,7 +3032,7 @@ struct btrfs_backref_node *btrfs_backref_alloc_node(
30413032
{
30423033
struct btrfs_backref_node *node;
30433034

3044-
ASSERT(level >= 0 && level < BTRFS_MAX_LEVEL);
3035+
ASSERT(level >= 0 && level < BTRFS_MAX_LEVEL, "level=%d", level);
30453036
node = kzalloc_obj(*node, GFP_NOFS);
30463037
if (!node)
30473038
return node;
@@ -3063,7 +3054,7 @@ void btrfs_backref_free_node(struct btrfs_backref_cache *cache,
30633054
if (node) {
30643055
ASSERT(list_empty(&node->list));
30653056
ASSERT(list_empty(&node->lower));
3066-
ASSERT(node->eb == NULL);
3057+
ASSERT(node->eb == NULL, "node->eb->start=%llu", node->eb->start);
30673058
cache->nr_nodes--;
30683059
btrfs_put_root(node->root);
30693060
kfree(node);
@@ -3166,15 +3157,18 @@ void btrfs_backref_release_cache(struct btrfs_backref_cache *cache)
31663157

31673158
ASSERT(list_empty(&cache->pending_edge));
31683159
ASSERT(list_empty(&cache->useless_node));
3169-
ASSERT(!cache->nr_nodes);
3170-
ASSERT(!cache->nr_edges);
3160+
ASSERT(!cache->nr_nodes, "cache->nr_nodes=%d", cache->nr_nodes);
3161+
ASSERT(!cache->nr_edges, "cache->nr_edges=%d", cache->nr_edges);
31713162
}
31723163

31733164
static void btrfs_backref_link_edge(struct btrfs_backref_edge *edge,
31743165
struct btrfs_backref_node *lower,
31753166
struct btrfs_backref_node *upper)
31763167
{
3177-
ASSERT(upper && lower && upper->level == lower->level + 1);
3168+
ASSERT(upper != NULL);
3169+
ASSERT(lower != NULL);
3170+
ASSERT(upper->level == lower->level + 1, "upper->level=%d lower->level=%d",
3171+
upper->level, lower->level);
31783172
edge->node[LOWER] = lower;
31793173
edge->node[UPPER] = upper;
31803174
list_add_tail(&edge->list[LOWER], &lower->upper);
@@ -3199,7 +3193,7 @@ static int handle_direct_tree_backref(struct btrfs_backref_cache *cache,
31993193
struct btrfs_backref_node *upper;
32003194
struct rb_node *rb_node;
32013195

3202-
ASSERT(ref_key->type == BTRFS_SHARED_BLOCK_REF_KEY);
3196+
ASSERT(ref_key->type == BTRFS_SHARED_BLOCK_REF_KEY, "ref_key->type=%hhu", ref_key->type);
32033197

32043198
/* Only reloc root uses backref pointing to itself */
32053199
if (ref_key->objectid == ref_key->offset) {
@@ -3294,7 +3288,9 @@ static int handle_indirect_tree_backref(struct btrfs_trans_handle *trans,
32943288

32953289
if (btrfs_root_level(&root->root_item) == cur->level) {
32963290
/* Tree root */
3297-
ASSERT(btrfs_root_bytenr(&root->root_item) == cur->bytenr);
3291+
ASSERT(btrfs_root_bytenr(&root->root_item) == cur->bytenr,
3292+
"root_bytenr=%llu cur->bytenr=%llu",
3293+
btrfs_root_bytenr(&root->root_item), cur->bytenr);
32983294
/*
32993295
* For reloc backref cache, we may ignore reloc root. But for
33003296
* general purpose backref cache, we can't rely on
@@ -3344,8 +3340,9 @@ static int handle_indirect_tree_backref(struct btrfs_trans_handle *trans,
33443340
/* Add all nodes and edges in the path */
33453341
for (; level < BTRFS_MAX_LEVEL; level++) {
33463342
if (!path->nodes[level]) {
3347-
ASSERT(btrfs_root_bytenr(&root->root_item) ==
3348-
lower->bytenr);
3343+
ASSERT(btrfs_root_bytenr(&root->root_item) == lower->bytenr,
3344+
"root_bytenr=%llu lower->bytenr=%llu",
3345+
btrfs_root_bytenr(&root->root_item), lower->bytenr);
33493346
/* Same as previous should_ignore_reloc_root() call */
33503347
if (btrfs_should_ignore_reloc_root(root) &&
33513348
cache->is_reloc) {
@@ -3454,15 +3451,15 @@ int btrfs_backref_add_tree_node(struct btrfs_trans_handle *trans,
34543451
struct btrfs_backref_node *exist;
34553452
int ret;
34563453

3457-
ret = btrfs_backref_iter_start(iter, cur->bytenr);
3454+
ret = btrfs_backref_iter_start(trans->fs_info, iter, cur->bytenr);
34583455
if (ret < 0)
34593456
return ret;
34603457
/*
34613458
* We skip the first btrfs_tree_block_info, as we don't use the key
34623459
* stored in it, but fetch it from the tree block
34633460
*/
34643461
if (btrfs_backref_has_tree_block_info(iter)) {
3465-
ret = btrfs_backref_iter_next(iter);
3462+
ret = btrfs_backref_iter_next(trans->fs_info, iter);
34663463
if (ret < 0)
34673464
goto out;
34683465
/* No extra backref? This means the tree block is corrupted */
@@ -3492,7 +3489,7 @@ int btrfs_backref_add_tree_node(struct btrfs_trans_handle *trans,
34923489
exist = NULL;
34933490
}
34943491

3495-
for (; ret == 0; ret = btrfs_backref_iter_next(iter)) {
3492+
for (; ret == 0; ret = btrfs_backref_iter_next(trans->fs_info, iter)) {
34963493
struct extent_buffer *eb;
34973494
struct btrfs_key key;
34983495
int type;

fs/btrfs/backref.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,15 +278,12 @@ struct prelim_ref {
278278
struct btrfs_backref_iter {
279279
u64 bytenr;
280280
struct btrfs_path *path;
281-
struct btrfs_fs_info *fs_info;
282281
struct btrfs_key cur_key;
283282
u32 item_ptr;
284283
u32 cur_ptr;
285284
u32 end_ptr;
286285
};
287286

288-
struct btrfs_backref_iter *btrfs_backref_iter_alloc(struct btrfs_fs_info *fs_info);
289-
290287
/*
291288
* For metadata with EXTENT_ITEM key (non-skinny) case, the first inline data
292289
* is btrfs_tree_block_info, without a btrfs_extent_inline_ref header.
@@ -302,9 +299,11 @@ static inline bool btrfs_backref_has_tree_block_info(
302299
return false;
303300
}
304301

305-
int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr);
302+
int btrfs_backref_iter_init(struct btrfs_backref_iter *iter);
303+
304+
int btrfs_backref_iter_start(struct btrfs_fs_info *fs_info, struct btrfs_backref_iter *iter, u64 bytenr);
306305

307-
int btrfs_backref_iter_next(struct btrfs_backref_iter *iter);
306+
int btrfs_backref_iter_next(struct btrfs_fs_info *fs_info, struct btrfs_backref_iter *iter);
308307

309308
/*
310309
* Backref cache related structures

fs/btrfs/block-group.c

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,34 @@
2222
#include "accessors.h"
2323
#include "extent-tree.h"
2424

25+
static struct kmem_cache *block_group_cache;
26+
static struct kmem_cache *free_space_ctl_cache;
27+
28+
int __init btrfs_init_block_group(void)
29+
{
30+
block_group_cache = kmem_cache_create("btrfs_block_group",
31+
sizeof(struct btrfs_block_group),
32+
0, 0, NULL);
33+
if (!block_group_cache)
34+
return -ENOMEM;
35+
36+
free_space_ctl_cache = kmem_cache_create("btrfs_free_space_ctl",
37+
sizeof(struct btrfs_free_space_ctl),
38+
0, 0, NULL);
39+
if (!free_space_ctl_cache) {
40+
kmem_cache_destroy(block_group_cache);
41+
return -ENOMEM;
42+
}
43+
44+
return 0;
45+
}
46+
47+
void __cold btrfs_exit_block_group(void)
48+
{
49+
kmem_cache_destroy(block_group_cache);
50+
kmem_cache_destroy(free_space_ctl_cache);
51+
}
52+
2553
#ifdef CONFIG_BTRFS_DEBUG
2654
int btrfs_should_fragment_free_space(const struct btrfs_block_group *block_group)
2755
{
@@ -180,9 +208,9 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
180208
btrfs_discard_cancel_work(&cache->fs_info->discard_ctl,
181209
cache);
182210

183-
kfree(cache->free_space_ctl);
211+
kmem_cache_free(free_space_ctl_cache, cache->free_space_ctl);
184212
btrfs_free_chunk_map(cache->physical_map);
185-
kfree(cache);
213+
kmem_cache_free(block_group_cache, cache);
186214
}
187215
}
188216

@@ -2371,13 +2399,13 @@ static struct btrfs_block_group *btrfs_create_block_group(
23712399
{
23722400
struct btrfs_block_group *cache;
23732401

2374-
cache = kzalloc_obj(*cache, GFP_NOFS);
2402+
cache = kmem_cache_zalloc(block_group_cache, GFP_NOFS);
23752403
if (!cache)
23762404
return NULL;
23772405

2378-
cache->free_space_ctl = kzalloc_obj(*cache->free_space_ctl, GFP_NOFS);
2406+
cache->free_space_ctl = kmem_cache_zalloc(free_space_ctl_cache, GFP_NOFS);
23792407
if (!cache->free_space_ctl) {
2380-
kfree(cache);
2408+
kmem_cache_free(block_group_cache, cache);
23812409
return NULL;
23822410
}
23832411

@@ -2454,7 +2482,7 @@ static int check_chunk_block_group_mappings(struct btrfs_fs_info *fs_info)
24542482
static int read_one_block_group(struct btrfs_fs_info *info,
24552483
struct btrfs_block_group_item_v2 *bgi,
24562484
const struct btrfs_key *key,
2457-
int need_clear)
2485+
bool need_clear)
24582486
{
24592487
struct btrfs_block_group *cache;
24602488
const bool mixed = btrfs_fs_incompat(info, MIXED_GROUPS);
@@ -2635,7 +2663,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
26352663
struct btrfs_block_group *cache;
26362664
struct btrfs_space_info *space_info;
26372665
struct btrfs_key key;
2638-
int need_clear = 0;
2666+
bool need_clear = false;
26392667
u64 cache_gen;
26402668

26412669
/*
@@ -2660,9 +2688,9 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)
26602688
cache_gen = btrfs_super_cache_generation(info->super_copy);
26612689
if (btrfs_test_opt(info, SPACE_CACHE) &&
26622690
btrfs_super_generation(info->super_copy) != cache_gen)
2663-
need_clear = 1;
2691+
need_clear = true;
26642692
if (btrfs_test_opt(info, CLEAR_CACHE))
2665-
need_clear = 1;
2693+
need_clear = true;
26662694

26672695
while (1) {
26682696
struct btrfs_block_group_item_v2 bgi;
@@ -4089,7 +4117,7 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, u64 type)
40894117
struct btrfs_space_info *space_info;
40904118

40914119
space_info = btrfs_find_space_info(trans->fs_info, type);
4092-
if (!space_info) {
4120+
if (unlikely(!space_info)) {
40934121
DEBUG_WARN();
40944122
return -EINVAL;
40954123
}

0 commit comments

Comments
 (0)