Skip to content

Commit cb36a9b

Browse files
osandovkdave
authored andcommitted
btrfs: add ram_bytes and offset to btrfs_ordered_extent
Currently, we only create ordered extents when ram_bytes == num_bytes and offset == 0. However, BTRFS_IOC_ENCODED_WRITE writes may create extents which only refer to a subset of the full unencoded extent, so we need to plumb these fields through the ordered extent infrastructure and pass them down to insert_reserved_file_extent(). Since we're changing the btrfs_add_ordered_extent* signature, let's get rid of the trivial wrappers and add a kernel-doc. Reviewed-by: Nikolay Borisov <[email protected]> Reviewed-by: Josef Bacik <[email protected]> Signed-off-by: Omar Sandoval <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent e331f6b commit cb36a9b

File tree

3 files changed

+83
-117
lines changed

3 files changed

+83
-117
lines changed

fs/btrfs/inode.c

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -985,11 +985,14 @@ static int submit_one_async_extent(struct btrfs_inode *inode,
985985
}
986986
free_extent_map(em);
987987

988-
ret = btrfs_add_ordered_extent_compress(inode, start, /* file_offset */
989-
ins.objectid, /* disk_bytenr */
990-
async_extent->ram_size, /* num_bytes */
991-
ins.offset, /* disk_num_bytes */
992-
async_extent->compress_type);
988+
ret = btrfs_add_ordered_extent(inode, start, /* file_offset */
989+
async_extent->ram_size, /* num_bytes */
990+
async_extent->ram_size, /* ram_bytes */
991+
ins.objectid, /* disk_bytenr */
992+
ins.offset, /* disk_num_bytes */
993+
0, /* offset */
994+
1 << BTRFS_ORDERED_COMPRESSED,
995+
async_extent->compress_type);
993996
if (ret) {
994997
btrfs_drop_extent_cache(inode, start, end, 0);
995998
goto out_free_reserve;
@@ -1238,9 +1241,10 @@ static noinline int cow_file_range(struct btrfs_inode *inode,
12381241
}
12391242
free_extent_map(em);
12401243

1241-
ret = btrfs_add_ordered_extent(inode, start, ins.objectid,
1242-
ram_size, cur_alloc_size,
1243-
BTRFS_ORDERED_REGULAR);
1244+
ret = btrfs_add_ordered_extent(inode, start, ram_size, ram_size,
1245+
ins.objectid, cur_alloc_size, 0,
1246+
1 << BTRFS_ORDERED_REGULAR,
1247+
BTRFS_COMPRESS_NONE);
12441248
if (ret)
12451249
goto out_drop_extent_cache;
12461250

@@ -1899,10 +1903,11 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
18991903
goto error;
19001904
}
19011905
free_extent_map(em);
1902-
ret = btrfs_add_ordered_extent(inode, cur_offset,
1903-
disk_bytenr, num_bytes,
1904-
num_bytes,
1905-
BTRFS_ORDERED_PREALLOC);
1906+
ret = btrfs_add_ordered_extent(inode,
1907+
cur_offset, num_bytes, num_bytes,
1908+
disk_bytenr, num_bytes, 0,
1909+
1 << BTRFS_ORDERED_PREALLOC,
1910+
BTRFS_COMPRESS_NONE);
19061911
if (ret) {
19071912
btrfs_drop_extent_cache(inode, cur_offset,
19081913
cur_offset + num_bytes - 1,
@@ -1911,9 +1916,11 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
19111916
}
19121917
} else {
19131918
ret = btrfs_add_ordered_extent(inode, cur_offset,
1919+
num_bytes, num_bytes,
19141920
disk_bytenr, num_bytes,
1915-
num_bytes,
1916-
BTRFS_ORDERED_NOCOW);
1921+
0,
1922+
1 << BTRFS_ORDERED_NOCOW,
1923+
BTRFS_COMPRESS_NONE);
19171924
if (ret)
19181925
goto error;
19191926
}
@@ -2874,6 +2881,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
28742881
struct btrfs_key ins;
28752882
u64 disk_num_bytes = btrfs_stack_file_extent_disk_num_bytes(stack_fi);
28762883
u64 disk_bytenr = btrfs_stack_file_extent_disk_bytenr(stack_fi);
2884+
u64 offset = btrfs_stack_file_extent_offset(stack_fi);
28772885
u64 num_bytes = btrfs_stack_file_extent_num_bytes(stack_fi);
28782886
u64 ram_bytes = btrfs_stack_file_extent_ram_bytes(stack_fi);
28792887
struct btrfs_drop_extents_args drop_args = { 0 };
@@ -2948,7 +2956,8 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
29482956
goto out;
29492957

