Skip to content

Commit 57512f9

Browse files
adam900710kdave
authored andcommitted
btrfs-progs: make btrfs_insert_file_extent() accept an on-stack file extent item
Just like insert_reserved_file_extent() from the kernel, we can make btrfs_insert_file_extent() accept an on-stack file extent item directly. This makes btrfs_insert_file_extent() more flex, and it can now handle the converted file extent where it has an non-zero offset. And this makes it much easier to expand for future compressed file extent generation. Signed-off-by: Qu Wenruo <wqu@suse.com>
1 parent 9590e5c commit 57512f9

File tree

5 files changed

+51
-69
lines changed

5 files changed

+51
-69
lines changed

convert/common.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -987,8 +987,7 @@ static int __btrfs_convert_file_extent(struct btrfs_trans_handle *trans,
987987
int ret;
988988
struct btrfs_fs_info *info = root->fs_info;
989989
struct btrfs_root *extent_root = btrfs_extent_root(info, disk_bytenr);
990-
struct extent_buffer *leaf;
991-
struct btrfs_file_extent_item *fi;
990+
struct btrfs_file_extent_item stack_fi = { 0 };
992991
struct btrfs_key ins_key;
993992
struct btrfs_path *path;
994993
struct btrfs_extent_item *ei;
@@ -1009,9 +1008,11 @@ static int __btrfs_convert_file_extent(struct btrfs_trans_handle *trans,
10091008
* hole. And hole extent has no size limit, no need to loop.
10101009
*/
10111010
if (disk_bytenr == 0) {
1011+
btrfs_set_stack_file_extent_type(&stack_fi, BTRFS_FILE_EXTENT_REG);
1012+
btrfs_set_stack_file_extent_num_bytes(&stack_fi, num_bytes);
1013+
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, num_bytes);
10121014
ret = btrfs_insert_file_extent(trans, root, objectid,
1013-
file_pos, disk_bytenr,
1014-
num_bytes, num_bytes);
1015+
file_pos, &stack_fi);
10151016
return ret;
10161017
}
10171018
num_bytes = min_t(u64, num_bytes, BTRFS_MAX_EXTENT_SIZE);
@@ -1052,6 +1053,8 @@ static int __btrfs_convert_file_extent(struct btrfs_trans_handle *trans,
10521053
ret = btrfs_insert_empty_item(trans, extent_root, path,
10531054
&ins_key, sizeof(*ei));
10541055
if (ret == 0) {
1056+
struct extent_buffer *leaf;
1057+
10551058
leaf = path->nodes[0];
10561059
ei = btrfs_item_ptr(leaf, path->slots[0],
10571060
struct btrfs_extent_item);
@@ -1083,26 +1086,18 @@ static int __btrfs_convert_file_extent(struct btrfs_trans_handle *trans,
10831086
ins_key.objectid = objectid;
10841087
ins_key.type = BTRFS_EXTENT_DATA_KEY;
10851088
ins_key.offset = file_pos;
1086-
ret = btrfs_insert_empty_item(trans, root, path, &ins_key, sizeof(*fi));
1089+
btrfs_set_stack_file_extent_type(&stack_fi, BTRFS_FILE_EXTENT_REG);
1090+
btrfs_set_stack_file_extent_disk_bytenr(&stack_fi, extent_bytenr);
1091+
btrfs_set_stack_file_extent_disk_num_bytes(&stack_fi, extent_num_bytes);
1092+
btrfs_set_stack_file_extent_offset(&stack_fi, extent_offset);
1093+
btrfs_set_stack_file_extent_num_bytes(&stack_fi, num_bytes);
1094+
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, extent_num_bytes);
1095+
ret = btrfs_insert_file_extent(trans, root, objectid, file_pos, &stack_fi);
10871096
if (ret)
10881097
goto fail;
1089-
leaf = path->nodes[0];
1090-
fi = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item);
1091-
btrfs_set_file_extent_generation(leaf, fi, trans->transid);
1092-
btrfs_set_file_extent_type(leaf, fi, BTRFS_FILE_EXTENT_REG);
1093-
btrfs_set_file_extent_disk_bytenr(leaf, fi, extent_bytenr);
1094-
btrfs_set_file_extent_disk_num_bytes(leaf, fi, extent_num_bytes);
1095-
btrfs_set_file_extent_offset(leaf, fi, extent_offset);
1096-
btrfs_set_file_extent_num_bytes(leaf, fi, num_bytes);
1097-
btrfs_set_file_extent_ram_bytes(leaf, fi, extent_num_bytes);
1098-
btrfs_set_file_extent_compression(leaf, fi, 0);
1099-
btrfs_set_file_extent_encryption(leaf, fi, 0);
1100-
btrfs_set_file_extent_other_encoding(leaf, fi, 0);
1101-
btrfs_mark_buffer_dirty(leaf);
11021098

11031099
nbytes = btrfs_stack_inode_nbytes(inode) + num_bytes;
11041100
btrfs_set_stack_inode_nbytes(inode, nbytes);
1105-
btrfs_release_path(path);
11061101

11071102
ret = btrfs_inc_extent_ref(trans, extent_bytenr, extent_num_bytes,
11081103
0, root->root_key.objectid, objectid,

kernel-shared/file-item.c

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,55 +33,31 @@
3333
size) - 1))
3434
int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
3535
struct btrfs_root *root,
36-
u64 objectid, u64 pos, u64 offset,
37-
u64 disk_num_bytes, u64 num_bytes)
36+
u64 ino, u64 file_pos,
37+
struct btrfs_file_extent_item *stack_fi)
3838
{
3939
int ret = 0;
4040
int is_hole = 0;
41-
struct btrfs_file_extent_item *item;
4241
struct btrfs_key file_key;
43-
struct btrfs_path *path;
44-
struct extent_buffer *leaf;
4542

46-
if (offset == 0)
43+
if (btrfs_stack_file_extent_disk_bytenr(stack_fi) == 0)
4744
is_hole = 1;
45+
4846
/* For NO_HOLES, we don't insert hole file extent */
4947
if (btrfs_fs_incompat(root->fs_info, NO_HOLES) && is_hole)
5048
return 0;
5149

5250
/* For hole, its disk_bytenr and disk_num_bytes must be 0 */
5351
if (is_hole)
54-
disk_num_bytes = 0;
55-
56-
path = btrfs_alloc_path();
57-
if (!path)
58-
return -ENOMEM;
52+
btrfs_set_stack_file_extent_disk_num_bytes(stack_fi, 0);
5953

60-
file_key.objectid = objectid;
54+
file_key.objectid = ino;
6155
file_key.type = BTRFS_EXTENT_DATA_KEY;
62-
file_key.offset = pos;
56+
file_key.offset = file_pos;
6357

64-
ret = btrfs_insert_empty_item(trans, root, path, &file_key,
65-
sizeof(*item));
66-
if (ret < 0)
67-
goto out;
68-
BUG_ON(ret);
69-
leaf = path->nodes[0];
70-
item = btrfs_item_ptr(leaf, path->slots[0],
71-
struct btrfs_file_extent_item);
72-
btrfs_set_file_extent_disk_bytenr(leaf, item, offset);
73-
btrfs_set_file_extent_disk_num_bytes(leaf, item, disk_num_bytes);
74-
btrfs_set_file_extent_offset(leaf, item, 0);
75-
btrfs_set_file_extent_num_bytes(leaf, item, num_bytes);
76-
btrfs_set_file_extent_ram_bytes(leaf, item, num_bytes);
77-
btrfs_set_file_extent_generation(leaf, item, trans->transid);
78-
btrfs_set_file_extent_type(leaf, item, BTRFS_FILE_EXTENT_REG);
79-
btrfs_set_file_extent_compression(leaf, item, 0);
80-
btrfs_set_file_extent_encryption(leaf, item, 0);
81-
btrfs_set_file_extent_other_encoding(leaf, item, 0);
82-
btrfs_mark_buffer_dirty(leaf);
83-
out:
84-
btrfs_free_path(path);
58+
btrfs_set_stack_file_extent_generation(stack_fi, trans->transid);
59+
ret = btrfs_insert_item(trans, root, &file_key, stack_fi,
60+
sizeof(struct btrfs_file_extent_item));
8561
return ret;
8662
}
8763

