1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright (C) 2023 Western Digital Corporation or its affiliates. |
4 | */ |
5 | |
6 | #ifndef BTRFS_RAID_STRIPE_TREE_H |
7 | #define BTRFS_RAID_STRIPE_TREE_H |
8 | |
9 | #include <linux/types.h> |
10 | #include <uapi/linux/btrfs_tree.h> |
11 | #include "fs.h" |
12 | |
13 | #define BTRFS_RST_SUPP_BLOCK_GROUP_MASK (BTRFS_BLOCK_GROUP_DUP | \ |
14 | BTRFS_BLOCK_GROUP_RAID1_MASK | \ |
15 | BTRFS_BLOCK_GROUP_RAID0 | \ |
16 | BTRFS_BLOCK_GROUP_RAID10) |
17 | |
18 | struct btrfs_io_context; |
19 | struct btrfs_io_stripe; |
20 | struct btrfs_fs_info; |
21 | struct btrfs_ordered_extent; |
22 | struct btrfs_trans_handle; |
23 | |
24 | int btrfs_delete_raid_extent(struct btrfs_trans_handle *trans, u64 start, u64 length); |
25 | int btrfs_get_raid_extent_offset(struct btrfs_fs_info *fs_info, |
26 | u64 logical, u64 *length, u64 map_type, |
27 | u32 stripe_index, struct btrfs_io_stripe *stripe); |
28 | int btrfs_insert_raid_extent(struct btrfs_trans_handle *trans, |
29 | struct btrfs_ordered_extent *ordered_extent); |
30 | |
31 | static inline bool btrfs_need_stripe_tree_update(struct btrfs_fs_info *fs_info, |
32 | u64 map_type) |
33 | { |
34 | u64 type = map_type & BTRFS_BLOCK_GROUP_TYPE_MASK; |
35 | u64 profile = map_type & BTRFS_BLOCK_GROUP_PROFILE_MASK; |
36 | |
37 | if (!btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE)) |
38 | return false; |
39 | |
40 | if (type != BTRFS_BLOCK_GROUP_DATA) |
41 | return false; |
42 | |
43 | if (profile & BTRFS_RST_SUPP_BLOCK_GROUP_MASK) |
44 | return true; |
45 | |
46 | return false; |
47 | } |
48 | |
49 | static inline int btrfs_num_raid_stripes(u32 item_size) |
50 | { |
51 | return (item_size - offsetof(struct btrfs_stripe_extent, strides)) / |
52 | sizeof(struct btrfs_raid_stride); |
53 | } |
54 | |
55 | #endif |
56 | |