29502958
ret = btrfs_alloc_reserved_file_extent(trans, root, btrfs_ino(inode),
2951-
file_pos, qgroup_reserved, &ins);
2959+
file_pos - offset,
2960+
qgroup_reserved, &ins);
29522961
out:
29532962
btrfs_free_path(path);
29542963

@@ -2974,20 +2983,20 @@ static int insert_ordered_extent_file_extent(struct btrfs_trans_handle *trans,
29742983
struct btrfs_ordered_extent *oe)
29752984
{
29762985
struct btrfs_file_extent_item stack_fi;
2977-
u64 logical_len;
29782986
bool update_inode_bytes;
2987+
u64 num_bytes = oe->num_bytes;
2988+
u64 ram_bytes = oe->ram_bytes;
29792989

29802990
memset(&stack_fi, 0, sizeof(stack_fi));
29812991
btrfs_set_stack_file_extent_type(&stack_fi, BTRFS_FILE_EXTENT_REG);
29822992
btrfs_set_stack_file_extent_disk_bytenr(&stack_fi, oe->disk_bytenr);
29832993
btrfs_set_stack_file_extent_disk_num_bytes(&stack_fi,
29842994
oe->disk_num_bytes);
2995+
btrfs_set_stack_file_extent_offset(&stack_fi, oe->offset);
29852996
if (test_bit(BTRFS_ORDERED_TRUNCATED, &oe->flags))
2986-
logical_len = oe->truncated_len;
2987-
else
2988-
logical_len = oe->num_bytes;
2989-
btrfs_set_stack_file_extent_num_bytes(&stack_fi, logical_len);
2990-
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, logical_len);
2997+
num_bytes = ram_bytes = oe->truncated_len;
2998+
btrfs_set_stack_file_extent_num_bytes(&stack_fi, num_bytes);
2999+
btrfs_set_stack_file_extent_ram_bytes(&stack_fi, ram_bytes);
29913000
btrfs_set_stack_file_extent_compression(&stack_fi, oe->compress_type);
29923001
/* Encryption and other encoding is reserved and all 0 */
29933002

