Skip to content

Commit bdb2701

Browse files
committed
Merge tag 'for-6.7-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from David Sterba: "Some fixes to quota accounting code, mostly around error handling and correctness: - free reserves on various error paths, after IO errors or transaction abort - don't clear reserved range at the folio release time, it'll be properly cleared after final write - fix integer overflow due to int used when passing around size of freed reservations - fix a regression in squota accounting that missed some cases with delayed refs" * tag 'for-6.7-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: ensure releasing squota reserve on head refs btrfs: don't clear qgroup reserved bit in release_folio btrfs: free qgroup pertrans reserve on transaction abort btrfs: fix qgroup_free_reserved_data int overflow btrfs: free qgroup reserve when ORDERED_IOERR is set
2 parents 8296494 + e85a0ad commit bdb2701

File tree

11 files changed

+116
-50
lines changed

11 files changed

+116
-50
lines changed

fs/btrfs/delalloc-space.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ void btrfs_free_reserved_data_space(struct btrfs_inode *inode,
199199
start = round_down(start, fs_info->sectorsize);
200200

201201
btrfs_free_reserved_data_space_noquota(fs_info, len);
202-
btrfs_qgroup_free_data(inode, reserved, start, len);
202+
btrfs_qgroup_free_data(inode, reserved, start, len, NULL);
203203
}
204204

