• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2007 Oracle.  All rights reserved.
4  */
5 
6 #include <linux/bio.h>
7 #include <linux/slab.h>
8 #include <linux/pagemap.h>
9 #include <linux/highmem.h>
10 #include <linux/sched/mm.h>
11 #include <crypto/hash.h>
12 #include "misc.h"
13 #include "ctree.h"
14 #include "disk-io.h"
15 #include "transaction.h"
16 #include "volumes.h"
17 #include "print-tree.h"
18 #include "compression.h"
19 
20 #define __MAX_CSUM_ITEMS(r, size) ((unsigned long)(((BTRFS_LEAF_DATA_SIZE(r) - \
21 				   sizeof(struct btrfs_item) * 2) / \
22 				  size) - 1))
23 
24 #define MAX_CSUM_ITEMS(r, size) (min_t(u32, __MAX_CSUM_ITEMS(r, size), \
25 				       PAGE_SIZE))
26 
27 /**
28  * Set inode's size according to filesystem options
29  *
30  * @inode:      inode we want to update the disk_i_size for
31  * @new_i_size: i_size we want to set to, 0 if we use i_size
32  *
33  * With NO_HOLES set this simply sets the disk_is_size to whatever i_size_read()
34  * returns as it is perfectly fine with a file that has holes without hole file
35  * extent items.
36  *
37  * However without NO_HOLES we need to only return the area that is contiguous
38  * from the 0 offset of the file.  Otherwise we could end up adjust i_size up
39  * to an extent that has a gap in between.
40  *
41  * Finally new_i_size should only be set in the case of truncate where we're not
42  * ready to use i_size_read() as the limiter yet.
43  */
btrfs_inode_safe_disk_i_size_write(struct btrfs_inode * inode,u64 new_i_size)44 void btrfs_inode_safe_disk_i_size_write(struct btrfs_inode *inode, u64 new_i_size)
45 {
46 	struct btrfs_fs_info *fs_info = inode->root->fs_info;
47 	u64 start, end, i_size;
48 	int ret;
49 
50 	spin_lock(&inode->lock);
51 	i_size = new_i_size ?: i_size_read(&inode->vfs_inode);
52 	if (btrfs_fs_incompat(fs_info, NO_HOLES)) {
53 		inode->disk_i_size = i_size;
54 		goto out_unlock;
55 	}
56 
57 	ret = find_contiguous_extent_bit(&inode->file_extent_tree, 0, &start,
58 					 &end, EXTENT_DIRTY);
59 	if (!ret && start == 0)
60 		i_size = min(i_size, end + 1);
61 	else
62 		i_size = 0;
63 	inode->disk_i_size = i_size;
64 out_unlock:
65 	spin_unlock(&inode->lock);
66 }
67 
68 /**
69  * Mark range within a file as having a new extent inserted
70  *
71  * @inode: inode being modified
72  * @start: start file offset of the file extent we've inserted
73  * @len:   logical length of the file extent item
74  *
75  * Call when we are inserting a new file extent where there was none before.
76  * Does not need to call this in the case where we're replacing an existing file
77  * extent, however if not sure it's fine to call this multiple times.
78  *
79  * The start and len must match the file extent item, so thus must be sectorsize
80  * aligned.
81  */
btrfs_inode_set_file_extent_range(struct btrfs_inode * inode,u64 start,u64 len)82 int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start,
83 				      u64 len)
84 {
85 	if (len == 0)
86 		return 0;
87 
88 	ASSERT(IS_ALIGNED(start + len, inode->root->fs_info->sectorsize));
89 
90 	if (btrfs_fs_incompat(inode->root->fs_info, NO_HOLES))
91 		return 0;
92 	return set_extent_bits(&inode->file_extent_tree, start, start + len - 1,
93 			       EXTENT_DIRTY);
94 }
95 
96 /**
97  * Marks an inode range as not having a backing extent
98  *
99  * @inode: inode being modified
100  * @start: start file offset of the file extent we've inserted
101  * @len:   logical length of the file extent item
102  *
103  * Called when we drop a file extent, for example when we truncate.  Doesn't
104  * need to be called for cases where we're replacing a file extent, like when
105  * we've COWed a file extent.
106  *
107  * The start and len must match the file extent item, so thus must be sectorsize
108  * aligned.
109  */
btrfs_inode_clear_file_extent_range(struct btrfs_inode * inode,u64 start,u64 len)110 int btrfs_inode_clear_file_extent_range(struct btrfs_inode *inode, u64 start,
111 					u64 len)
112 {
113 	if (len == 0)
114 		return 0;
115 
116 	ASSERT(IS_ALIGNED(start + len, inode->root->fs_info->sectorsize) ||
117 	       len == (u64)-1);
118 
119 	if (btrfs_fs_incompat(inode->root->fs_info, NO_HOLES))
120 		return 0;
121 	return clear_extent_bit(&inode->file_extent_tree, start,
122 				start + len - 1, EXTENT_DIRTY, NULL);
123 }
124 
max_ordered_sum_bytes(struct btrfs_fs_info * fs_info,u16 csum_size)125 static inline u32 max_ordered_sum_bytes(struct btrfs_fs_info *fs_info,
126 					u16 csum_size)
127 {
128 	u32 ncsums = (PAGE_SIZE - sizeof(struct btrfs_ordered_sum)) / csum_size;
129 
130 	return ncsums * fs_info->sectorsize;
131 }
132 
133 /*
134  * Calculate the total size needed to allocate for an ordered sum structure
135  * spanning @bytes in the file.
136  */
btrfs_ordered_sum_size(struct btrfs_fs_info * fs_info,unsigned long bytes)137 static int btrfs_ordered_sum_size(struct btrfs_fs_info *fs_info, unsigned long bytes)
138 {
139 	int num_sectors = (int)DIV_ROUND_UP(bytes, fs_info->sectorsize);
140 
141 	return sizeof(struct btrfs_ordered_sum) + num_sectors * fs_info->csum_size;
142 }
143 
btrfs_insert_hole_extent(struct btrfs_trans_handle * trans,struct btrfs_root * root,u64 objectid,u64 pos,u64 num_bytes)144 int btrfs_insert_hole_extent(struct btrfs_trans_handle *trans,
145 			     struct btrfs_root *root,
146 			     u64 objectid, u64 pos, u64 num_bytes)
147 {
148 	int ret = 0;
149 	struct btrfs_file_extent_item *item;
150 	struct btrfs_key file_key;
151 	struct btrfs_path *path;
152 	struct extent_buffer *leaf;
153 
154 	path = btrfs_alloc_path();
155 	if (!path)
156 		return -ENOMEM;
157 	file_key.objectid = objectid;
158 	file_key.offset = pos;
159 	file_key.type = BTRFS_EXTENT_DATA_KEY;
160 
161 	ret = btrfs_insert_empty_item(trans, root, path, &file_key,
162 				      sizeof(*item));
163 	if (ret < 0)
164 		goto out;
165 	BUG_ON(ret); /* Can't happen */
166 	leaf = path->nodes[0];
167 	item = btrfs_item_ptr(leaf, path->slots[0],
168 			      struct btrfs_file_extent_item);
169 	btrfs_set_file_extent_disk_bytenr(leaf, item, 0);
170 	btrfs_set_file_extent_disk_num_bytes(leaf, item, 0);
171 	btrfs_set_file_extent_offset(leaf, item, 0);
172 	btrfs_set_file_extent_num_bytes(leaf, item, num_bytes);
173 	btrfs_set_file_extent_ram_bytes(leaf, item, num_bytes);
174 	btrfs_set_file_extent_generation(leaf, item, trans->transid);
175 	btrfs_set_file_extent_type(leaf, item, BTRFS_FILE_EXTENT_REG);
176 	btrfs_set_file_extent_compression(leaf, item, 0);
177 	btrfs_set_file_extent_encryption(leaf, item, 0);
178 	btrfs_set_file_extent_other_encoding(leaf, item, 0);
179 
180 	btrfs_mark_buffer_dirty(leaf);
181 out:
182 	btrfs_free_path(path);
183 	return ret;
184 }
185 
186 static struct btrfs_csum_item *
btrfs_lookup_csum(struct btrfs_trans_handle * trans,struct btrfs_root * root,struct btrfs_path * path,u64 bytenr,int cow)187 btrfs_lookup_csum(struct btrfs_trans_handle *trans,
188 		  struct btrfs_root *root,
189 		  struct btrfs_path *path,
190 		  u64 bytenr, int cow)
191 {
192 	struct btrfs_fs_info *fs_info = root->fs_info;
193 	int ret;
194 	struct btrfs_key file_key;
195 	struct btrfs_key found_key;
196 	struct btrfs_csum_item *item;
197 	struct extent_buffer *leaf;
198 	u64 csum_offset = 0;
199 	const u32 csum_size = fs_info->csum_size;
200 	int csums_in_item;
201 
202 	file_key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
203 	file_key.offset = bytenr;
204 	file_key.type = BTRFS_EXTENT_CSUM_KEY;
205 	ret = btrfs_search_slot(trans, root, &file_key, path, 0, cow);
206 	if (ret < 0)
207 		goto fail;
208 	leaf = path->nodes[0];
209 	if (ret > 0) {
210 		ret = 1;
211 		if (path->slots[0] == 0)
212 			goto fail;
213 		path->slots[0]--;
214 		btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
215 		if (found_key.type != BTRFS_EXTENT_CSUM_KEY)
216 			goto fail;
217 
218 		csum_offset = (bytenr - found_key.offset) >>
219 				fs_info->sectorsize_bits;
220 		csums_in_item = btrfs_item_size(leaf, path->slots[0]);
221 		csums_in_item /= csum_size;
222 
223 		if (csum_offset == csums_in_item) {
224 			ret = -EFBIG;
225 			goto fail;
226 		} else if (csum_offset > csums_in_item) {
227 			goto fail;
228 		}
229 	}
230 	item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
231 	item = (struct btrfs_csum_item *)((unsigned char *)item +
232 					  csum_offset * csum_size);
233 	return item;
234 fail:
235 	if (ret > 0)
236 		ret = -ENOENT;
237 	return ERR_PTR(ret);
238 }
239 
btrfs_lookup_file_extent(struct btrfs_trans_handle * trans,struct btrfs_root * root,struct btrfs_path * path,u64 objectid,u64 offset,int mod)240 int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
241 			     struct btrfs_root *root,
242 			     struct btrfs_path *path, u64 objectid,
243 			     u64 offset, int mod)
244 {
245 	struct btrfs_key file_key;
246 	int ins_len = mod < 0 ? -1 : 0;
247 	int cow = mod != 0;
248 
249 	file_key.objectid = objectid;
250 	file_key.offset = offset;
251 	file_key.type = BTRFS_EXTENT_DATA_KEY;
252 
253 	return btrfs_search_slot(trans, root, &file_key, path, ins_len, cow);
254 }
255 
256 /*
257  * Find checksums for logical bytenr range [disk_bytenr, disk_bytenr + len) and
258  * estore the result to @dst.
259  *
260  * Return >0 for the number of sectors we found.
261  * Return 0 for the range [disk_bytenr, disk_bytenr + sectorsize) has no csum
262  * for it. Caller may want to try next sector until one range is hit.
263  * Return <0 for fatal error.
264  */
search_csum_tree(struct btrfs_fs_info * fs_info,struct btrfs_path * path,u64 disk_bytenr,u64 len,u8 * dst)265 static int search_csum_tree(struct btrfs_fs_info *fs_info,
266 			    struct btrfs_path *path, u64 disk_bytenr,
267 			    u64 len, u8 *dst)
268 {
269 	struct btrfs_root *csum_root;
270 	struct btrfs_csum_item *item = NULL;
271 	struct btrfs_key key;
272 	const u32 sectorsize = fs_info->sectorsize;
273 	const u32 csum_size = fs_info->csum_size;
274 	u32 itemsize;
275 	int ret;
276 	u64 csum_start;
277 	u64 csum_len;
278 
279 	ASSERT(IS_ALIGNED(disk_bytenr, sectorsize) &&
280 	       IS_ALIGNED(len, sectorsize));
281 
282 	/* Check if the current csum item covers disk_bytenr */
283 	if (path->nodes[0]) {
284 		item = btrfs_item_ptr(path->nodes[0], path->slots[0],
285 				      struct btrfs_csum_item);
286 		btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
287 		itemsize = btrfs_item_size(path->nodes[0], path->slots[0]);
288 
289 		csum_start = key.offset;
290 		csum_len = (itemsize / csum_size) * sectorsize;
291 
292 		if (in_range(disk_bytenr, csum_start, csum_len))
293 			goto found;
294 	}
295 
296 	/* Current item doesn't contain the desired range, search again */
297 	btrfs_release_path(path);
298 	csum_root = btrfs_csum_root(fs_info, disk_bytenr);
299 	item = btrfs_lookup_csum(NULL, csum_root, path, disk_bytenr, 0);
300 	if (IS_ERR(item)) {
301 		ret = PTR_ERR(item);
302 		goto out;
303 	}
304 	btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
305 	itemsize = btrfs_item_size(path->nodes[0], path->slots[0]);
306 
307 	csum_start = key.offset;
308 	csum_len = (itemsize / csum_size) * sectorsize;
309 	ASSERT(in_range(disk_bytenr, csum_start, csum_len));
310 
311 found:
312 	ret = (min(csum_start + csum_len, disk_bytenr + len) -
313 		   disk_bytenr) >> fs_info->sectorsize_bits;
314 	read_extent_buffer(path->nodes[0], dst, (unsigned long)item,
315 			ret * csum_size);
316 out:
317 	if (ret == -ENOENT || ret == -EFBIG)
318 		ret = 0;
319 	return ret;
320 }
321 
322 /*
323  * Locate the file_offset of @cur_disk_bytenr of a @bio.
324  *
325  * Bio of btrfs represents read range of
326  * [bi_sector << 9, bi_sector << 9 + bi_size).
327  * Knowing this, we can iterate through each bvec to locate the page belong to
328  * @cur_disk_bytenr and get the file offset.
329  *
330  * @inode is used to determine if the bvec page really belongs to @inode.
331  *
332  * Return 0 if we can't find the file offset
333  * Return >0 if we find the file offset and restore it to @file_offset_ret
334  */
search_file_offset_in_bio(struct bio * bio,struct inode * inode,u64 disk_bytenr,u64 * file_offset_ret)335 static int search_file_offset_in_bio(struct bio *bio, struct inode *inode,
336 				     u64 disk_bytenr, u64 *file_offset_ret)
337 {
338 	struct bvec_iter iter;
339 	struct bio_vec bvec;
340 	u64 cur = bio->bi_iter.bi_sector << SECTOR_SHIFT;
341 	int ret = 0;
342 
343 	bio_for_each_segment(bvec, bio, iter) {
344 		struct page *page = bvec.bv_page;
345 
346 		if (cur > disk_bytenr)
347 			break;
348 		if (cur + bvec.bv_len <= disk_bytenr) {
349 			cur += bvec.bv_len;
350 			continue;
351 		}
352 		ASSERT(in_range(disk_bytenr, cur, bvec.bv_len));
353 		if (page->mapping && page->mapping->host &&
354 		    page->mapping->host == inode) {
355 			ret = 1;
356 			*file_offset_ret = page_offset(page) + bvec.bv_offset +
357 					   disk_bytenr - cur;
358 			break;
359 		}
360 	}
361 	return ret;
362 }
363 
364 /**
365  * Lookup the checksum for the read bio in csum tree.
366  *
367  * @inode: inode that the bio is for.
368  * @bio: bio to look up.
369  * @dst: Buffer of size nblocks * btrfs_super_csum_size() used to return
370  *       checksum (nblocks = bio->bi_iter.bi_size / fs_info->sectorsize). If
371  *       NULL, the checksum buffer is allocated and returned in
372  *       btrfs_bio(bio)->csum instead.
373  *
374  * Return: BLK_STS_RESOURCE if allocating memory fails, BLK_STS_OK otherwise.
375  */
btrfs_lookup_bio_sums(struct inode * inode,struct bio * bio,u8 * dst)376 blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, u8 *dst)
377 {
378 	struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
379 	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
380 	struct btrfs_bio *bbio = NULL;
381 	struct btrfs_path *path;
382 	const u32 sectorsize = fs_info->sectorsize;
383 	const u32 csum_size = fs_info->csum_size;
384 	u32 orig_len = bio->bi_iter.bi_size;
385 	u64 orig_disk_bytenr = bio->bi_iter.bi_sector << SECTOR_SHIFT;
386 	u64 cur_disk_bytenr;
387 	u8 *csum;
388 	const unsigned int nblocks = orig_len >> fs_info->sectorsize_bits;
389 	int count = 0;
390 	blk_status_t ret = BLK_STS_OK;
391 
392 	if ((BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) ||
393 	    test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state))
394 		return BLK_STS_OK;
395 
396 	/*
397 	 * This function is only called for read bio.
398 	 *
399 	 * This means two things:
400 	 * - All our csums should only be in csum tree
401 	 *   No ordered extents csums, as ordered extents are only for write
402 	 *   path.
403 	 * - No need to bother any other info from bvec
404 	 *   Since we're looking up csums, the only important info is the
405 	 *   disk_bytenr and the length, which can be extracted from bi_iter
406 	 *   directly.
407 	 */
408 	ASSERT(bio_op(bio) == REQ_OP_READ);
409 	path = btrfs_alloc_path();
410 	if (!path)
411 		return BLK_STS_RESOURCE;
412 
413 	if (!dst) {
414 		bbio = btrfs_bio(bio);
415 
416 		if (nblocks * csum_size > BTRFS_BIO_INLINE_CSUM_SIZE) {
417 			bbio->csum = kmalloc_array(nblocks, csum_size, GFP_NOFS);
418 			if (!bbio->csum) {
419 				btrfs_free_path(path);
420 				return BLK_STS_RESOURCE;
421 			}
422 		} else {
423 			bbio->csum = bbio->csum_inline;
424 		}
425 		csum = bbio->csum;
426 	} else {
427 		csum = dst;
428 	}
429 
430 	/*
431 	 * If requested number of sectors is larger than one leaf can contain,
432 	 * kick the readahead for csum tree.
433 	 */
434 	if (nblocks > fs_info->csums_per_leaf)
435 		path->reada = READA_FORWARD;
436 
437 	/*
438 	 * the free space stuff is only read when it hasn't been
439 	 * updated in the current transaction.  So, we can safely
440 	 * read from the commit root and sidestep a nasty deadlock
441 	 * between reading the free space cache and updating the csum tree.
442 	 */
443 	if (btrfs_is_free_space_inode(BTRFS_I(inode))) {
444 		path->search_commit_root = 1;
445 		path->skip_locking = 1;
446 	}
447 
448 	for (cur_disk_bytenr = orig_disk_bytenr;
449 	     cur_disk_bytenr < orig_disk_bytenr + orig_len;
450 	     cur_disk_bytenr += (count * sectorsize)) {
451 		u64 search_len = orig_disk_bytenr + orig_len - cur_disk_bytenr;
452 		unsigned int sector_offset;
453 		u8 *csum_dst;
454 
455 		/*
456 		 * Although both cur_disk_bytenr and orig_disk_bytenr is u64,
457 		 * we're calculating the offset to the bio start.
458 		 *
459 		 * Bio size is limited to UINT_MAX, thus unsigned int is large
460 		 * enough to contain the raw result, not to mention the right
461 		 * shifted result.
462 		 */
463 		ASSERT(cur_disk_bytenr - orig_disk_bytenr < UINT_MAX);
464 		sector_offset = (cur_disk_bytenr - orig_disk_bytenr) >>
465 				fs_info->sectorsize_bits;
466 		csum_dst = csum + sector_offset * csum_size;
467 
468 		count = search_csum_tree(fs_info, path, cur_disk_bytenr,
469 					 search_len, csum_dst);
470 		if (count < 0) {
471 			ret = errno_to_blk_status(count);
472 			if (bbio)
473 				btrfs_bio_free_csum(bbio);
474 			break;
475 		}
476 
477 		/*
478 		 * We didn't find a csum for this range.  We need to make sure
479 		 * we complain loudly about this, because we are not NODATASUM.
480 		 *
481 		 * However for the DATA_RELOC inode we could potentially be
482 		 * relocating data extents for a NODATASUM inode, so the inode
483 		 * itself won't be marked with NODATASUM, but the extent we're
484 		 * copying is in fact NODATASUM.  If we don't find a csum we
485 		 * assume this is the case.
486 		 */
487 		if (count == 0) {
488 			memset(csum_dst, 0, csum_size);
489 			count = 1;
490 
491 			if (BTRFS_I(inode)->root->root_key.objectid ==
492 			    BTRFS_DATA_RELOC_TREE_OBJECTID) {
493 				u64 file_offset;
494 				int ret;
495 
496 				ret = search_file_offset_in_bio(bio, inode,
497 						cur_disk_bytenr, &file_offset);
498 				if (ret)
499 					set_extent_bits(io_tree, file_offset,
500 						file_offset + sectorsize - 1,
501 						EXTENT_NODATASUM);
502 			} else {
503 				btrfs_warn_rl(fs_info,
504 			"csum hole found for disk bytenr range [%llu, %llu)",
505 				cur_disk_bytenr, cur_disk_bytenr + sectorsize);
506 			}
507 		}
508 	}
509 
510 	btrfs_free_path(path);
511 	return ret;
512 }
513 
btrfs_lookup_csums_range(struct btrfs_root * root,u64 start,u64 end,struct list_head * list,int search_commit,bool nowait)514 int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
515 			     struct list_head *list, int search_commit,
516 			     bool nowait)
517 {
518 	struct btrfs_fs_info *fs_info = root->fs_info;
519 	struct btrfs_key key;
520 	struct btrfs_path *path;
521 	struct extent_buffer *leaf;
522 	struct btrfs_ordered_sum *sums;
523 	struct btrfs_csum_item *item;
524 	LIST_HEAD(tmplist);
525 	unsigned long offset;
526 	int ret;
527 	size_t size;
528 	u64 csum_end;
529 	const u32 csum_size = fs_info->csum_size;
530 
531 	ASSERT(IS_ALIGNED(start, fs_info->sectorsize) &&
532 	       IS_ALIGNED(end + 1, fs_info->sectorsize));
533 
534 	path = btrfs_alloc_path();
535 	if (!path)
536 		return -ENOMEM;
537 
538 	path->nowait = nowait;
539 	if (search_commit) {
540 		path->skip_locking = 1;
541 		path->reada = READA_FORWARD;
542 		path->search_commit_root = 1;
543 	}
544 
545 	key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
546 	key.offset = start;
547 	key.type = BTRFS_EXTENT_CSUM_KEY;
548 
549 	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
550 	if (ret < 0)
551 		goto fail;
552 	if (ret > 0 && path->slots[0] > 0) {
553 		leaf = path->nodes[0];
554 		btrfs_item_key_to_cpu(leaf, &key, path->slots[0] - 1);
555 		if (key.objectid == BTRFS_EXTENT_CSUM_OBJECTID &&
556 		    key.type == BTRFS_EXTENT_CSUM_KEY) {
557 			offset = (start - key.offset) >> fs_info->sectorsize_bits;
558 			if (offset * csum_size <
559 			    btrfs_item_size(leaf, path->slots[0] - 1))
560 				path->slots[0]--;
561 		}
562 	}
563 
564 	while (start <= end) {
565 		leaf = path->nodes[0];
566 		if (path->slots[0] >= btrfs_header_nritems(leaf)) {
567 			ret = btrfs_next_leaf(root, path);
568 			if (ret < 0)
569 				goto fail;
570 			if (ret > 0)
571 				break;
572 			leaf = path->nodes[0];
573 		}
574 
575 		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
576 		if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
577 		    key.type != BTRFS_EXTENT_CSUM_KEY ||
578 		    key.offset > end)
579 			break;
580 
581 		if (key.offset > start)
582 			start = key.offset;
583 
584 		size = btrfs_item_size(leaf, path->slots[0]);
585 		csum_end = key.offset + (size / csum_size) * fs_info->sectorsize;
586 		if (csum_end <= start) {
587 			path->slots[0]++;
588 			continue;
589 		}
590 
591 		csum_end = min(csum_end, end + 1);
592 		item = btrfs_item_ptr(path->nodes[0], path->slots[0],
593 				      struct btrfs_csum_item);
594 		while (start < csum_end) {
595 			size = min_t(size_t, csum_end - start,
596 				     max_ordered_sum_bytes(fs_info, csum_size));
597 			sums = kzalloc(btrfs_ordered_sum_size(fs_info, size),
598 				       GFP_NOFS);
599 			if (!sums) {
600 				ret = -ENOMEM;
601 				goto fail;
602 			}
603 
604 			sums->bytenr = start;
605 			sums->len = size;
606 
607 			offset = (start - key.offset) >> fs_info->sectorsize_bits;
608 			offset *= csum_size;
609 			size >>= fs_info->sectorsize_bits;
610 
611 			read_extent_buffer(path->nodes[0],
612 					   sums->sums,
613 					   ((unsigned long)item) + offset,
614 					   csum_size * size);
615 
616 			start += fs_info->sectorsize * size;
617 			list_add_tail(&sums->list, &tmplist);
618 		}
619 		path->slots[0]++;
620 	}
621 	ret = 0;
622 fail:
623 	while (ret < 0 && !list_empty(&tmplist)) {
624 		sums = list_entry(tmplist.next, struct btrfs_ordered_sum, list);
625 		list_del(&sums->list);
626 		kfree(sums);
627 	}
628 	list_splice_tail(&tmplist, list);
629 
630 	btrfs_free_path(path);
631 	return ret;
632 }
633 
634 /**
635  * Calculate checksums of the data contained inside a bio
636  *
637  * @inode:	 Owner of the data inside the bio
638  * @bio:	 Contains the data to be checksummed
639  * @offset:      If (u64)-1, @bio may contain discontiguous bio vecs, so the
640  *               file offsets are determined from the page offsets in the bio.
641  *               Otherwise, this is the starting file offset of the bio vecs in
642  *               @bio, which must be contiguous.
643  * @one_ordered: If true, @bio only refers to one ordered extent.
644  */
btrfs_csum_one_bio(struct btrfs_inode * inode,struct bio * bio,u64 offset,bool one_ordered)645 blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio,
646 				u64 offset, bool one_ordered)
647 {
648 	struct btrfs_fs_info *fs_info = inode->root->fs_info;
649 	SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
650 	struct btrfs_ordered_sum *sums;
651 	struct btrfs_ordered_extent *ordered = NULL;
652 	const bool use_page_offsets = (offset == (u64)-1);
653 	char *data;
654 	struct bvec_iter iter;
655 	struct bio_vec bvec;
656 	int index;
657 	unsigned int blockcount;
658 	unsigned long total_bytes = 0;
659 	unsigned long this_sum_bytes = 0;
660 	int i;
661 	unsigned nofs_flag;
662 
663 	nofs_flag = memalloc_nofs_save();
664 	sums = kvzalloc(btrfs_ordered_sum_size(fs_info, bio->bi_iter.bi_size),
665 		       GFP_KERNEL);
666 	memalloc_nofs_restore(nofs_flag);
667 
668 	if (!sums)
669 		return BLK_STS_RESOURCE;
670 
671 	sums->len = bio->bi_iter.bi_size;
672 	INIT_LIST_HEAD(&sums->list);
673 
674 	sums->bytenr = bio->bi_iter.bi_sector << 9;
675 	index = 0;
676 
677 	shash->tfm = fs_info->csum_shash;
678 
679 	bio_for_each_segment(bvec, bio, iter) {
680 		if (use_page_offsets)
681 			offset = page_offset(bvec.bv_page) + bvec.bv_offset;
682 
683 		if (!ordered) {
684 			ordered = btrfs_lookup_ordered_extent(inode, offset);
685 			/*
686 			 * The bio range is not covered by any ordered extent,
687 			 * must be a code logic error.
688 			 */
689 			if (unlikely(!ordered)) {
690 				WARN(1, KERN_WARNING
691 			"no ordered extent for root %llu ino %llu offset %llu\n",
692 				     inode->root->root_key.objectid,
693 				     btrfs_ino(inode), offset);
694 				kvfree(sums);
695 				return BLK_STS_IOERR;
696 			}
697 		}
698 
699 		blockcount = BTRFS_BYTES_TO_BLKS(fs_info,
700 						 bvec.bv_len + fs_info->sectorsize
701 						 - 1);
702 
703 		for (i = 0; i < blockcount; i++) {
704 			if (!one_ordered &&
705 			    !in_range(offset, ordered->file_offset,
706 				      ordered->num_bytes)) {
707 				unsigned long bytes_left;
708 
709 				sums->len = this_sum_bytes;
710 				this_sum_bytes = 0;
711 				btrfs_add_ordered_sum(ordered, sums);
712 				btrfs_put_ordered_extent(ordered);
713 
714 				bytes_left = bio->bi_iter.bi_size - total_bytes;
715 
716 				nofs_flag = memalloc_nofs_save();
717 				sums = kvzalloc(btrfs_ordered_sum_size(fs_info,
718 						      bytes_left), GFP_KERNEL);
719 				memalloc_nofs_restore(nofs_flag);
720 				if (!sums)
721 					return BLK_STS_RESOURCE;
722 
723 				sums->len = bytes_left;
724 				ordered = btrfs_lookup_ordered_extent(inode,
725 								offset);
726 				ASSERT(ordered); /* Logic error */
727 				sums->bytenr = (bio->bi_iter.bi_sector << 9)
728 					+ total_bytes;
729 				index = 0;
730 			}
731 
732 			data = bvec_kmap_local(&bvec);
733 			crypto_shash_digest(shash,
734 					    data + (i * fs_info->sectorsize),
735 					    fs_info->sectorsize,
736 					    sums->sums + index);
737 			kunmap_local(data);
738 			index += fs_info->csum_size;
739 			offset += fs_info->sectorsize;
740 			this_sum_bytes += fs_info->sectorsize;
741 			total_bytes += fs_info->sectorsize;
742 		}
743 
744 	}
745 	this_sum_bytes = 0;
746 	btrfs_add_ordered_sum(ordered, sums);
747 	btrfs_put_ordered_extent(ordered);
748 	return 0;
749 }
750 
751 /*
752  * helper function for csum removal, this expects the
753  * key to describe the csum pointed to by the path, and it expects
754  * the csum to overlap the range [bytenr, len]
755  *
756  * The csum should not be entirely contained in the range and the
757  * range should not be entirely contained in the csum.
758  *
759  * This calls btrfs_truncate_item with the correct args based on the
760  * overlap, and fixes up the key as required.
761  */
truncate_one_csum(struct btrfs_fs_info * fs_info,struct btrfs_path * path,struct btrfs_key * key,u64 bytenr,u64 len)762 static noinline void truncate_one_csum(struct btrfs_fs_info *fs_info,
763 				       struct btrfs_path *path,
764 				       struct btrfs_key *key,
765 				       u64 bytenr, u64 len)
766 {
767 	struct extent_buffer *leaf;
768 	const u32 csum_size = fs_info->csum_size;
769 	u64 csum_end;
770 	u64 end_byte = bytenr + len;
771 	u32 blocksize_bits = fs_info->sectorsize_bits;
772 
773 	leaf = path->nodes[0];
774 	csum_end = btrfs_item_size(leaf, path->slots[0]) / csum_size;
775 	csum_end <<= blocksize_bits;
776 	csum_end += key->offset;
777 
778 	if (key->offset < bytenr && csum_end <= end_byte) {
779 		/*
780 		 *         [ bytenr - len ]
781 		 *         [   ]
782 		 *   [csum     ]
783 		 *   A simple truncate off the end of the item
784 		 */
785 		u32 new_size = (bytenr - key->offset) >> blocksize_bits;
786 		new_size *= csum_size;
787 		btrfs_truncate_item(path, new_size, 1);
788 	} else if (key->offset >= bytenr && csum_end > end_byte &&
789 		   end_byte > key->offset) {
790 		/*
791 		 *         [ bytenr - len ]
792 		 *                 [ ]
793 		 *                 [csum     ]
794 		 * we need to truncate from the beginning of the csum
795 		 */
796 		u32 new_size = (csum_end - end_byte) >> blocksize_bits;
797 		new_size *= csum_size;
798 
799 		btrfs_truncate_item(path, new_size, 0);
800 
801 		key->offset = end_byte;
802 		btrfs_set_item_key_safe(fs_info, path, key);
803 	} else {
804 		BUG();
805 	}
806 }
807 
808 /*
809  * deletes the csum items from the csum tree for a given
810  * range of bytes.
811  */
btrfs_del_csums(struct btrfs_trans_handle * trans,struct btrfs_root * root,u64 bytenr,u64 len)812 int btrfs_del_csums(struct btrfs_trans_handle *trans,
813 		    struct btrfs_root *root, u64 bytenr, u64 len)
814 {
815 	struct btrfs_fs_info *fs_info = trans->fs_info;
816 	struct btrfs_path *path;
817 	struct btrfs_key key;
818 	u64 end_byte = bytenr + len;
819 	u64 csum_end;
820 	struct extent_buffer *leaf;
821 	int ret = 0;
822 	const u32 csum_size = fs_info->csum_size;
823 	u32 blocksize_bits = fs_info->sectorsize_bits;
824 
825 	ASSERT(root->root_key.objectid == BTRFS_CSUM_TREE_OBJECTID ||
826 	       root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID);
827 
828 	path = btrfs_alloc_path();
829 	if (!path)
830 		return -ENOMEM;
831 
832 	while (1) {
833 		key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
834 		key.offset = end_byte - 1;
835 		key.type = BTRFS_EXTENT_CSUM_KEY;
836 
837 		ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
838 		if (ret > 0) {
839 			ret = 0;
840 			if (path->slots[0] == 0)
841 				break;
842 			path->slots[0]--;
843 		} else if (ret < 0) {
844 			break;
845 		}
846 
847 		leaf = path->nodes[0];
848 		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
849 
850 		if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
851 		    key.type != BTRFS_EXTENT_CSUM_KEY) {
852 			break;
853 		}
854 
855 		if (key.offset >= end_byte)
856 			break;
857 
858 		csum_end = btrfs_item_size(leaf, path->slots[0]) / csum_size;
859 		csum_end <<= blocksize_bits;
860 		csum_end += key.offset;
861 
862 		/* this csum ends before we start, we're done */
863 		if (csum_end <= bytenr)
864 			break;
865 
866 		/* delete the entire item, it is inside our range */
867 		if (key.offset >= bytenr && csum_end <= end_byte) {
868 			int del_nr = 1;
869 
870 			/*
871 			 * Check how many csum items preceding this one in this
872 			 * leaf correspond to our range and then delete them all
873 			 * at once.
874 			 */
875 			if (key.offset > bytenr && path->slots[0] > 0) {
876 				int slot = path->slots[0] - 1;
877 
878 				while (slot >= 0) {
879 					struct btrfs_key pk;
880 
881 					btrfs_item_key_to_cpu(leaf, &pk, slot);
882 					if (pk.offset < bytenr ||
883 					    pk.type != BTRFS_EXTENT_CSUM_KEY ||
884 					    pk.objectid !=
885 					    BTRFS_EXTENT_CSUM_OBJECTID)
886 						break;
887 					path->slots[0] = slot;
888 					del_nr++;
889 					key.offset = pk.offset;
890 					slot--;
891 				}
892 			}
893 			ret = btrfs_del_items(trans, root, path,
894 					      path->slots[0], del_nr);
895 			if (ret)
896 				break;
897 			if (key.offset == bytenr)
898 				break;
899 		} else if (key.offset < bytenr && csum_end > end_byte) {
900 			unsigned long offset;
901 			unsigned long shift_len;
902 			unsigned long item_offset;
903 			/*
904 			 *        [ bytenr - len ]
905 			 *     [csum                ]
906 			 *
907 			 * Our bytes are in the middle of the csum,
908 			 * we need to split this item and insert a new one.
909 			 *
910 			 * But we can't drop the path because the
911 			 * csum could change, get removed, extended etc.
912 			 *
913 			 * The trick here is the max size of a csum item leaves
914 			 * enough room in the tree block for a single
915 			 * item header.  So, we split the item in place,
916 			 * adding a new header pointing to the existing
917 			 * bytes.  Then we loop around again and we have
918 			 * a nicely formed csum item that we can neatly
919 			 * truncate.
920 			 */
921 			offset = (bytenr - key.offset) >> blocksize_bits;
922 			offset *= csum_size;
923 
924 			shift_len = (len >> blocksize_bits) * csum_size;
925 
926 			item_offset = btrfs_item_ptr_offset(leaf,
927 							    path->slots[0]);
928 
929 			memzero_extent_buffer(leaf, item_offset + offset,
930 					     shift_len);
931 			key.offset = bytenr;
932 
933 			/*
934 			 * btrfs_split_item returns -EAGAIN when the
935 			 * item changed size or key
936 			 */
937 			ret = btrfs_split_item(trans, root, path, &key, offset);
938 			if (ret && ret != -EAGAIN) {
939 				btrfs_abort_transaction(trans, ret);
940 				break;
941 			}
942 			ret = 0;
943 
944 			key.offset = end_byte - 1;
945 		} else {
946 			truncate_one_csum(fs_info, path, &key, bytenr, len);
947 			if (key.offset < bytenr)
948 				break;
949 		}
950 		btrfs_release_path(path);
951 	}
952 	btrfs_free_path(path);
953 	return ret;
954 }
955 
find_next_csum_offset(struct btrfs_root * root,struct btrfs_path * path,u64 * next_offset)956 static int find_next_csum_offset(struct btrfs_root *root,
957 				 struct btrfs_path *path,
958 				 u64 *next_offset)
959 {
960 	const u32 nritems = btrfs_header_nritems(path->nodes[0]);
961 	struct btrfs_key found_key;
962 	int slot = path->slots[0] + 1;
963 	int ret;
964 
965 	if (nritems == 0 || slot >= nritems) {
966 		ret = btrfs_next_leaf(root, path);
967 		if (ret < 0) {
968 			return ret;
969 		} else if (ret > 0) {
970 			*next_offset = (u64)-1;
971 			return 0;
972 		}
973 		slot = path->slots[0];
974 	}
975 
976 	btrfs_item_key_to_cpu(path->nodes[0], &found_key, slot);
977 
978 	if (found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
979 	    found_key.type != BTRFS_EXTENT_CSUM_KEY)
980 		*next_offset = (u64)-1;
981 	else
982 		*next_offset = found_key.offset;
983 
984 	return 0;
985 }
986 
btrfs_csum_file_blocks(struct btrfs_trans_handle * trans,struct btrfs_root * root,struct btrfs_ordered_sum * sums)987 int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
988 			   struct btrfs_root *root,
989 			   struct btrfs_ordered_sum *sums)
990 {
991 	struct btrfs_fs_info *fs_info = root->fs_info;
992 	struct btrfs_key file_key;
993 	struct btrfs_key found_key;
994 	struct btrfs_path *path;
995 	struct btrfs_csum_item *item;
996 	struct btrfs_csum_item *item_end;
997 	struct extent_buffer *leaf = NULL;
998 	u64 next_offset;
999 	u64 total_bytes = 0;
1000 	u64 csum_offset;
1001 	u64 bytenr;
1002 	u32 ins_size;
1003 	int index = 0;
1004 	int found_next;
1005 	int ret;
1006 	const u32 csum_size = fs_info->csum_size;
1007 
1008 	path = btrfs_alloc_path();
1009 	if (!path)
1010 		return -ENOMEM;
1011 again:
1012 	next_offset = (u64)-1;
1013 	found_next = 0;
1014 	bytenr = sums->bytenr + total_bytes;
1015 	file_key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
1016 	file_key.offset = bytenr;
1017 	file_key.type = BTRFS_EXTENT_CSUM_KEY;
1018 
1019 	item = btrfs_lookup_csum(trans, root, path, bytenr, 1);
1020 	if (!IS_ERR(item)) {
1021 		ret = 0;
1022 		leaf = path->nodes[0];
1023 		item_end = btrfs_item_ptr(leaf, path->slots[0],
1024 					  struct btrfs_csum_item);
1025 		item_end = (struct btrfs_csum_item *)((char *)item_end +
1026 			   btrfs_item_size(leaf, path->slots[0]));
1027 		goto found;
1028 	}
1029 	ret = PTR_ERR(item);
1030 	if (ret != -EFBIG && ret != -ENOENT)
1031 		goto out;
1032 
1033 	if (ret == -EFBIG) {
1034 		u32 item_size;
1035 		/* we found one, but it isn't big enough yet */
1036 		leaf = path->nodes[0];
1037 		item_size = btrfs_item_size(leaf, path->slots[0]);
1038 		if ((item_size / csum_size) >=
1039 		    MAX_CSUM_ITEMS(fs_info, csum_size)) {
1040 			/* already at max size, make a new one */
1041 			goto insert;
1042 		}
1043 	} else {
1044 		/* We didn't find a csum item, insert one. */
1045 		ret = find_next_csum_offset(root, path, &next_offset);
1046 		if (ret < 0)
1047 			goto out;
1048 		found_next = 1;
1049 		goto insert;
1050 	}
1051 
1052 	/*
1053 	 * At this point, we know the tree has a checksum item that ends at an
1054 	 * offset matching the start of the checksum range we want to insert.
1055 	 * We try to extend that item as much as possible and then add as many
1056 	 * checksums to it as they fit.
1057 	 *
1058 	 * First check if the leaf has enough free space for at least one
1059 	 * checksum. If it has go directly to the item extension code, otherwise
1060 	 * release the path and do a search for insertion before the extension.
1061 	 */
1062 	if (btrfs_leaf_free_space(leaf) >= csum_size) {
1063 		btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
1064 		csum_offset = (bytenr - found_key.offset) >>
1065 			fs_info->sectorsize_bits;
1066 		goto extend_csum;
1067 	}
1068 
1069 	btrfs_release_path(path);
1070 	path->search_for_extension = 1;
1071 	ret = btrfs_search_slot(trans, root, &file_key, path,
1072 				csum_size, 1);
1073 	path->search_for_extension = 0;
1074 	if (ret < 0)
1075 		goto out;
1076 
1077 	if (ret > 0) {
1078 		if (path->slots[0] == 0)
1079 			goto insert;
1080 		path->slots[0]--;
1081 	}
1082 
1083 	leaf = path->nodes[0];
1084 	btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
1085 	csum_offset = (bytenr - found_key.offset) >> fs_info->sectorsize_bits;
1086 
1087 	if (found_key.type != BTRFS_EXTENT_CSUM_KEY ||
1088 	    found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
1089 	    csum_offset >= MAX_CSUM_ITEMS(fs_info, csum_size)) {
1090 		goto insert;
1091 	}
1092 
1093 extend_csum:
1094 	if (csum_offset == btrfs_item_size(leaf, path->slots[0]) /
1095 	    csum_size) {
1096 		int extend_nr;
1097 		u64 tmp;
1098 		u32 diff;
1099 
1100 		tmp = sums->len - total_bytes;
1101 		tmp >>= fs_info->sectorsize_bits;
1102 		WARN_ON(tmp < 1);
1103 		extend_nr = max_t(int, 1, tmp);
1104 
1105 		/*
1106 		 * A log tree can already have checksum items with a subset of
1107 		 * the checksums we are trying to log. This can happen after
1108 		 * doing a sequence of partial writes into prealloc extents and
1109 		 * fsyncs in between, with a full fsync logging a larger subrange
1110 		 * of an extent for which a previous fast fsync logged a smaller
1111 		 * subrange. And this happens in particular due to merging file
1112 		 * extent items when we complete an ordered extent for a range
1113 		 * covered by a prealloc extent - this is done at
1114 		 * btrfs_mark_extent_written().
1115 		 *
1116 		 * So if we try to extend the previous checksum item, which has
1117 		 * a range that ends at the start of the range we want to insert,
1118 		 * make sure we don't extend beyond the start offset of the next
1119 		 * checksum item. If we are at the last item in the leaf, then
1120 		 * forget the optimization of extending and add a new checksum
1121 		 * item - it is not worth the complexity of releasing the path,
1122 		 * getting the first key for the next leaf, repeat the btree
1123 		 * search, etc, because log trees are temporary anyway and it
1124 		 * would only save a few bytes of leaf space.
1125 		 */
1126 		if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
1127 			if (path->slots[0] + 1 >=
1128 			    btrfs_header_nritems(path->nodes[0])) {
1129 				ret = find_next_csum_offset(root, path, &next_offset);
1130 				if (ret < 0)
1131 					goto out;
1132 				found_next = 1;
1133 				goto insert;
1134 			}
1135 
1136 			ret = find_next_csum_offset(root, path, &next_offset);
1137 			if (ret < 0)
1138 				goto out;
1139 
1140 			tmp = (next_offset - bytenr) >> fs_info->sectorsize_bits;
1141 			if (tmp <= INT_MAX)
1142 				extend_nr = min_t(int, extend_nr, tmp);
1143 		}
1144 
1145 		diff = (csum_offset + extend_nr) * csum_size;
1146 		diff = min(diff,
1147 			   MAX_CSUM_ITEMS(fs_info, csum_size) * csum_size);
1148 
1149 		diff = diff - btrfs_item_size(leaf, path->slots[0]);
1150 		diff = min_t(u32, btrfs_leaf_free_space(leaf), diff);
1151 		diff /= csum_size;
1152 		diff *= csum_size;
1153 
1154 		btrfs_extend_item(path, diff);
1155 		ret = 0;
1156 		goto csum;
1157 	}
1158 
1159 insert:
1160 	btrfs_release_path(path);
1161 	csum_offset = 0;
1162 	if (found_next) {
1163 		u64 tmp;
1164 
1165 		tmp = sums->len - total_bytes;
1166 		tmp >>= fs_info->sectorsize_bits;
1167 		tmp = min(tmp, (next_offset - file_key.offset) >>
1168 					 fs_info->sectorsize_bits);
1169 
1170 		tmp = max_t(u64, 1, tmp);
1171 		tmp = min_t(u64, tmp, MAX_CSUM_ITEMS(fs_info, csum_size));
1172 		ins_size = csum_size * tmp;
1173 	} else {
1174 		ins_size = csum_size;
1175 	}
1176 	ret = btrfs_insert_empty_item(trans, root, path, &file_key,
1177 				      ins_size);
1178 	if (ret < 0)
1179 		goto out;
1180 	if (WARN_ON(ret != 0))
1181 		goto out;
1182 	leaf = path->nodes[0];
1183 csum:
1184 	item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
1185 	item_end = (struct btrfs_csum_item *)((unsigned char *)item +
1186 				      btrfs_item_size(leaf, path->slots[0]));
1187 	item = (struct btrfs_csum_item *)((unsigned char *)item +
1188 					  csum_offset * csum_size);
1189 found:
1190 	ins_size = (u32)(sums->len - total_bytes) >> fs_info->sectorsize_bits;
1191 	ins_size *= csum_size;
1192 	ins_size = min_t(u32, (unsigned long)item_end - (unsigned long)item,
1193 			      ins_size);
1194 	write_extent_buffer(leaf, sums->sums + index, (unsigned long)item,
1195 			    ins_size);
1196 
1197 	index += ins_size;
1198 	ins_size /= csum_size;
1199 	total_bytes += ins_size * fs_info->sectorsize;
1200 
1201 	btrfs_mark_buffer_dirty(path->nodes[0]);
1202 	if (total_bytes < sums->len) {
1203 		btrfs_release_path(path);
1204 		cond_resched();
1205 		goto again;
1206 	}
1207 out:
1208 	btrfs_free_path(path);
1209 	return ret;
1210 }
1211 
btrfs_extent_item_to_extent_map(struct btrfs_inode * inode,const struct btrfs_path * path,struct btrfs_file_extent_item * fi,const bool new_inline,struct extent_map * em)1212 void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
1213 				     const struct btrfs_path *path,
1214 				     struct btrfs_file_extent_item *fi,
1215 				     const bool new_inline,
1216 				     struct extent_map *em)
1217 {
1218 	struct btrfs_fs_info *fs_info = inode->root->fs_info;
1219 	struct btrfs_root *root = inode->root;
1220 	struct extent_buffer *leaf = path->nodes[0];
1221 	const int slot = path->slots[0];
1222 	struct btrfs_key key;
1223 	u64 extent_start, extent_end;
1224 	u64 bytenr;
1225 	u8 type = btrfs_file_extent_type(leaf, fi);
1226 	int compress_type = btrfs_file_extent_compression(leaf, fi);
1227 
1228 	btrfs_item_key_to_cpu(leaf, &key, slot);
1229 	extent_start = key.offset;
1230 	extent_end = btrfs_file_extent_end(path);
1231 	em->ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
1232 	em->generation = btrfs_file_extent_generation(leaf, fi);
1233 	if (type == BTRFS_FILE_EXTENT_REG ||
1234 	    type == BTRFS_FILE_EXTENT_PREALLOC) {
1235 		em->start = extent_start;
1236 		em->len = extent_end - extent_start;
1237 		em->orig_start = extent_start -
1238 			btrfs_file_extent_offset(leaf, fi);
1239 		em->orig_block_len = btrfs_file_extent_disk_num_bytes(leaf, fi);
1240 		bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
1241 		if (bytenr == 0) {
1242 			em->block_start = EXTENT_MAP_HOLE;
1243 			return;
1244 		}
1245 		if (compress_type != BTRFS_COMPRESS_NONE) {
1246 			set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
1247 			em->compress_type = compress_type;
1248 			em->block_start = bytenr;
1249 			em->block_len = em->orig_block_len;
1250 		} else {
1251 			bytenr += btrfs_file_extent_offset(leaf, fi);
1252 			em->block_start = bytenr;
1253 			em->block_len = em->len;
1254 			if (type == BTRFS_FILE_EXTENT_PREALLOC)
1255 				set_bit(EXTENT_FLAG_PREALLOC, &em->flags);
1256 		}
1257 	} else if (type == BTRFS_FILE_EXTENT_INLINE) {
1258 		em->block_start = EXTENT_MAP_INLINE;
1259 		em->start = extent_start;
1260 		em->len = extent_end - extent_start;
1261 		/*
1262 		 * Initialize orig_start and block_len with the same values
1263 		 * as in inode.c:btrfs_get_extent().
1264 		 */
1265 		em->orig_start = EXTENT_MAP_HOLE;
1266 		em->block_len = (u64)-1;
1267 		if (!new_inline && compress_type != BTRFS_COMPRESS_NONE) {
1268 			set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
1269 			em->compress_type = compress_type;
1270 		}
1271 	} else {
1272 		btrfs_err(fs_info,
1273 			  "unknown file extent item type %d, inode %llu, offset %llu, "
1274 			  "root %llu", type, btrfs_ino(inode), extent_start,
1275 			  root->root_key.objectid);
1276 	}
1277 }
1278 
1279 /*
1280  * Returns the end offset (non inclusive) of the file extent item the given path
1281  * points to. If it points to an inline extent, the returned offset is rounded
1282  * up to the sector size.
1283  */
btrfs_file_extent_end(const struct btrfs_path * path)1284 u64 btrfs_file_extent_end(const struct btrfs_path *path)
1285 {
1286 	const struct extent_buffer *leaf = path->nodes[0];
1287 	const int slot = path->slots[0];
1288 	struct btrfs_file_extent_item *fi;
1289 	struct btrfs_key key;
1290 	u64 end;
1291 
1292 	btrfs_item_key_to_cpu(leaf, &key, slot);
1293 	ASSERT(key.type == BTRFS_EXTENT_DATA_KEY);
1294 	fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
1295 
1296 	if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_INLINE) {
1297 		end = btrfs_file_extent_ram_bytes(leaf, fi);
1298 		end = ALIGN(key.offset + end, leaf->fs_info->sectorsize);
1299 	} else {
1300 		end = key.offset + btrfs_file_extent_num_bytes(leaf, fi);
1301 	}
1302 
1303 	return end;
1304 }
1305