|
@@ -2905,12 +2905,14 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
|
|
* note the key will change type as we walk through the
|
|
* note the key will change type as we walk through the
|
|
* tree.
|
|
* tree.
|
|
*/
|
|
*/
|
|
|
|
+ path->leave_spinning = 1;
|
|
ret = btrfs_search_slot(NULL, BTRFS_I(src)->root, &key, path,
|
|
ret = btrfs_search_slot(NULL, BTRFS_I(src)->root, &key, path,
|
|
0, 0);
|
|
0, 0);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
nritems = btrfs_header_nritems(path->nodes[0]);
|
|
nritems = btrfs_header_nritems(path->nodes[0]);
|
|
|
|
+process_slot:
|
|
if (path->slots[0] >= nritems) {
|
|
if (path->slots[0] >= nritems) {
|
|
ret = btrfs_next_leaf(BTRFS_I(src)->root, path);
|
|
ret = btrfs_next_leaf(BTRFS_I(src)->root, path);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
@@ -2937,11 +2939,6 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
|
|
u8 comp;
|
|
u8 comp;
|
|
u64 endoff;
|
|
u64 endoff;
|
|
|
|
|
|
- size = btrfs_item_size_nr(leaf, slot);
|
|
|
|
- read_extent_buffer(leaf, buf,
|
|
|
|
- btrfs_item_ptr_offset(leaf, slot),
|
|
|
|
- size);
|
|
|
|
-
|
|
|
|
extent = btrfs_item_ptr(leaf, slot,
|
|
extent = btrfs_item_ptr(leaf, slot,
|
|
struct btrfs_file_extent_item);
|
|
struct btrfs_file_extent_item);
|
|
comp = btrfs_file_extent_compression(leaf, extent);
|
|
comp = btrfs_file_extent_compression(leaf, extent);
|
|
@@ -2960,11 +2957,20 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
|
|
datal = btrfs_file_extent_ram_bytes(leaf,
|
|
datal = btrfs_file_extent_ram_bytes(leaf,
|
|
extent);
|
|
extent);
|
|
}
|
|
}
|
|
- btrfs_release_path(path);
|
|
|
|
|
|
|
|
if (key.offset + datal <= off ||
|
|
if (key.offset + datal <= off ||
|
|
- key.offset >= off + len - 1)
|
|
|
|
- goto next;
|
|
|
|
|
|
+ key.offset >= off + len - 1) {
|
|
|
|
+ path->slots[0]++;
|
|
|
|
+ goto process_slot;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ size = btrfs_item_size_nr(leaf, slot);
|
|
|
|
+ read_extent_buffer(leaf, buf,
|
|
|
|
+ btrfs_item_ptr_offset(leaf, slot),
|
|
|
|
+ size);
|
|
|
|
+
|
|
|
|
+ btrfs_release_path(path);
|
|
|
|
+ path->leave_spinning = 0;
|
|
|
|
|
|
memcpy(&new_key, &key, sizeof(new_key));
|
|
memcpy(&new_key, &key, sizeof(new_key));
|
|
new_key.objectid = btrfs_ino(inode);
|
|
new_key.objectid = btrfs_ino(inode);
|
|
@@ -3135,7 +3141,6 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
|
|
}
|
|
}
|
|
ret = btrfs_end_transaction(trans, root);
|
|
ret = btrfs_end_transaction(trans, root);
|
|
}
|
|
}
|
|
-next:
|
|
|
|
btrfs_release_path(path);
|
|
btrfs_release_path(path);
|
|
key.offset++;
|
|
key.offset++;
|
|
}
|
|
}
|