mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 02:44:41 +01:00
Handle the preliminary work for relocating a block group in a filesystem with the remap-tree flag set. If the block group is SYSTEM btrfs_relocate_block_group() proceeds as it does already, as bootstrapping issues mean that these block groups have to be processed the existing way. Similarly with METADATA_REMAP blocks, which are dealt with in a later patch. Otherwise we walk the free-space tree for the block group in question, recording any holes. These get converted into identity remaps and placed in the remap tree, and the block group's REMAPPED flag is set. From now on no new allocations are possible within this block group, and any I/O to it will be funnelled through btrfs_translate_remap(). We store the number of identity remaps in `identity_remap_count`, so that we know when we've removed the last one and the block group is fully remapped. The change in btrfs_read_roots() is because data relocations no longer rely on the data reloc tree as a hidden subvolume in which to do snapshots. (Thanks to Sun YangKai for his suggestions.) Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: Mark Harmstone <mark@harmstone.com> Signed-off-by: David Sterba <dsterba@suse.com>
52 lines
1.9 KiB
C
52 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef BTRFS_RELOCATION_H
|
|
#define BTRFS_RELOCATION_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct extent_buffer;
|
|
struct btrfs_fs_info;
|
|
struct btrfs_root;
|
|
struct btrfs_trans_handle;
|
|
struct btrfs_ordered_extent;
|
|
struct btrfs_pending_snapshot;
|
|
|
|
static inline bool should_relocate_using_remap_tree(const struct btrfs_block_group *bg)
|
|
{
|
|
if (!btrfs_fs_incompat(bg->fs_info, REMAP_TREE))
|
|
return false;
|
|
|
|
if (bg->flags & (BTRFS_BLOCK_GROUP_SYSTEM | BTRFS_BLOCK_GROUP_METADATA_REMAP))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start,
|
|
bool verbose);
|
|
int btrfs_init_reloc_root(struct btrfs_trans_handle *trans, struct btrfs_root *root);
|
|
int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root);
|
|
int btrfs_recover_relocation(struct btrfs_fs_info *fs_info);
|
|
int btrfs_reloc_clone_csums(struct btrfs_ordered_extent *ordered);
|
|
int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root,
|
|
const struct extent_buffer *buf,
|
|
struct extent_buffer *cow);
|
|
void btrfs_reloc_pre_snapshot(struct btrfs_pending_snapshot *pending,
|
|
u64 *bytes_to_reserve);
|
|
int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
|
|
struct btrfs_pending_snapshot *pending);
|
|
int btrfs_should_cancel_balance(const struct btrfs_fs_info *fs_info);
|
|
struct btrfs_root *find_reloc_root(struct btrfs_fs_info *fs_info, u64 bytenr);
|
|
bool btrfs_should_ignore_reloc_root(const struct btrfs_root *root);
|
|
u64 btrfs_get_reloc_bg_bytenr(const struct btrfs_fs_info *fs_info);
|
|
int btrfs_translate_remap(struct btrfs_fs_info *fs_info, u64 *logical, u64 *length);
|
|
int btrfs_remove_extent_from_remap_tree(struct btrfs_trans_handle *trans,
|
|
struct btrfs_path *path,
|
|
u64 bytenr, u64 num_bytes);
|
|
int btrfs_last_identity_remap_gone(struct btrfs_chunk_map *chunk_map,
|
|
struct btrfs_block_group *bg);
|
|
|
|
#endif
|