@@ -7054,8 +7063,11 @@ static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode,
70547063
if (IS_ERR(em))
70557064
goto out;
70567065
}
7057-
ret = btrfs_add_ordered_extent_dio(inode, start, block_start, len,
7058-
block_len, type);
7066+
ret = btrfs_add_ordered_extent(inode, start, len, len, block_start,
7067+
block_len, 0,
7068+
(1 << type) |
7069+
(1 << BTRFS_ORDERED_DIRECT),
7070+
BTRFS_COMPRESS_NONE);
70597071
if (ret) {
70607072
if (em) {
70617073
free_extent_map(em);

fs/btrfs/ordered-data.c

Lines changed: 35 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,28 @@ static inline struct rb_node *tree_search(struct btrfs_ordered_inode_tree *tree,
143143
return ret;
144144
}
145145

146-
/*
147-
* Allocate and add a new ordered_extent into the per-inode tree.
146+
/**
147+
* Add an ordered extent to the per-inode tree.
148+
*
149+
* @inode: Inode that this extent is for.
150+
* @file_offset: Logical offset in file where the extent starts.
151+
* @num_bytes: Logical length of extent in file.
152+
* @ram_bytes: Full length of unencoded data.
153+
* @disk_bytenr: Offset of extent on disk.
154+
* @disk_num_bytes: Size of extent on disk.
155+
* @offset: Offset into unencoded data where file data starts.
156+
* @flags: Flags specifying type of extent (1 << BTRFS_ORDERED_*).
157+
* @compress_type: Compression algorithm used for data.
158+
*
159+
* Most of these parameters correspond to &struct btrfs_file_extent_item. The
160+
* tree is given a single reference on the ordered extent that was inserted.
148161
*
149-
* The tree is given a single reference on the ordered extent that was
150-
* inserted.
162+
* Return: 0 or -ENOMEM.
151163
*/
152-
static int __btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset,
153-
u64 disk_bytenr, u64 num_bytes,
154-
u64 disk_num_bytes, int type, int dio,
155-
int compress_type)
164+
int btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset,
165+
u64 num_bytes, u64 ram_bytes, u64 disk_bytenr,
166+
u64 disk_num_bytes, u64 offset, unsigned flags,
167+
int compress_type)
156168
{
157169
struct btrfs_root *root = inode->root;
158170
struct btrfs_fs_info *fs_info = root->fs_info;
@@ -161,7 +173,8 @@ static int __btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset
161173
struct btrfs_ordered_extent *entry;
162174
int ret;
163175

164-
if (type == BTRFS_ORDERED_NOCOW || type == BTRFS_ORDERED_PREALLOC) {
176+
if (flags &
177+
((1 << BTRFS_ORDERED_NOCOW) | (1 << BTRFS_ORDERED_PREALLOC))) {
165178
/* For nocow write, we can release the qgroup rsv right now */
166179
ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes);
167180
if (ret < 0)
@@ -181,28 +194,24 @@ static int __btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset
181194
return -ENOMEM;
182195

183196
entry->file_offset = file_offset;
184-
entry->disk_bytenr = disk_bytenr;
185197
entry->num_bytes = num_bytes;
198+
entry->ram_bytes = ram_bytes;
199+
entry->disk_bytenr = disk_bytenr;
186200
entry->disk_num_bytes = disk_num_bytes;
201+
entry->offset = offset;
187202
entry->bytes_left = num_bytes;
188203
entry->inode = igrab(&inode->vfs_inode);
189204
entry->compress_type = compress_type;
190205
entry->truncated_len = (u64)-1;
191206
entry->qgroup_rsv = ret;
192207
entry->physical = (u64)-1;
193208

194-
ASSERT(type == BTRFS_ORDERED_REGULAR ||
195-
type == BTRFS_ORDERED_NOCOW ||
196-
type == BTRFS_ORDERED_PREALLOC ||
197-
type == BTRFS_ORDERED_COMPRESSED);
198-
set_bit(type, &entry->flags);
209+
ASSERT((flags & ~BTRFS_ORDERED_TYPE_FLAGS) == 0);
210+
entry->flags = flags;
199211

200212
percpu_counter_add_batch(&fs_info->ordered_bytes, num_bytes,
201213
fs_info->delalloc_batch);
202214

203-
if (dio)
204-
set_bit(BTRFS_ORDERED_DIRECT, &entry->flags);
205-
206215
/* one ref for the tree */
207216
refcount_set(&entry->refs, 1);
208217
init_waitqueue_head(&entry->wait);
@@ -247,41 +256,6 @@ static int __btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset
247256
return 0;
248257
}
249258

250-
int btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset,
251-
u64 disk_bytenr, u64 num_bytes, u64 disk_num_bytes,
252-
int type)
253-
{
254-
ASSERT(type == BTRFS_ORDERED_REGULAR ||
255-
type == BTRFS_ORDERED_NOCOW ||
256-
type == BTRFS_ORDERED_PREALLOC);
257-
return __btrfs_add_ordered_extent(inode, file_offset, disk_bytenr,
258-
num_bytes, disk_num_bytes, type, 0,
259-
BTRFS_COMPRESS_NONE);
260-
}
261-
262-
int btrfs_add_ordered_extent_dio(struct btrfs_inode *inode, u64 file_offset,
263-
u64 disk_bytenr, u64 num_bytes,
264-
u64 disk_num_bytes, int type)
265-
{
266-
ASSERT(type == BTRFS_ORDERED_REGULAR ||
267-
type == BTRFS_ORDERED_NOCOW ||
268-
type == BTRFS_ORDERED_PREALLOC);
269-
return __btrfs_add_ordered_extent(inode, file_offset, disk_bytenr,
270-
num_bytes, disk_num_bytes, type, 1,
271-
BTRFS_COMPRESS_NONE);
272-
}
273-
274-
int btrfs_add_ordered_extent_compress(struct btrfs_inode *inode, u64 file_offset,
275-
u64 disk_bytenr, u64 num_bytes,
276-
u64 disk_num_bytes, int compress_type)
277-
{
278-
ASSERT(compress_type != BTRFS_COMPRESS_NONE);
279-
return __btrfs_add_ordered_extent(inode, file_offset, disk_bytenr,
280-
num_bytes, disk_num_bytes,
281-
BTRFS_ORDERED_COMPRESSED, 0,
282-
compress_type);
283-
}
284-
285259
/*
286260
* Add a struct btrfs_ordered_sum into the list of checksums to be inserted
287261
* when an ordered extent is finished. If the list covers more than one
@@ -1052,42 +1026,18 @@ static int clone_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pos,
10521026
struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
10531027
u64 file_offset = ordered->file_offset + pos;
10541028
u64 disk_bytenr = ordered->disk_bytenr + pos;
1055-
u64 num_bytes = len;
1056-
u64 disk_num_bytes = len;
1057-
int type;
1058-
unsigned long flags_masked = ordered->flags & ~(1 << BTRFS_ORDERED_DIRECT);
1059-
int compress_type = ordered->compress_type;
1060-
unsigned long weight;
1061-
int ret;
1062-
1063-
weight = hweight_long(flags_masked);
1064-
WARN_ON_ONCE(weight > 1);
1065-
if (!weight)
1066-
type = 0;
1067-
else
1068-
type = __ffs(flags_masked);
1029+
unsigned long flags = ordered->flags & BTRFS_ORDERED_TYPE_FLAGS;
10691030

10701031
/*
1071-
* The splitting extent is already counted and will be added again
1072-
* in btrfs_add_ordered_extent_*(). Subtract num_bytes to avoid
1073-
* double counting.
1032+
* The splitting extent is already counted and will be added again in
1033+
* btrfs_add_ordered_extent_*(). Subtract len to avoid double counting.
10741034
*/
1075-
percpu_counter_add_batch(&fs_info->ordered_bytes, -num_bytes,
1035+
percpu_counter_add_batch(&fs_info->ordered_bytes, -len,
10761036
fs_info->delalloc_batch);
1077-
if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered->flags)) {
1078-
WARN_ON_ONCE(1);
1079-
ret = btrfs_add_ordered_extent_compress(BTRFS_I(inode),
1080-
file_offset, disk_bytenr, num_bytes,
1081-
disk_num_bytes, compress_type);
1082-
} else if (test_bit(BTRFS_ORDERED_DIRECT, &ordered->flags)) {
1083-
ret = btrfs_add_ordered_extent_dio(BTRFS_I(inode), file_offset,
1084-
disk_bytenr, num_bytes, disk_num_bytes, type);
1085-
} else {
1086-
ret = btrfs_add_ordered_extent(BTRFS_I(inode), file_offset,
1087-
disk_bytenr, num_bytes, disk_num_bytes, type);
1088-
}
1089-
1090-
return ret;
1037+
WARN_ON_ONCE(flags & (1 << BTRFS_ORDERED_COMPRESSED));
1038+
return btrfs_add_ordered_extent(BTRFS_I(inode), file_offset, len, len,
1039+
disk_bytenr, len, 0, flags,
1040+
ordered->compress_type);
10911041
}
10921042

