| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright (C) 2023 Western Digital Corporation or its affiliates. | |
| */ | |
| #ifndef BTRFS_RAID_STRIPE_TREE_H | |
| #define BTRFS_RAID_STRIPE_TREE_H | |
| #include <linux/types.h> | |
| #include <uapi/linux/btrfs_tree.h> | |
| #include "fs.h" | |
| #include "accessors.h" | |
| #define BTRFS_RST_SUPP_BLOCK_GROUP_MASK (BTRFS_BLOCK_GROUP_DUP | \ | |
| BTRFS_BLOCK_GROUP_RAID1_MASK | \ | |
| BTRFS_BLOCK_GROUP_RAID0 | \ | |
| BTRFS_BLOCK_GROUP_RAID10) | |
| struct btrfs_io_context; | |
| struct btrfs_io_stripe; | |
| struct btrfs_fs_info; | |
| struct btrfs_ordered_extent; | |
| struct btrfs_trans_handle; | |
| int btrfs_delete_raid_extent(struct btrfs_trans_handle *trans, u64 start, u64 length); | |
| int btrfs_get_raid_extent_offset(struct btrfs_fs_info *fs_info, | |
| u64 logical, u64 *length, u64 map_type, | |
| u32 stripe_index, struct btrfs_io_stripe *stripe); | |
| int btrfs_insert_raid_extent(struct btrfs_trans_handle *trans, | |
| struct btrfs_ordered_extent *ordered_extent); | |
| void btrfs_cleanup_ordered_bioc_list(struct btrfs_ordered_extent *ordered); | |
| #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | |
| int btrfs_insert_one_raid_extent(struct btrfs_trans_handle *trans, | |
| struct btrfs_io_context *bioc); | |
| #endif | |
| static inline bool btrfs_need_stripe_tree_update(struct btrfs_fs_info *fs_info, | |
| u64 map_type) | |
| { | |
| u64 type = map_type & BTRFS_BLOCK_GROUP_TYPE_MASK; | |
| u64 profile = map_type & BTRFS_BLOCK_GROUP_PROFILE_MASK; | |
| if (!btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE)) | |
| return false; | |
| if (type != BTRFS_BLOCK_GROUP_DATA) | |
| return false; | |
| if (profile & BTRFS_RST_SUPP_BLOCK_GROUP_MASK) | |
| return true; | |
| return false; | |
| } | |
| static inline int btrfs_num_raid_stripes(u32 item_size) | |
| { | |
| return item_size / sizeof(struct btrfs_raid_stride); | |
| } | |
| #endif |