OSDN Git Service

btrfs: send: update comment at find_extent_clone()
authorFilipe Manana <fdmanana@suse.com>
Tue, 1 Nov 2022 16:15:42 +0000 (16:15 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 5 Dec 2022 17:00:49 +0000 (18:00 +0100)
We have this unclear comment at find_extent_clone() about extents starting
at a file offset greater than or equals to the i_size of the inode. It's
not really informative and it's misleading, since it mentions the author
found such extents with snapshots and large files.

Such extents are a result of fallocate with FALLOC_FL_KEEP_SIZE and there
is no relation to snapshots or large files (all write paths update the
i_size before inserting a new file extent item). So update the comment to
be precise about it and why we don't bother looking for clone sources in
that case.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/send.c

index d1388d5..4ce5c15 100644 (file)
@@ -1365,14 +1365,14 @@ static int find_extent_clone(struct send_ctx *sctx,
        int compressed;
        u32 i;
 
-       if (data_offset >= ino_size) {
-               /*
-                * There may be extents that lie behind the file's size.
-                * I at least had this in combination with snapshotting while
-                * writing large files.
-                */
+       /*
+        * With fallocate we can get prealloc extents beyond the inode's i_size,
+        * so we don't do anything here because clone operations can not clone
+        * to a range beyond i_size without increasing the i_size of the
+        * destination inode.
+        */
+       if (data_offset >= ino_size)
                return 0;
-       }
 
        fi = btrfs_item_ptr(eb, path->slots[0], struct btrfs_file_extent_item);
        extent_type = btrfs_file_extent_type(eb, fi);