Skip to content

Commit 6f51352

Browse files
committed
Merge tag 'for-5.16-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from David Sterba: "A few more regression fixes and stable patches, mostly one-liners. Regression fixes: - fix pointer/ERR_PTR mismatch returned from memdup_user - reset dedicated zoned mode relocation block group to avoid using it and filling it without any recourse Fixes: - handle a case to FITRIM range (also to make fstests/generic/260 work) - fix warning when extent buffer state and pages get out of sync after an IO error - fix transaction abort when syncing due to missing mapping error set on metadata inode after inlining a compressed file - fix transaction abort due to tree-log and zoned mode interacting in an unexpected way - fix memory leak of additional extent data when qgroup reservation fails - do proper handling of slot search call when deleting root refs" * tag 'for-5.16-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: replace the BUG_ON in btrfs_del_root_ref with proper error handling btrfs: zoned: clear data relocation bg on zone finish btrfs: free exchange changeset on failures btrfs: fix re-dirty process of tree-log nodes btrfs: call mapping_set_error() on btree inode with a write error btrfs: clear extent buffer uptodate when we fail to write it btrfs: fail if fstrim_range->start == U64_MAX btrfs: fix error pointer dereference in btrfs_ioctl_rm_dev_v2()
2 parents e1b9681 + 8289ed9 commit 6f51352

File tree

7 files changed

+35
-10
lines changed

7 files changed

+35
-10
lines changed

fs/btrfs/delalloc-space.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,13 @@ int btrfs_check_data_free_space(struct btrfs_inode *inode,
143143

144144
/* Use new btrfs_qgroup_reserve_data to reserve precious data space. */
145145
ret = btrfs_qgroup_reserve_data(inode, reserved, start, len);
146-
if (ret < 0)
146+
if (ret < 0) {
147147
btrfs_free_reserved_data_space_noquota(fs_info, len);
148-
else
148+
extent_changeset_free(*reserved);
149+
*reserved = NULL;
150+
} else {
149151
ret = 0;
152+
}
150153
return ret;
151154
}
152155

@@ -452,8 +455,11 @@ int btrfs_delalloc_reserve_space(struct btrfs_inode *inode,
452455
if (ret < 0)
453456
return ret;
454457
ret = btrfs_delalloc_reserve_metadata(inode, len);
455-
if (ret < 0)
458+
if (ret < 0) {
456459
btrfs_free_reserved_data_space(inode, *reserved, start, len);
460+
extent_changeset_free(*reserved);
461+
*reserved = NULL;
462+
}
457463
return ret;
458464
}
459465

fs/btrfs/extent-tree.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6051,6 +6051,9 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
60516051
int dev_ret = 0;
60526052
int ret = 0;
60536053

6054+
if (range->start == U64_MAX)
6055+
return -EINVAL;
6056+
60546057
/*
60556058
* Check range overflow if range->len is set.
60566059
* The default range->len is U64_MAX.

fs/btrfs/extent_io.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4313,6 +4313,20 @@ static void set_btree_ioerr(struct page *page, struct extent_buffer *eb)
43134313
if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags))
43144314
return;
43154315

4316+
/*
4317+
* A read may stumble upon this buffer later, make sure that it gets an
4318+
* error and knows there was an error.
4319+
*/
4320+
clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
4321+
4322+
/*
4323+
* We need to set the mapping with the io error as well because a write
4324+
* error will flip the file system readonly, and then syncfs() will
4325+
* return a 0 because we are readonly if we don't modify the err seq for
4326+
* the superblock.
4327+
*/
4328+
mapping_set_error(page->mapping, -EIO);
4329+
43164330
/*
43174331
* If we error out, we should add back the dirty_metadata_bytes
43184332
* to make it consistent.

fs/btrfs/ioctl.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3187,10 +3187,8 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
31873187
return -EPERM;
31883188

31893189
vol_args = memdup_user(arg, sizeof(*vol_args));
3190-
if (IS_ERR(vol_args)) {
3191-
ret = PTR_ERR(vol_args);
3192-
goto out;
3193-
}
3190+
if (IS_ERR(vol_args))
3191+
return PTR_ERR(vol_args);
31943192

31953193
if (vol_args->flags & ~BTRFS_DEVICE_REMOVE_ARGS_MASK) {
31963194
ret = -EOPNOTSUPP;

fs/btrfs/root-tree.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,8 @@ int btrfs_del_root_ref(struct btrfs_trans_handle *trans, u64 root_id,
334334
key.offset = ref_id;
335335
again:
336336
ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
337-
BUG_ON(ret < 0);
337+
if (ret < 0)
338+
goto out;
338339
if (ret == 0) {
339340
leaf = path->nodes[0];
340341
ref = btrfs_item_ptr(leaf, path->slots[0],

fs/btrfs/tree-log.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,6 +2908,8 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
29082908
path->nodes[*level]->len);
29092909
if (ret)
29102910
return ret;
2911+
btrfs_redirty_list_add(trans->transaction,
2912+
next);
29112913
} else {
29122914
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
29132915
clear_extent_buffer_dirty(next);
@@ -2988,6 +2990,7 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
29882990
next->start, next->len);
29892991
if (ret)
29902992
goto out;
2993+
btrfs_redirty_list_add(trans->transaction, next);
29912994
} else {
29922995
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
29932996
clear_extent_buffer_dirty(next);
@@ -3438,8 +3441,6 @@ static void free_log_tree(struct btrfs_trans_handle *trans,
34383441
EXTENT_DIRTY | EXTENT_NEW | EXTENT_NEED_WAIT);
34393442
extent_io_tree_release(&log->log_csum_range);
34403443

3441-
if (trans && log->node)
3442-
btrfs_redirty_list_add(trans->transaction, log->node);
34433444
btrfs_put_root(log);
34443445
}
34453446

fs/btrfs/zoned.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,6 +1860,7 @@ int btrfs_zone_finish(struct btrfs_block_group *block_group)
18601860
block_group->alloc_offset = block_group->zone_capacity;
18611861
block_group->free_space_ctl->free_space = 0;
18621862
btrfs_clear_treelog_bg(block_group);
1863+
btrfs_clear_data_reloc_bg(block_group);
18631864
spin_unlock(&block_group->lock);
18641865

18651866
ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
@@ -1942,6 +1943,7 @@ void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 len
19421943
ASSERT(block_group->alloc_offset == block_group->zone_capacity);
19431944
ASSERT(block_group->free_space_ctl->free_space == 0);
19441945
btrfs_clear_treelog_bg(block_group);
1946+
btrfs_clear_data_reloc_bg(block_group);
19451947
spin_unlock(&block_group->lock);
19461948

19471949
map = block_group->physical_map;

0 commit comments

Comments
 (0)