205205
/*

fs/btrfs/disk-io.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4799,6 +4799,32 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *cur_trans,
47994799
}
48004800
}
48014801

4802+
static void btrfs_free_all_qgroup_pertrans(struct btrfs_fs_info *fs_info)
4803+
{
4804+
struct btrfs_root *gang[8];
4805+
int i;
4806+
int ret;
4807+
4808+
spin_lock(&fs_info->fs_roots_radix_lock);
4809+
while (1) {
4810+
ret = radix_tree_gang_lookup_tag(&fs_info->fs_roots_radix,
4811+
(void **)gang, 0,
4812+
ARRAY_SIZE(gang),
4813+
BTRFS_ROOT_TRANS_TAG);
4814+
if (ret == 0)
4815+
break;
4816+
for (i = 0; i < ret; i++) {
4817+
struct btrfs_root *root = gang[i];
4818+
4819+
btrfs_qgroup_free_meta_all_pertrans(root);
4820+
radix_tree_tag_clear(&fs_info->fs_roots_radix,
4821+
(unsigned long)root->root_key.objectid,
4822+
BTRFS_ROOT_TRANS_TAG);
4823+
}
4824+
}
4825+
spin_unlock(&fs_info->fs_roots_radix_lock);
4826+
}
4827+
48024828
void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans,
48034829
struct btrfs_fs_info *fs_info)
48044830
{
@@ -4827,6 +4853,8 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans,
48274853
EXTENT_DIRTY);
48284854
btrfs_destroy_pinned_extent(fs_info, &cur_trans->pinned_extents);
48294855

4856+
btrfs_free_all_qgroup_pertrans(fs_info);
4857+
48304858
cur_trans->state =TRANS_STATE_COMPLETED;
48314859
wake_up(&cur_trans->commit_wait);
48324860
}

fs/btrfs/extent-tree.c

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,23 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
15471547
return ret;
15481548
}
15491549

1550+
static void free_head_ref_squota_rsv(struct btrfs_fs_info *fs_info,
1551+
struct btrfs_delayed_ref_head *href)
1552+
{
1553+
u64 root = href->owning_root;
1554+
1555+
/*
1556+
* Don't check must_insert_reserved, as this is called from contexts
1557+
* where it has already been unset.
1558+
*/
1559+
if (btrfs_qgroup_mode(fs_info) != BTRFS_QGROUP_MODE_SIMPLE ||
1560+
!href->is_data || !is_fstree(root))
1561+
return;
1562+
1563+
btrfs_qgroup_free_refroot(fs_info, root, href->reserved_bytes,
1564+
BTRFS_QGROUP_RSV_DATA);
1565+
}
1566+
15501567
static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
15511568
struct btrfs_delayed_ref_head *href,
15521569
struct btrfs_delayed_ref_node *node,
@@ -1569,7 +1586,6 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
15691586
struct btrfs_squota_delta delta = {
15701587
.root = href->owning_root,
15711588
.num_bytes = node->num_bytes,
1572-
.rsv_bytes = href->reserved_bytes,
15731589
.is_data = true,
15741590
.is_inc = true,
15751591
.generation = trans->transid,
@@ -1586,11 +1602,9 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
15861602
flags, ref->objectid,
15871603
ref->offset, &key,
15881604
node->ref_mod, href->owning_root);
1605+
free_head_ref_squota_rsv(trans->fs_info, href);
15891606
if (!ret)
15901607
ret = btrfs_record_squota_delta(trans->fs_info, &delta);
1591-
else
1592-
btrfs_qgroup_free_refroot(trans->fs_info, delta.root,
1593-
delta.rsv_bytes, BTRFS_QGROUP_RSV_DATA);
15941608
} else if (node->action == BTRFS_ADD_DELAYED_REF) {
15951609
ret = __btrfs_inc_extent_ref(trans, node, parent, ref->root,
15961610
ref->objectid, ref->offset,
@@ -1742,7 +1756,6 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
17421756
struct btrfs_squota_delta delta = {
17431757
.root = href->owning_root,
17441758
.num_bytes = fs_info->nodesize,
1745-
.rsv_bytes = 0,
17461759
.is_data = false,
17471760
.is_inc = true,
17481761
.generation = trans->transid,
@@ -1774,8 +1787,10 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans,
17741787
int ret = 0;
17751788

17761789
if (TRANS_ABORTED(trans)) {
1777-
if (insert_reserved)
1790+
if (insert_reserved) {
17781791
btrfs_pin_extent(trans, node->bytenr, node->num_bytes, 1);
1792+
free_head_ref_squota_rsv(trans->fs_info, href);
1793+
}
17791794
return 0;
17801795
}
17811796

@@ -1871,6 +1886,8 @@ u64 btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info,
18711886
struct btrfs_delayed_ref_root *delayed_refs,
18721887
struct btrfs_delayed_ref_head *head)
18731888
{
1889+
u64 ret = 0;
1890+
18741891
/*
18751892
* We had csum deletions accounted for in our delayed refs rsv, we need
18761893
* to drop the csum leaves for this update from our delayed_refs_rsv.
@@ -1885,14 +1902,13 @@ u64 btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info,
18851902

18861903
btrfs_delayed_refs_rsv_release(fs_info, 0, nr_csums);
18871904

1888-
return btrfs_calc_delayed_ref_csum_bytes(fs_info, nr_csums);
1905+
ret = btrfs_calc_delayed_ref_csum_bytes(fs_info, nr_csums);
18891906
}
1890-
if (btrfs_qgroup_mode(fs_info) == BTRFS_QGROUP_MODE_SIMPLE &&
1891-
head->must_insert_reserved && head->is_data)
1892-
btrfs_qgroup_free_refroot(fs_info, head->owning_root,
1893-
head->reserved_bytes, BTRFS_QGROUP_RSV_DATA);
1907+
/* must_insert_reserved can be set only if we didn't run the head ref. */
1908+
if (head->must_insert_reserved)
1909+
free_head_ref_squota_rsv(fs_info, head);
18941910

1895-
return 0;
1911+
return ret;
18961912
}
18971913

18981914
static int cleanup_ref_head(struct btrfs_trans_handle *trans,
@@ -2033,6 +2049,12 @@ static int btrfs_run_delayed_refs_for_head(struct btrfs_trans_handle *trans,
20332049
* spin lock.
20342050
*/
20352051
must_insert_reserved = locked_ref->must_insert_reserved;
2052+
/*
2053+
* Unsetting this on the head ref relinquishes ownership of
2054+
* the rsv_bytes, so it is critical that every possible code
2055+
* path from here forward frees all reserves including qgroup
2056+
* reserve.
2057+
*/
20362058
locked_ref->must_insert_reserved = false;
20372059

20382060
extent_op = locked_ref->extent_op;
@@ -3292,7 +3314,6 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
32923314
struct btrfs_squota_delta delta = {
32933315
.root = delayed_ref_root,
32943316
.num_bytes = num_bytes,
3295-
.rsv_bytes = 0,
32963317
.is_data = is_data,
32973318
.is_inc = false,
32983319
.generation = btrfs_extent_generation(leaf, ei),
@@ -4937,7 +4958,6 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
49374958
.root = root_objectid,
49384959
.num_bytes = ins->offset,
49394960
.generation = trans->transid,
4940-
.rsv_bytes = 0,
49414961
.is_data = true,
49424962
.is_inc = true,
49434963
};

fs/btrfs/extent_io.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2302,7 +2302,8 @@ static int try_release_extent_state(struct extent_io_tree *tree,
23022302
ret = 0;
23032303
} else {
23042304
u32 clear_bits = ~(EXTENT_LOCKED | EXTENT_NODATASUM |
2305-
EXTENT_DELALLOC_NEW | EXTENT_CTLBITS);
2305+
EXTENT_DELALLOC_NEW | EXTENT_CTLBITS |
2306+
EXTENT_QGROUP_RESERVED);
23062307

23072308
/*
23082309
* At this point we can safely clear everything except the

fs/btrfs/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3192,7 +3192,7 @@ static long btrfs_fallocate(struct file *file, int mode,
31923192
qgroup_reserved -= range->len;
31933193
} else if (qgroup_reserved > 0) {
31943194
btrfs_qgroup_free_data(BTRFS_I(inode), data_reserved,
3195-
range->start, range->len);
3195+
range->start, range->len, NULL);
31963196
qgroup_reserved -= range->len;
31973197
}
31983198
list_del(&range->list);

fs/btrfs/inode.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ static noinline int cow_file_range_inline(struct btrfs_inode *inode, u64 size,
688688
* And at reserve time, it's always aligned to page size, so
689689
* just free one page here.
690690
*/
691-
btrfs_qgroup_free_data(inode, NULL, 0, PAGE_SIZE);
691+
btrfs_qgroup_free_data(inode, NULL, 0, PAGE_SIZE, NULL);
692692
btrfs_free_path(path);
693693
btrfs_end_transaction(trans);
694694
return ret;
@@ -5132,7 +5132,7 @@ static void evict_inode_truncate_pages(struct inode *inode)
51325132
*/
51335133
if (state_flags & EXTENT_DELALLOC)
51345134
btrfs_qgroup_free_data(BTRFS_I(inode), NULL, start,
5135-
end - start + 1);
5135+
end - start + 1, NULL);
51365136

51375137
clear_extent_bit(io_tree, start, end,
51385138
EXTENT_CLEAR_ALL_BITS | EXTENT_DO_ACCOUNTING,
@@ -8059,7 +8059,7 @@ static void btrfs_invalidate_folio(struct folio *folio, size_t offset,
80598059
* reserved data space.
80608060
* Since the IO will never happen for this page.
80618061
*/
8062-
btrfs_qgroup_free_data(inode, NULL, cur, range_end + 1 - cur);
8062+
btrfs_qgroup_free_data(inode, NULL, cur, range_end + 1 - cur, NULL);
80638063
if (!inode_evicting) {
80648064
clear_extent_bit(tree, cur, range_end, EXTENT_LOCKED |
80658065
EXTENT_DELALLOC | EXTENT_UPTODATE |
@@ -9491,7 +9491,7 @@ static struct btrfs_trans_handle *insert_prealloc_file_extent(
94919491
struct btrfs_path *path;
94929492
u64 start = ins->objectid;
94939493
u64 len = ins->offset;
9494-
int qgroup_released;
9494+
u64 qgroup_released = 0;
94959495
int ret;
94969496

94979497
memset(&stack_fi, 0, sizeof(stack_fi));
@@ -9504,9 +9504,9 @@ static struct btrfs_trans_handle *insert_prealloc_file_extent(
95049504
btrfs_set_stack_file_extent_compression(&stack_fi, BTRFS_COMPRESS_NONE);
95059505
/* Encryption and other encoding is reserved and all 0 */
95069506

9507-
qgroup_released = btrfs_qgroup_release_data(inode, file_offset, len);
9508-
if (qgroup_released < 0)
9509-
return ERR_PTR(qgroup_released);
9507+
ret = btrfs_qgroup_release_data(inode, file_offset, len, &qgroup_released);
9508+
if (ret < 0)
9509+
return ERR_PTR(ret);
95109510

95119511
if (trans) {
95129512
ret = insert_reserved_file_extent(trans, inode,
@@ -10401,7 +10401,7 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from,
1040110401
btrfs_delalloc_release_metadata(inode, disk_num_bytes, ret < 0);
1040210402
out_qgroup_free_data:
1040310403
if (ret < 0)
10404-
btrfs_qgroup_free_data(inode, data_reserved, start, num_bytes);
10404+
btrfs_qgroup_free_data(inode, data_reserved, start, num_bytes, NULL);
1040510405
out_free_data_space:
1040610406
/*
1040710407
* If btrfs_reserve_extent() succeeded, then we already decremented

fs/btrfs/ordered-data.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,19 +152,20 @@ static struct btrfs_ordered_extent *alloc_ordered_extent(
152152
{
153153
struct btrfs_ordered_extent *entry;
154154
int ret;
155+
u64 qgroup_rsv = 0;
155156

156157
if (flags &
157158
((1 << BTRFS_ORDERED_NOCOW) | (1 << BTRFS_ORDERED_PREALLOC))) {
158159
/* For nocow write, we can release the qgroup rsv right now */
159-
ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes);
160+
ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes, &qgroup_rsv);
160161
if (ret < 0)
161162
return ERR_PTR(ret);
162163
} else {
163164
/*
164165
* The ordered extent has reserved qgroup space, release now
165166
* and pass the reserved number for qgroup_record to free.
166167
*/
167-
ret = btrfs_qgroup_release_data(inode, file_offset, num_bytes);
168+
ret = btrfs_qgroup_release_data(inode, file_offset, num_bytes, &qgroup_rsv);
168169
if (ret < 0)
169170
return ERR_PTR(ret);
170171
}
@@ -182,7 +183,7 @@ static struct btrfs_ordered_extent *alloc_ordered_extent(
182183
entry->inode = igrab(&inode->vfs_inode);
183184
entry->compress_type = compress_type;
184185
entry->truncated_len = (u64)-1;
185-
entry->qgroup_rsv = ret;
186+
entry->qgroup_rsv = qgroup_rsv;
186187
entry->flags = flags;
187188
refcount_set(&entry->refs, 1);
188189
init_waitqueue_head(&entry->wait);
@@ -599,7 +600,9 @@ void btrfs_remove_ordered_extent(struct btrfs_inode *btrfs_inode,
599600
release = entry->disk_num_bytes;
600601
else
601602
release = entry->num_bytes;
602-
btrfs_delalloc_release_metadata(btrfs_inode, release, false);
603+
btrfs_delalloc_release_metadata(btrfs_inode, release,
604+
test_bit(BTRFS_ORDERED_IOERR,
605+
&entry->flags));
603606
}
604607

605608
percpu_counter_add_batch(&fs_info->ordered_bytes, -entry->num_bytes,

0 commit comments

Comments
 (0)