GNU Linux-libre 6.1.90-gnu
[releases.git] / fs / btrfs / file-item.c
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  */
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  */
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  */
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
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  */
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
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 *
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
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  */
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  */
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  */
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
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  */
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  */
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  */
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
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
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
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  */
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 }