Skip to content

Commit d1b8b94

Browse files
Qu Wenruokdave
authored andcommitted
btrfs: qgroup: Cleanup btrfs_qgroup_prepare_account_extents function
Quite a lot of qgroup corruption happens due to wrong time of calling btrfs_qgroup_prepare_account_extents(). Since the safest time is to call it just before btrfs_qgroup_account_extents(), there is no need to separate these 2 functions. Merging them will make code cleaner and less bug prone. Signed-off-by: Qu Wenruo <[email protected]> [ changelog and comment adjustments ] Signed-off-by: David Sterba <[email protected]>
1 parent 5edfd9f commit d1b8b94

File tree

3 files changed

+18
-45
lines changed

3 files changed

+18
-45
lines changed

fs/btrfs/qgroup.c

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,38 +1406,6 @@ int btrfs_limit_qgroup(struct btrfs_trans_handle *trans,
14061406
return ret;
14071407
}
14081408

1409-
int btrfs_qgroup_prepare_account_extents(struct btrfs_trans_handle *trans,
1410-
struct btrfs_fs_info *fs_info)
1411-
{
1412-
struct btrfs_qgroup_extent_record *record;
1413-
struct btrfs_delayed_ref_root *delayed_refs;
1414-
struct rb_node *node;
1415-
u64 qgroup_to_skip;
1416-
int ret = 0;
1417-
1418-
delayed_refs = &trans->transaction->delayed_refs;
1419-
qgroup_to_skip = delayed_refs->qgroup_to_skip;
1420-
1421-
/*
1422-
* No need to do lock, since this function will only be called in
1423-
* btrfs_commit_transaction().
1424-
*/
1425-
node = rb_first(&delayed_refs->dirty_extent_root);
1426-
while (node) {
1427-
record = rb_entry(node, struct btrfs_qgroup_extent_record,
1428-
node);
1429-
if (WARN_ON(!record->old_roots))
1430-
ret = btrfs_find_all_roots(NULL, fs_info,
1431-
record->bytenr, 0, &record->old_roots);
1432-
if (ret < 0)
1433-
break;
1434-
if (qgroup_to_skip)
1435-
ulist_del(record->old_roots, qgroup_to_skip, 0);
1436-
node = rb_next(node);
1437-
}
1438-
return ret;
1439-
}
1440-
14411409
int btrfs_qgroup_trace_extent_nolock(struct btrfs_fs_info *fs_info,
14421410
struct btrfs_delayed_ref_root *delayed_refs,
14431411
struct btrfs_qgroup_extent_record *record)
@@ -2056,6 +2024,19 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans,
20562024
trace_btrfs_qgroup_account_extents(fs_info, record);
20572025

20582026
if (!ret) {
2027+
/*
2028+
* Old roots should be searched when inserting qgroup
2029+
* extent record
2030+
*/
2031+
if (WARN_ON(!record->old_roots)) {
2032+
/* Search commit root to find old_roots */
2033+
ret = btrfs_find_all_roots(NULL, fs_info,
2034+
record->bytenr, 0,
2035+
&record->old_roots);
2036+
if (ret < 0)
2037+
goto cleanup;
2038+
}
2039+
20592040
/*
20602041
* Use SEQ_LAST as time_seq to do special search, which
20612042
* doesn't lock tree or delayed_refs and search current
@@ -2065,8 +2046,11 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans,
20652046
record->bytenr, SEQ_LAST, &new_roots);
20662047
if (ret < 0)
20672048
goto cleanup;
2068-
if (qgroup_to_skip)
2049+
if (qgroup_to_skip) {
20692050
ulist_del(new_roots, qgroup_to_skip, 0);
2051+
ulist_del(record->old_roots, qgroup_to_skip,
2052+
0);
2053+
}
20702054
ret = btrfs_qgroup_account_extent(trans, fs_info,
20712055
record->bytenr, record->num_bytes,
20722056
record->old_roots, new_roots);

fs/btrfs/qgroup.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,7 @@ int btrfs_limit_qgroup(struct btrfs_trans_handle *trans,
134134
int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info);
135135
void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info);
136136
struct btrfs_delayed_extent_op;
137-
int btrfs_qgroup_prepare_account_extents(struct btrfs_trans_handle *trans,
138-
struct btrfs_fs_info *fs_info);
137+
139138
/*
140139
* Inform qgroup to trace one dirty extent, its info is recorded in @record.
141140
* So qgroup can account it at transaction committing time.

fs/btrfs/transaction.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,9 +1374,6 @@ static int qgroup_account_snapshot(struct btrfs_trans_handle *trans,
13741374
ret = commit_fs_roots(trans, fs_info);
13751375
if (ret)
13761376
goto out;
1377-
ret = btrfs_qgroup_prepare_account_extents(trans, fs_info);
1378-
if (ret < 0)
1379-
goto out;
13801377
ret = btrfs_qgroup_account_extents(trans, fs_info);
13811378
if (ret < 0)
13821379
goto out;
@@ -2180,13 +2177,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans)
21802177
goto scrub_continue;
21812178
}
21822179

2183-
ret = btrfs_qgroup_prepare_account_extents(trans, fs_info);
2184-
if (ret) {
2185-
mutex_unlock(&fs_info->tree_log_mutex);
2186-
mutex_unlock(&fs_info->reloc_mutex);
2187-
goto scrub_continue;
2188-
}
2189-
21902180
/*
21912181
* Since fs roots are all committed, we can get a quite accurate
21922182
* new_roots. So let's do quota accounting.

0 commit comments

Comments
 (0)