diff options
-rw-r--r-- | fs/btrfs/send.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 4d31f72bdf41..85259cba784a 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
@@ -4489,6 +4489,21 @@ static int maybe_send_hole(struct send_ctx *sctx, struct btrfs_path *path, | |||
4489 | extent_end = key->offset + | 4489 | extent_end = key->offset + |
4490 | btrfs_file_extent_num_bytes(path->nodes[0], fi); | 4490 | btrfs_file_extent_num_bytes(path->nodes[0], fi); |
4491 | } | 4491 | } |
4492 | |||
4493 | if (path->slots[0] == 0 && | ||
4494 | sctx->cur_inode_last_extent < key->offset) { | ||
4495 | /* | ||
4496 | * We might have skipped entire leafs that contained only | ||
4497 | * file extent items for our current inode. These leafs have | ||
4498 | * a generation number smaller (older) than the one in the | ||
4499 | * current leaf and the leaf our last extent came from, and | ||
4500 | * are located between these 2 leafs. | ||
4501 | */ | ||
4502 | ret = get_last_extent(sctx, key->offset - 1); | ||
4503 | if (ret) | ||
4504 | return ret; | ||
4505 | } | ||
4506 | |||
4492 | if (sctx->cur_inode_last_extent < key->offset) | 4507 | if (sctx->cur_inode_last_extent < key->offset) |
4493 | ret = send_hole(sctx, key->offset); | 4508 | ret = send_hole(sctx, key->offset); |
4494 | sctx->cur_inode_last_extent = extent_end; | 4509 | sctx->cur_inode_last_extent = extent_end; |