uboot/fs/btrfs/volumes.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2
   3#ifndef __BTRFS_VOLUMES_H__
   4#define __BTRFS_VOLUMES_H__
   5
   6#include <fs_internal.h>
   7#include "ctree.h"
   8
   9#define BTRFS_STRIPE_LEN        SZ_64K
  10
  11struct btrfs_device {
  12        struct list_head dev_list;
  13        struct btrfs_root *dev_root;
  14        struct btrfs_fs_devices *fs_devices;
  15
  16        struct blk_desc *desc;
  17        struct disk_partition *part;
  18
  19        u64 total_devs;
  20        u64 super_bytes_used;
  21
  22        u64 generation;
  23
  24        /* the internal btrfs device id */
  25        u64 devid;
  26
  27        /* size of the device */
  28        u64 total_bytes;
  29
  30        /* bytes used */
  31        u64 bytes_used;
  32
  33        /* optimal io alignment for this device */
  34        u32 io_align;
  35
  36        /* optimal io width for this device */
  37        u32 io_width;
  38
  39        /* minimal io size for this device */
  40        u32 sector_size;
  41
  42        /* type and info about this device */
  43        u64 type;
  44
  45        /* physical drive uuid (or lvm uuid) */
  46        u8 uuid[BTRFS_UUID_SIZE];
  47};
  48
  49struct btrfs_fs_devices {
  50        u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
  51        u8 metadata_uuid[BTRFS_FSID_SIZE]; /* FS specific uuid */
  52
  53        u64 latest_devid;
  54        u64 lowest_devid;
  55        u64 latest_trans;
  56
  57        u64 total_rw_bytes;
  58
  59        struct list_head devices;
  60        struct list_head list;
  61
  62        int seeding;
  63        struct btrfs_fs_devices *seed;
  64};
  65
  66struct btrfs_bio_stripe {
  67        struct btrfs_device *dev;
  68        u64 physical;
  69};
  70
  71struct btrfs_multi_bio {
  72        int error;
  73        int num_stripes;
  74        struct btrfs_bio_stripe stripes[];
  75};
  76
  77struct map_lookup {
  78        struct cache_extent ce;
  79        u64 type;
  80        int io_align;
  81        int io_width;
  82        int stripe_len;
  83        int sector_size;
  84        int num_stripes;
  85        int sub_stripes;
  86        struct btrfs_bio_stripe stripes[];
  87};
  88
  89struct btrfs_raid_attr {
  90        int sub_stripes;        /* sub_stripes info for map */
  91        int dev_stripes;        /* stripes per dev */
  92        int devs_max;           /* max devs to use */
  93        int devs_min;           /* min devs needed */
  94        int tolerated_failures; /* max tolerated fail devs */
  95        int devs_increment;     /* ndevs has to be a multiple of this */
  96        int ncopies;            /* how many copies to data has */
  97        int nparity;            /* number of stripes worth of bytes to store
  98                                 * parity information */
  99        const char raid_name[8]; /* name of the raid */
 100        u64 bg_flag;            /* block group flag of the raid */
 101};
 102
 103extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES];
 104
 105static inline enum btrfs_raid_types btrfs_bg_flags_to_raid_index(u64 flags)
 106{
 107        if (flags & BTRFS_BLOCK_GROUP_RAID10)
 108                return BTRFS_RAID_RAID10;
 109        else if (flags & BTRFS_BLOCK_GROUP_RAID1)
 110                return BTRFS_RAID_RAID1;
 111        else if (flags & BTRFS_BLOCK_GROUP_RAID1C3)
 112                return BTRFS_RAID_RAID1C3;
 113        else if (flags & BTRFS_BLOCK_GROUP_RAID1C4)
 114                return BTRFS_RAID_RAID1C4;
 115        else if (flags & BTRFS_BLOCK_GROUP_DUP)
 116                return BTRFS_RAID_DUP;
 117        else if (flags & BTRFS_BLOCK_GROUP_RAID0)
 118                return BTRFS_RAID_RAID0;
 119        else if (flags & BTRFS_BLOCK_GROUP_RAID5)
 120                return BTRFS_RAID_RAID5;
 121        else if (flags & BTRFS_BLOCK_GROUP_RAID6)
 122                return BTRFS_RAID_RAID6;
 123
 124        return BTRFS_RAID_SINGLE; /* BTRFS_BLOCK_GROUP_SINGLE */
 125}
 126
 127#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
 128                            (sizeof(struct btrfs_bio_stripe) * (n)))
 129#define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
 130                                 (sizeof(struct btrfs_bio_stripe) * (n)))
 131
 132#define BTRFS_RAID5_P_STRIPE ((u64)-2)
 133#define BTRFS_RAID6_Q_STRIPE ((u64)-1)
 134
 135static inline u64 calc_stripe_length(u64 type, u64 length, int num_stripes)
 136{
 137        u64 stripe_size;
 138
 139        if (type & BTRFS_BLOCK_GROUP_RAID0) {
 140                stripe_size = length;
 141                stripe_size /= num_stripes;
 142        } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
 143                stripe_size = length * 2;
 144                stripe_size /= num_stripes;
 145        } else if (type & BTRFS_BLOCK_GROUP_RAID5) {
 146                stripe_size = length;
 147                stripe_size /= (num_stripes - 1);
 148        } else if (type & BTRFS_BLOCK_GROUP_RAID6) {
 149                stripe_size = length;
 150                stripe_size /= (num_stripes - 2);
 151        } else {
 152                stripe_size = length;
 153        }
 154        return stripe_size;
 155}
 156
 157#ifndef READ
 158#define READ 0
 159#define WRITE 1
 160#define READA 2
 161#endif
 162
 163int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
 164                      u64 logical, u64 *length, u64 *type,
 165                      struct btrfs_multi_bio **multi_ret, int mirror_num,
 166                      u64 **raid_map);
 167int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
 168                    u64 logical, u64 *length,
 169                    struct btrfs_multi_bio **multi_ret, int mirror_num,
 170                    u64 **raid_map_ret);
 171int btrfs_next_bg(struct btrfs_fs_info *map_tree, u64 *logical,
 172                     u64 *size, u64 type);
 173static inline int btrfs_next_bg_metadata(struct btrfs_fs_info *fs_info,
 174                                         u64 *logical, u64 *size)
 175{
 176        return btrfs_next_bg(fs_info, logical, size,
 177                        BTRFS_BLOCK_GROUP_METADATA);
 178}
 179static inline int btrfs_next_bg_system(struct btrfs_fs_info *fs_info,
 180                                       u64 *logical, u64 *size)
 181{
 182        return btrfs_next_bg(fs_info, logical, size,
 183                        BTRFS_BLOCK_GROUP_SYSTEM);
 184}
 185int btrfs_read_sys_array(struct btrfs_fs_info *fs_info);
 186int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info);
 187int btrfs_open_devices(struct btrfs_fs_devices *fs_devices);
 188int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
 189void btrfs_close_all_devices(void);
 190int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
 191int btrfs_scan_one_device(struct blk_desc *desc, struct disk_partition *part,
 192                          struct btrfs_fs_devices **fs_devices_ret,
 193                          u64 *total_devs);
 194struct list_head *btrfs_scanned_uuids(void);
 195struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
 196                                       u8 *uuid, u8 *fsid);
 197int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
 198                            struct extent_buffer *leaf,
 199                            struct btrfs_chunk *chunk,
 200                            int slot, u64 logical);
 201u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
 202                        struct extent_buffer *leaf,
 203                        struct btrfs_chunk *chunk);
 204#endif
 205