Skip to content

Commit b6f456a

Browse files
committed
Merge tag 'for-6.17-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from David Sterba: - in zoned mode, turn assertion to proper code when reserving space in relocation block group - fix search key of extended ref (hardlink) when replaying log - fix initialization of file extent tree on filesystems without no-holes feature - add harmless data race annotation to block group comparator * tag 'for-6.17-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: annotate block group access with data_race() when sorting for reclaim btrfs: initialize inode::file_extent_tree after i_mode has been set btrfs: zoned: fix incorrect ASSERT in btrfs_zoned_reserve_data_reloc_bg() btrfs: fix invalid extref key setup when replaying dentry
2 parents 5aca796 + 80eb65c commit b6f456a

File tree

5 files changed

+15
-12
lines changed

5 files changed

+15
-12
lines changed

fs/btrfs/block-group.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1795,7 +1795,14 @@ static int reclaim_bgs_cmp(void *unused, const struct list_head *a,
17951795
bg1 = list_entry(a, struct btrfs_block_group, bg_list);
17961796
bg2 = list_entry(b, struct btrfs_block_group, bg_list);
17971797

1798-
return bg1->used > bg2->used;
1798+
/*
1799+
* Some other task may be updating the ->used field concurrently, but it
1800+
* is not serious if we get a stale value or load/store tearing issues,
1801+
* as sorting the list of block groups to reclaim is not critical and an
1802+
* occasional imperfect order is ok. So silence KCSAN and avoid the
1803+
* overhead of locking or any other synchronization.
1804+
*/
1805+
return data_race(bg1->used > bg2->used);
17991806
}
18001807

18011808
static inline bool btrfs_should_reclaim(const struct btrfs_fs_info *fs_info)

fs/btrfs/delayed-inode.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,7 +1843,6 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,
18431843

18441844
int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)
18451845
{
1846-
struct btrfs_fs_info *fs_info = inode->root->fs_info;
18471846
struct btrfs_delayed_node *delayed_node;
18481847
struct btrfs_inode_item *inode_item;
18491848
struct inode *vfs_inode = &inode->vfs_inode;
@@ -1864,8 +1863,6 @@ int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)
18641863
i_uid_write(vfs_inode, btrfs_stack_inode_uid(inode_item));
18651864
i_gid_write(vfs_inode, btrfs_stack_inode_gid(inode_item));
18661865
btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item));
1867-
btrfs_inode_set_file_extent_range(inode, 0,
1868-
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
18691866
vfs_inode->i_mode = btrfs_stack_inode_mode(inode_item);
18701867
set_nlink(vfs_inode, btrfs_stack_inode_nlink(inode_item));
18711868
inode_set_bytes(vfs_inode, btrfs_stack_inode_nbytes(inode_item));

fs/btrfs/inode.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3885,10 +3885,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
38853885
bool filled = false;
38863886
int first_xattr_slot;
38873887

3888-
ret = btrfs_init_file_extent_tree(inode);
3889-
if (ret)
3890-
goto out;
3891-
38923888
ret = btrfs_fill_inode(inode, &rdev);
38933889
if (!ret)
38943890
filled = true;
@@ -3920,8 +3916,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
39203916
i_uid_write(vfs_inode, btrfs_inode_uid(leaf, inode_item));
39213917
i_gid_write(vfs_inode, btrfs_inode_gid(leaf, inode_item));
39223918
btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item));
3923-
btrfs_inode_set_file_extent_range(inode, 0,
3924-
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
39253919

39263920
inode_set_atime(vfs_inode, btrfs_timespec_sec(leaf, &inode_item->atime),
39273921
btrfs_timespec_nsec(leaf, &inode_item->atime));
@@ -3953,6 +3947,11 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
39533947
btrfs_set_inode_mapping_order(inode);
39543948

39553949
cache_index:
3950+
ret = btrfs_init_file_extent_tree(inode);
3951+
if (ret)
3952+
goto out;
3953+
btrfs_inode_set_file_extent_range(inode, 0,
3954+
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
39563955
/*
39573956
* If we were modified in the current generation and evicted from memory
39583957
* and then re-read we need to do a full sync since we don't have any

fs/btrfs/tree-log.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1964,7 +1964,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
19641964

19651965
search_key.objectid = log_key.objectid;
19661966
search_key.type = BTRFS_INODE_EXTREF_KEY;
1967-
search_key.offset = key->objectid;
1967+
search_key.offset = btrfs_extref_hash(key->objectid, name.name, name.len);
19681968
ret = backref_in_log(root->log_root, &search_key, key->objectid, &name);
19691969
if (ret < 0) {
19701970
goto out;

fs/btrfs/zoned.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2582,9 +2582,9 @@ void btrfs_zoned_reserve_data_reloc_bg(struct btrfs_fs_info *fs_info)
25822582
spin_lock(&space_info->lock);
25832583
space_info->total_bytes -= bg->length;
25842584
space_info->disk_total -= bg->length * factor;
2585+
space_info->disk_total -= bg->zone_unusable;
25852586
/* There is no allocation ever happened. */
25862587
ASSERT(bg->used == 0);
2587-
ASSERT(bg->zone_unusable == 0);
25882588
/* No super block in a block group on the zoned setup. */
25892589
ASSERT(bg->bytes_super == 0);
25902590
spin_unlock(&space_info->lock);

0 commit comments

Comments
 (0)