|
@@ -270,9 +270,27 @@ static int exclude_super_stripes(struct btrfs_root *root,
|
|
|
return ret;
|
|
|
|
|
|
while (nr--) {
|
|
|
- cache->bytes_super += stripe_len;
|
|
|
- ret = add_excluded_extent(root, logical[nr],
|
|
|
- stripe_len);
|
|
|
+ u64 start, len;
|
|
|
+
|
|
|
+ if (logical[nr] > cache->key.objectid +
|
|
|
+ cache->key.offset)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (logical[nr] + stripe_len <= cache->key.objectid)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ start = logical[nr];
|
|
|
+ if (start < cache->key.objectid) {
|
|
|
+ start = cache->key.objectid;
|
|
|
+ len = (logical[nr] + stripe_len) - start;
|
|
|
+ } else {
|
|
|
+ len = min_t(u64, stripe_len,
|
|
|
+ cache->key.objectid +
|
|
|
+ cache->key.offset - start);
|
|
|
+ }
|
|
|
+
|
|
|
+ cache->bytes_super += len;
|
|
|
+ ret = add_excluded_extent(root, start, len);
|
|
|
if (ret) {
|
|
|
kfree(logical);
|
|
|
return ret;
|