btrfs-progs: Introduce function to get correct stripe length

Introduce a new function, btrfs_get_chunk_stripe_len() to get correct
stripe length.
This is very handy for lowmem mode, which checks the mapping between
device extent and chunk item.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Qu Wenruo 2017-05-31 13:56:08 +08:00 committed by David Sterba
parent d07f45bc25
commit 6e7b1bbdec
2 changed files with 47 additions and 0 deletions

View File

@ -2287,3 +2287,47 @@ out:
return ret;
}
/*
* Get stripe length from chunk item and its stripe items
*
* Caller should only call this function after validating the chunk item
* by using btrfs_check_chunk_valid().
*/
u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
struct extent_buffer *leaf,
struct btrfs_chunk *chunk)
{
u64 stripe_len;
u64 chunk_len;
u32 num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
u64 profile = btrfs_chunk_type(leaf, chunk) &
BTRFS_BLOCK_GROUP_PROFILE_MASK;
chunk_len = btrfs_chunk_length(leaf, chunk);
switch (profile) {
case 0: /* Single profile */
case BTRFS_BLOCK_GROUP_RAID1:
case BTRFS_BLOCK_GROUP_DUP:
stripe_len = chunk_len;
break;
case BTRFS_BLOCK_GROUP_RAID0:
stripe_len = chunk_len / num_stripes;
break;
case BTRFS_BLOCK_GROUP_RAID5:
stripe_len = chunk_len / (num_stripes - 1);
break;
case BTRFS_BLOCK_GROUP_RAID6:
stripe_len = chunk_len / (num_stripes - 2);
break;
case BTRFS_BLOCK_GROUP_RAID10:
stripe_len = chunk_len / (num_stripes /
btrfs_chunk_sub_stripes(leaf, chunk));
break;
default:
/* Invalid chunk profile found */
BUG_ON(1);
}
return stripe_len;
}

View File

@ -246,4 +246,7 @@ int btrfs_check_chunk_valid(struct btrfs_root *root,
struct extent_buffer *leaf,
struct btrfs_chunk *chunk,
int slot, u64 logical);
u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
struct extent_buffer *leaf,
struct btrfs_chunk *chunk);
#endif