10931043
int btrfs_split_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pre,

fs/btrfs/ordered-data.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ enum {
7676
BTRFS_ORDERED_PENDING,
7777
};
7878

79+
/* BTRFS_ORDERED_* flags that specify the type of the extent. */
80+
#define BTRFS_ORDERED_TYPE_FLAGS ((1UL << BTRFS_ORDERED_REGULAR) | \
81+
(1UL << BTRFS_ORDERED_NOCOW) | \
82+
(1UL << BTRFS_ORDERED_PREALLOC) | \
83+
(1UL << BTRFS_ORDERED_COMPRESSED) | \
84+
(1UL << BTRFS_ORDERED_DIRECT))
85+
7986
struct btrfs_ordered_extent {
8087
/* logical offset in the file */
8188
u64 file_offset;
@@ -84,9 +91,11 @@ struct btrfs_ordered_extent {
8491
* These fields directly correspond to the same fields in
8592
* btrfs_file_extent_item.
8693
*/
87-
u64 disk_bytenr;
8894
u64 num_bytes;
95+
u64 ram_bytes;
96+
u64 disk_bytenr;
8997
u64 disk_num_bytes;
98+
u64 offset;
9099

91100
/* number of bytes that still need writing */
92101
u64 bytes_left;
@@ -179,14 +188,9 @@ bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
179188
struct btrfs_ordered_extent **cached,
180189
u64 file_offset, u64 io_size);
181190
int btrfs_add_ordered_extent(struct btrfs_inode *inode, u64 file_offset,
182-
u64 disk_bytenr, u64 num_bytes, u64 disk_num_bytes,
183-
int type);
184-
int btrfs_add_ordered_extent_dio(struct btrfs_inode *inode, u64 file_offset,
185-
u64 disk_bytenr, u64 num_bytes,
186-
u64 disk_num_bytes, int type);
187-
int btrfs_add_ordered_extent_compress(struct btrfs_inode *inode, u64 file_offset,
188-
u64 disk_bytenr, u64 num_bytes,
189-
u64 disk_num_bytes, int compress_type);
191+
u64 num_bytes, u64 ram_bytes, u64 disk_bytenr,
192+
u64 disk_num_bytes, u64 offset, unsigned flags,
193+
int compress_type);
190194
void btrfs_add_ordered_sum(struct btrfs_ordered_extent *entry,
191195
struct btrfs_ordered_sum *sum);
192196
struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct btrfs_inode *inode,

0 commit comments

Comments
 (0)