From 4305d024938113df5d73021a09eb2a991f54ca2f Mon Sep 17 00:00:00 2001 From: Dimitri John Ledkov Date: Mon, 13 Feb 2017 11:24:33 +0000 Subject: New upstream release Closes: #849353, #817806, #854915, #845473 --- volumes.h | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'volumes.h') diff --git a/volumes.h b/volumes.h index d7b7d3cc..ee7d56ab 100644 --- a/volumes.h +++ b/volumes.h @@ -155,11 +155,28 @@ struct map_lookup { * Check if the given range cross stripes. * To ensure kernel scrub won't causing bug on with METADATA in mixed * block group + * + * Return 1 if the range crosses STRIPE boundary + * Return 0 if the range doesn't cross STRIPE boundary or it + * doesn't belong to any block group (no boundary to cross) */ -static inline int check_crossing_stripes(u64 start, u64 len) +static inline int check_crossing_stripes(struct btrfs_fs_info *fs_info, + u64 start, u64 len) { - return (start / BTRFS_STRIPE_LEN) != - ((start + len - 1) / BTRFS_STRIPE_LEN); + struct btrfs_block_group_cache *bg_cache; + u64 bg_offset; + + bg_cache = btrfs_lookup_block_group(fs_info, start); + /* + * Does not belong to block group, no boundary to cross + * although it's a bigger problem, but here we don't care. + */ + if (!bg_cache) + return 0; + bg_offset = start - bg_cache->key.objectid; + + return (bg_offset / BTRFS_STRIPE_LEN != + (bg_offset + len - 1) / BTRFS_STRIPE_LEN); } int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw, -- cgit v1.2.3