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; |
