|
@@ -5184,13 +5184,19 @@ static int is_extent_unchanged(struct send_ctx *sctx,
|
|
|
while (key.offset < ekey->offset + left_len) {
|
|
|
ei = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
|
|
|
right_type = btrfs_file_extent_type(eb, ei);
|
|
|
- if (right_type != BTRFS_FILE_EXTENT_REG) {
|
|
|
+ if (right_type != BTRFS_FILE_EXTENT_REG &&
|
|
|
+ right_type != BTRFS_FILE_EXTENT_INLINE) {
|
|
|
ret = 0;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
right_disknr = btrfs_file_extent_disk_bytenr(eb, ei);
|
|
|
- right_len = btrfs_file_extent_num_bytes(eb, ei);
|
|
|
+ if (right_type == BTRFS_FILE_EXTENT_INLINE) {
|
|
|
+ right_len = btrfs_file_extent_inline_len(eb, slot, ei);
|
|
|
+ right_len = PAGE_ALIGN(right_len);
|
|
|
+ } else {
|
|
|
+ right_len = btrfs_file_extent_num_bytes(eb, ei);
|
|
|
+ }
|
|
|
right_offset = btrfs_file_extent_offset(eb, ei);
|
|
|
right_gen = btrfs_file_extent_generation(eb, ei);
|
|
|
|
|
@@ -5204,6 +5210,19 @@ static int is_extent_unchanged(struct send_ctx *sctx,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * We just wanted to see if when we have an inline extent, what
|
|
|
+ * follows it is a regular extent (wanted to check the above
|
|
|
+ * condition for inline extents too). This should normally not
|
|
|
+ * happen but it's possible for example when we have an inline
|
|
|
+ * compressed extent representing data with a size matching
|
|
|
+ * the page size (currently the same as sector size).
|
|
|
+ */
|
|
|
+ if (right_type == BTRFS_FILE_EXTENT_INLINE) {
|
|
|
+ ret = 0;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
left_offset_fixed = left_offset;
|
|
|
if (key.offset < ekey->offset) {
|
|
|
/* Fix the right offset for 2a and 7. */
|