kernel-shared/file-item.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ u64 btrfs_file_extent_end(const struct btrfs_path *path);
8585
*/
8686
int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
8787
struct btrfs_root *root,
88-
u64 objectid, u64 pos, u64 offset,
89-
u64 disk_num_bytes, u64 num_bytes);
88+
u64 ino, u64 file_pos,
89+
struct btrfs_file_extent_item *stack_fi);
9090
int btrfs_csum_file_block(struct btrfs_trans_handle *trans, u64 logical,
9191
u64 csum_objectid, u32 csum_type, const char *data);
9292
int btrfs_insert_inline_extent(struct btrfs_trans_handle *trans,

kernel-shared/file.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ int btrfs_punch_hole(struct btrfs_trans_handle *trans,
152152
u64 ino, u64 offset, u64 len)
153153
{
154154
struct btrfs_path *path;
155+
struct btrfs_file_extent_item stack_fi = { 0 };
155156
int ret = 0;
156157

157158
path = btrfs_alloc_path();
@@ -166,7 +167,10 @@ int btrfs_punch_hole(struct btrfs_trans_handle *trans,
166167
goto out;
167168
}
168169

169-
ret = btrfs_insert_file_extent(trans, root, ino, offset, 0, 0, len);
170+
btrfs_set_stack_file_extent_type(&stack_fi, BTRFS_FILE_EXTENT_REG);
171+
btrfs_set_stack_file_extent_num_bytes(&stack_fi, len);
172+
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, len);
173+
ret = btrfs_insert_file_extent(trans, root, ino, offset, &stack_fi);
170174
out:
171175
btrfs_free_path(path);
172176
return ret;

mkfs/rootdir.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -366,36 +366,37 @@ static int add_symbolic_link(struct btrfs_trans_handle *trans,
366366
static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
367367
struct btrfs_root *root, u64 ino,
368368
struct btrfs_inode_item *inode,
369-
u64 file_pos, u64 disk_bytenr,
370-
u64 num_bytes)
369+
u64 file_pos,
370+
struct btrfs_file_extent_item *stack_fi)
371371
{
372372
struct btrfs_fs_info *fs_info = root->fs_info;
373-
struct btrfs_root *extent_root = btrfs_extent_root(fs_info, disk_bytenr);
373+
struct btrfs_root *extent_root;
374374
struct extent_buffer *leaf;
375375
struct btrfs_key ins_key;
376376
struct btrfs_path *path;
377377
struct btrfs_extent_item *ei;
378+
u64 disk_bytenr = btrfs_stack_file_extent_disk_bytenr(stack_fi);
379+
u64 disk_num_bytes = btrfs_stack_file_extent_disk_num_bytes(stack_fi);
380+
u64 num_bytes = btrfs_stack_file_extent_num_bytes(stack_fi);
378381
int ret;
379382

383+
extent_root = btrfs_extent_root(fs_info, disk_bytenr);
380384
/*
381385
* @ino should be an inode number, thus it must not be smaller
382386
* than BTRFS_FIRST_FREE_OBJECTID.
383387
*/
384388
UASSERT(ino >= BTRFS_FIRST_FREE_OBJECTID);
385389

386390
/* The reserved data extent should never exceed the upper limit. */
387-
UASSERT(num_bytes <= BTRFS_MAX_EXTENT_SIZE);
391+
UASSERT(disk_num_bytes <= BTRFS_MAX_EXTENT_SIZE);
388392

389393
/*
390394
* All supported file system should not use its 0 extent. As it's for
391395
* hole. And hole extent has no size limit, no need to loop.
392396
*/
393-
if (disk_bytenr == 0) {
394-
ret = btrfs_insert_file_extent(trans, root, ino,
395-
file_pos, disk_bytenr,
396-
num_bytes, num_bytes);
397-
return ret;
398-
}
397+
if (disk_bytenr == 0)
398+
return btrfs_insert_file_extent(trans, root, ino,
399+
file_pos, stack_fi);
399400

400401
path = btrfs_alloc_path();
401402
if (!path)
@@ -437,8 +438,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
437438
ins_key.objectid = ino;
438439
ins_key.type = BTRFS_EXTENT_DATA_KEY;
439440
ins_key.offset = file_pos;
440-
ret = btrfs_insert_file_extent(trans, root, ino, file_pos, disk_bytenr,
441-
num_bytes, num_bytes);
441+
ret = btrfs_insert_file_extent(trans, root, ino, file_pos, stack_fi);
442442
if (ret)
443443
goto fail;
444444
btrfs_set_stack_inode_nbytes(inode,
@@ -564,8 +564,15 @@ static int add_file_items(struct btrfs_trans_handle *trans,
564564
}
565565

566566
if (bytes_read) {
567+
struct btrfs_file_extent_item stack_fi = { 0 };
568+
569+
btrfs_set_stack_file_extent_type(&stack_fi, BTRFS_FILE_EXTENT_REG);
570+
btrfs_set_stack_file_extent_disk_bytenr(&stack_fi, first_block);
571+
btrfs_set_stack_file_extent_disk_num_bytes(&stack_fi, cur_bytes);
572+
btrfs_set_stack_file_extent_num_bytes(&stack_fi, cur_bytes);
573+
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, cur_bytes);
567574
ret = insert_reserved_file_extent(trans, root, objectid,
568-
btrfs_inode, file_pos, first_block, cur_bytes);
575+
btrfs_inode, file_pos, &stack_fi);
569576
if (ret)
570577
goto end;
571578

0 commit comments

Comments
 (0)