54e111b5faa751d56a99dda0918a4227c470a553
[releases.git] / extent_map.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <linux/err.h>
4 #include <linux/slab.h>
5 #include <linux/spinlock.h>
6 #include "messages.h"
7 #include "ctree.h"
8 #include "volumes.h"
9 #include "extent_map.h"
10 #include "compression.h"
11 #include "btrfs_inode.h"
12
13
14 static struct kmem_cache *extent_map_cache;
15
16 int __init extent_map_init(void)
17 {
18         extent_map_cache = kmem_cache_create("btrfs_extent_map",
19                         sizeof(struct extent_map), 0,
20                         SLAB_MEM_SPREAD, NULL);
21         if (!extent_map_cache)
22                 return -ENOMEM;
23         return 0;
24 }
25
26 void __cold extent_map_exit(void)
27 {
28         kmem_cache_destroy(extent_map_cache);
29 }
30
31 /*
32  * Initialize the extent tree @tree.  Should be called for each new inode or
33  * other user of the extent_map interface.
34  */
35 void extent_map_tree_init(struct extent_map_tree *tree)
36 {
37         tree->map = RB_ROOT_CACHED;
38         INIT_LIST_HEAD(&tree->modified_extents);
39         rwlock_init(&tree->lock);
40 }
41
42 /*
43  * Allocate a new extent_map structure.  The new structure is returned with a
44  * reference count of one and needs to be freed using free_extent_map()
45  */
46 struct extent_map *alloc_extent_map(void)
47 {
48         struct extent_map *em;
49         em = kmem_cache_zalloc(extent_map_cache, GFP_NOFS);
50         if (!em)
51                 return NULL;
52         RB_CLEAR_NODE(&em->rb_node);
53         refcount_set(&em->refs, 1);
54         INIT_LIST_HEAD(&em->list);
55         return em;
56 }
57
58 /*
59  * Drop the reference out on @em by one and free the structure if the reference
60  * count hits zero.
61  */
62 void free_extent_map(struct extent_map *em)
63 {
64         if (!em)
65                 return;
66         if (refcount_dec_and_test(&em->refs)) {
67                 WARN_ON(extent_map_in_tree(em));
68                 WARN_ON(!list_empty(&em->list));
69                 kmem_cache_free(extent_map_cache, em);
70         }
71 }
72
73 /* Do the math around the end of an extent, handling wrapping. */
74 static u64 range_end(u64 start, u64 len)
75 {
76         if (start + len < start)
77                 return (u64)-1;
78         return start + len;
79 }
80
81 static int tree_insert(struct rb_root_cached *root, struct extent_map *em)
82 {
83         struct rb_node **p = &root->rb_root.rb_node;
84         struct rb_node *parent = NULL;
85         struct extent_map *entry = NULL;
86         struct rb_node *orig_parent = NULL;
87         u64 end = range_end(em->start, em->len);
88         bool leftmost = true;
89
90         while (*p) {
91                 parent = *p;
92                 entry = rb_entry(parent, struct extent_map, rb_node);
93
94                 if (em->start < entry->start) {
95                         p = &(*p)->rb_left;
96                 } else if (em->start >= extent_map_end(entry)) {
97                         p = &(*p)->rb_right;
98                         leftmost = false;
99                 } else {
100                         return -EEXIST;
101                 }
102         }
103
104         orig_parent = parent;
105         while (parent && em->start >= extent_map_end(entry)) {
106                 parent = rb_next(parent);
107                 entry = rb_entry(parent, struct extent_map, rb_node);
108         }
109         if (parent)
110                 if (end > entry->start && em->start < extent_map_end(entry))
111                         return -EEXIST;
112
113         parent = orig_parent;
114         entry = rb_entry(parent, struct extent_map, rb_node);
115         while (parent && em->start < entry->start) {
116                 parent = rb_prev(parent);
117                 entry = rb_entry(parent, struct extent_map, rb_node);
118         }
119         if (parent)
120                 if (end > entry->start && em->start < extent_map_end(entry))
121                         return -EEXIST;
122
123         rb_link_node(&em->rb_node, orig_parent, p);
124         rb_insert_color_cached(&em->rb_node, root, leftmost);
125         return 0;
126 }
127
128 /*
129  * Search through the tree for an extent_map with a given offset.  If it can't
130  * be found, try to find some neighboring extents
131  */
132 static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
133                                      struct rb_node **prev_or_next_ret)
134 {
135         struct rb_node *n = root->rb_node;
136         struct rb_node *prev = NULL;
137         struct rb_node *orig_prev = NULL;
138         struct extent_map *entry;
139         struct extent_map *prev_entry = NULL;
140
141         ASSERT(prev_or_next_ret);
142
143         while (n) {
144                 entry = rb_entry(n, struct extent_map, rb_node);
145                 prev = n;
146                 prev_entry = entry;
147
148                 if (offset < entry->start)
149                         n = n->rb_left;
150                 else if (offset >= extent_map_end(entry))
151                         n = n->rb_right;
152                 else
153                         return n;
154         }
155
156         orig_prev = prev;
157         while (prev && offset >= extent_map_end(prev_entry)) {
158                 prev = rb_next(prev);
159                 prev_entry = rb_entry(prev, struct extent_map, rb_node);
160         }
161
162         /*
163          * Previous extent map found, return as in this case the caller does not
164          * care about the next one.
165          */
166         if (prev) {
167                 *prev_or_next_ret = prev;
168                 return NULL;
169         }
170
171         prev = orig_prev;
172         prev_entry = rb_entry(prev, struct extent_map, rb_node);
173         while (prev && offset < prev_entry->start) {
174                 prev = rb_prev(prev);
175                 prev_entry = rb_entry(prev, struct extent_map, rb_node);
176         }
177         *prev_or_next_ret = prev;
178
179         return NULL;
180 }
181
182 static inline u64 extent_map_block_end(const struct extent_map *em)
183 {
184         if (em->block_start + em->block_len < em->block_start)
185                 return (u64)-1;
186         return em->block_start + em->block_len;
187 }
188
189 static bool can_merge_extent_map(const struct extent_map *em)
190 {
191         if (em->flags & EXTENT_FLAG_PINNED)
192                 return false;
193
194         /* Don't merge compressed extents, we need to know their actual size. */
195         if (extent_map_is_compressed(em))
196                 return false;
197
198         if (em->flags & EXTENT_FLAG_LOGGING)
199                 return false;
200
201         /*
202          * We don't want to merge stuff that hasn't been written to the log yet
203          * since it may not reflect exactly what is on disk, and that would be
204          * bad.
205          */
206         if (!list_empty(&em->list))
207                 return false;
208
209         return true;
210 }
211
212 /* Check to see if two extent_map structs are adjacent and safe to merge. */
213 static bool mergeable_maps(const struct extent_map *prev, const struct extent_map *next)
214 {
215         if (extent_map_end(prev) != next->start)
216                 return false;
217
218         if (prev->flags != next->flags)
219                 return false;
220
221         if (next->block_start < EXTENT_MAP_LAST_BYTE - 1)
222                 return next->block_start == extent_map_block_end(prev);
223
224         /* HOLES and INLINE extents. */
225         return next->block_start == prev->block_start;
226 }
227
228 static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
229 {
230         struct extent_map *merge = NULL;
231         struct rb_node *rb;
232
233         /*
234          * We can't modify an extent map that is in the tree and that is being
235          * used by another task, as it can cause that other task to see it in
236          * inconsistent state during the merging. We always have 1 reference for
237          * the tree and 1 for this task (which is unpinning the extent map or
238          * clearing the logging flag), so anything > 2 means it's being used by
239          * other tasks too.
240          */
241         if (refcount_read(&em->refs) > 2)
242                 return;
243
244         if (!can_merge_extent_map(em))
245                 return;
246
247         if (em->start != 0) {
248                 rb = rb_prev(&em->rb_node);
249                 if (rb)
250                         merge = rb_entry(rb, struct extent_map, rb_node);
251                 if (rb && can_merge_extent_map(merge) && mergeable_maps(merge, em)) {
252                         em->start = merge->start;
253                         em->orig_start = merge->orig_start;
254                         em->len += merge->len;
255                         em->block_len += merge->block_len;
256                         em->block_start = merge->block_start;
257                         em->mod_len = (em->mod_len + em->mod_start) - merge->mod_start;
258                         em->mod_start = merge->mod_start;
259                         em->generation = max(em->generation, merge->generation);
260                         em->flags |= EXTENT_FLAG_MERGED;
261
262                         rb_erase_cached(&merge->rb_node, &tree->map);
263                         RB_CLEAR_NODE(&merge->rb_node);
264                         free_extent_map(merge);
265                 }
266         }
267
268         rb = rb_next(&em->rb_node);
269         if (rb)
270                 merge = rb_entry(rb, struct extent_map, rb_node);
271         if (rb && can_merge_extent_map(merge) && mergeable_maps(em, merge)) {
272                 em->len += merge->len;
273                 em->block_len += merge->block_len;
274                 rb_erase_cached(&merge->rb_node, &tree->map);
275                 RB_CLEAR_NODE(&merge->rb_node);
276                 em->mod_len = (merge->mod_start + merge->mod_len) - em->mod_start;
277                 em->generation = max(em->generation, merge->generation);
278                 em->flags |= EXTENT_FLAG_MERGED;
279                 free_extent_map(merge);
280         }
281 }
282
283 /*
284  * Unpin an extent from the cache.
285  *
286  * @inode:      the inode from which we are unpinning an extent range
287  * @start:      logical offset in the file
288  * @len:        length of the extent
289  * @gen:        generation that this extent has been modified in
290  *
291  * Called after an extent has been written to disk properly.  Set the generation
292  * to the generation that actually added the file item to the inode so we know
293  * we need to sync this extent when we call fsync().
294  *
295  * Returns: 0        on success
296  *          -ENOENT  when the extent is not found in the tree
297  *          -EUCLEAN if the found extent does not match the expected start
298  */
299 int unpin_extent_cache(struct btrfs_inode *inode, u64 start, u64 len, u64 gen)
300 {
301         struct btrfs_fs_info *fs_info = inode->root->fs_info;
302         struct extent_map_tree *tree = &inode->extent_tree;
303         int ret = 0;
304         struct extent_map *em;
305         bool prealloc = false;
306
307         write_lock(&tree->lock);
308         em = lookup_extent_mapping(tree, start, len);
309
310         if (WARN_ON(!em)) {
311                 btrfs_warn(fs_info,
312 "no extent map found for inode %llu (root %lld) when unpinning extent range [%llu, %llu), generation %llu",
313                            btrfs_ino(inode), btrfs_root_id(inode->root),
314                            start, start + len, gen);
315                 ret = -ENOENT;
316                 goto out;
317         }
318
319         if (WARN_ON(em->start != start)) {
320                 btrfs_warn(fs_info,
321 "found extent map for inode %llu (root %lld) with unexpected start offset %llu when unpinning extent range [%llu, %llu), generation %llu",
322                            btrfs_ino(inode), btrfs_root_id(inode->root),
323                            em->start, start, start + len, gen);
324                 ret = -EUCLEAN;
325                 goto out;
326         }
327
328         em->generation = gen;
329         em->flags &= ~EXTENT_FLAG_PINNED;
330         em->mod_start = em->start;
331         em->mod_len = em->len;
332
333         if (em->flags & EXTENT_FLAG_FILLING) {
334                 prealloc = true;
335                 em->flags &= ~EXTENT_FLAG_FILLING;
336         }
337
338         try_merge_map(tree, em);
339
340         if (prealloc) {
341                 em->mod_start = em->start;
342                 em->mod_len = em->len;
343         }
344
345 out:
346         write_unlock(&tree->lock);
347         free_extent_map(em);
348         return ret;
349
350 }
351
352 void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em)
353 {
354         lockdep_assert_held_write(&tree->lock);
355
356         em->flags &= ~EXTENT_FLAG_LOGGING;
357         if (extent_map_in_tree(em))
358                 try_merge_map(tree, em);
359 }
360
361 static inline void setup_extent_mapping(struct extent_map_tree *tree,
362                                         struct extent_map *em,
363                                         int modified)
364 {
365         refcount_inc(&em->refs);
366         em->mod_start = em->start;
367         em->mod_len = em->len;
368
369         ASSERT(list_empty(&em->list));
370
371         if (modified)
372                 list_add(&em->list, &tree->modified_extents);
373         else
374                 try_merge_map(tree, em);
375 }
376
377 /*
378  * Add new extent map to the extent tree
379  *
380  * @tree:       tree to insert new map in
381  * @em:         map to insert
382  * @modified:   indicate whether the given @em should be added to the
383  *              modified list, which indicates the extent needs to be logged
384  *
385  * Insert @em into @tree or perform a simple forward/backward merge with
386  * existing mappings.  The extent_map struct passed in will be inserted
387  * into the tree directly, with an additional reference taken, or a
388  * reference dropped if the merge attempt was successful.
389  */
390 static int add_extent_mapping(struct extent_map_tree *tree,
391                               struct extent_map *em, int modified)
392 {
393         int ret = 0;
394
395         lockdep_assert_held_write(&tree->lock);
396
397         ret = tree_insert(&tree->map, em);
398         if (ret)
399                 goto out;
400
401         setup_extent_mapping(tree, em, modified);
402 out:
403         return ret;
404 }
405
406 static struct extent_map *
407 __lookup_extent_mapping(struct extent_map_tree *tree,
408                         u64 start, u64 len, int strict)
409 {
410         struct extent_map *em;
411         struct rb_node *rb_node;
412         struct rb_node *prev_or_next = NULL;
413         u64 end = range_end(start, len);
414
415         rb_node = __tree_search(&tree->map.rb_root, start, &prev_or_next);
416         if (!rb_node) {
417                 if (prev_or_next)
418                         rb_node = prev_or_next;
419                 else
420                         return NULL;
421         }
422
423         em = rb_entry(rb_node, struct extent_map, rb_node);
424
425         if (strict && !(end > em->start && start < extent_map_end(em)))
426                 return NULL;
427
428         refcount_inc(&em->refs);
429         return em;
430 }
431
432 /*
433  * Lookup extent_map that intersects @start + @len range.
434  *
435  * @tree:       tree to lookup in
436  * @start:      byte offset to start the search
437  * @len:        length of the lookup range
438  *
439  * Find and return the first extent_map struct in @tree that intersects the
440  * [start, len] range.  There may be additional objects in the tree that
441  * intersect, so check the object returned carefully to make sure that no
442  * additional lookups are needed.
443  */
444 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
445                                          u64 start, u64 len)
446 {
447         return __lookup_extent_mapping(tree, start, len, 1);
448 }
449
450 /*
451  * Find a nearby extent map intersecting @start + @len (not an exact search).
452  *
453  * @tree:       tree to lookup in
454  * @start:      byte offset to start the search
455  * @len:        length of the lookup range
456  *
457  * Find and return the first extent_map struct in @tree that intersects the
458  * [start, len] range.
459  *
460  * If one can't be found, any nearby extent may be returned
461  */
462 struct extent_map *search_extent_mapping(struct extent_map_tree *tree,
463                                          u64 start, u64 len)
464 {
465         return __lookup_extent_mapping(tree, start, len, 0);
466 }
467
468 /*
469  * Remove an extent_map from the extent tree.
470  *
471  * @tree:       extent tree to remove from
472  * @em:         extent map being removed
473  *
474  * Remove @em from @tree.  No reference counts are dropped, and no checks
475  * are done to see if the range is in use.
476  */
477 void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em)
478 {
479         lockdep_assert_held_write(&tree->lock);
480
481         WARN_ON(em->flags & EXTENT_FLAG_PINNED);
482         rb_erase_cached(&em->rb_node, &tree->map);
483         if (!(em->flags & EXTENT_FLAG_LOGGING))
484                 list_del_init(&em->list);
485         RB_CLEAR_NODE(&em->rb_node);
486 }
487
488 static void replace_extent_mapping(struct extent_map_tree *tree,
489                                    struct extent_map *cur,
490                                    struct extent_map *new,
491                                    int modified)
492 {
493         lockdep_assert_held_write(&tree->lock);
494
495         WARN_ON(cur->flags & EXTENT_FLAG_PINNED);
496         ASSERT(extent_map_in_tree(cur));
497         if (!(cur->flags & EXTENT_FLAG_LOGGING))
498                 list_del_init(&cur->list);
499         rb_replace_node_cached(&cur->rb_node, &new->rb_node, &tree->map);
500         RB_CLEAR_NODE(&cur->rb_node);
501
502         setup_extent_mapping(tree, new, modified);
503 }
504
505 static struct extent_map *next_extent_map(const struct extent_map *em)
506 {
507         struct rb_node *next;
508
509         next = rb_next(&em->rb_node);
510         if (!next)
511                 return NULL;
512         return container_of(next, struct extent_map, rb_node);
513 }
514
515 static struct extent_map *prev_extent_map(struct extent_map *em)
516 {
517         struct rb_node *prev;
518
519         prev = rb_prev(&em->rb_node);
520         if (!prev)
521                 return NULL;
522         return container_of(prev, struct extent_map, rb_node);
523 }
524
525 /*
526  * Helper for btrfs_get_extent.  Given an existing extent in the tree,
527  * the existing extent is the nearest extent to map_start,
528  * and an extent that you want to insert, deal with overlap and insert
529  * the best fitted new extent into the tree.
530  */
531 static noinline int merge_extent_mapping(struct extent_map_tree *em_tree,
532                                          struct extent_map *existing,
533                                          struct extent_map *em,
534                                          u64 map_start)
535 {
536         struct extent_map *prev;
537         struct extent_map *next;
538         u64 start;
539         u64 end;
540         u64 start_diff;
541
542         BUG_ON(map_start < em->start || map_start >= extent_map_end(em));
543
544         if (existing->start > map_start) {
545                 next = existing;
546                 prev = prev_extent_map(next);
547         } else {
548                 prev = existing;
549                 next = next_extent_map(prev);
550         }
551
552         start = prev ? extent_map_end(prev) : em->start;
553         start = max_t(u64, start, em->start);
554         end = next ? next->start : extent_map_end(em);
555         end = min_t(u64, end, extent_map_end(em));
556         start_diff = start - em->start;
557         em->start = start;
558         em->len = end - start;
559         if (em->block_start < EXTENT_MAP_LAST_BYTE &&
560             !extent_map_is_compressed(em)) {
561                 em->block_start += start_diff;
562                 em->block_len = em->len;
563         }
564         return add_extent_mapping(em_tree, em, 0);
565 }
566
567 /*
568  * Add extent mapping into em_tree.
569  *
570  * @fs_info:  the filesystem
571  * @em_tree:  extent tree into which we want to insert the extent mapping
572  * @em_in:    extent we are inserting
573  * @start:    start of the logical range btrfs_get_extent() is requesting
574  * @len:      length of the logical range btrfs_get_extent() is requesting
575  *
576  * Note that @em_in's range may be different from [start, start+len),
577  * but they must be overlapped.
578  *
579  * Insert @em_in into @em_tree. In case there is an overlapping range, handle
580  * the -EEXIST by either:
581  * a) Returning the existing extent in @em_in if @start is within the
582  *    existing em.
583  * b) Merge the existing extent with @em_in passed in.
584  *
585  * Return 0 on success, otherwise -EEXIST.
586  *
587  */
588 int btrfs_add_extent_mapping(struct btrfs_fs_info *fs_info,
589                              struct extent_map_tree *em_tree,
590                              struct extent_map **em_in, u64 start, u64 len)
591 {
592         int ret;
593         struct extent_map *em = *em_in;
594
595         /*
596          * Tree-checker should have rejected any inline extent with non-zero
597          * file offset. Here just do a sanity check.
598          */
599         if (em->block_start == EXTENT_MAP_INLINE)
600                 ASSERT(em->start == 0);
601
602         ret = add_extent_mapping(em_tree, em, 0);
603         /* it is possible that someone inserted the extent into the tree
604          * while we had the lock dropped.  It is also possible that
605          * an overlapping map exists in the tree
606          */
607         if (ret == -EEXIST) {
608                 struct extent_map *existing;
609
610                 existing = search_extent_mapping(em_tree, start, len);
611
612                 trace_btrfs_handle_em_exist(fs_info, existing, em, start, len);
613
614                 /*
615                  * existing will always be non-NULL, since there must be
616                  * extent causing the -EEXIST.
617                  */
618                 if (start >= existing->start &&
619                     start < extent_map_end(existing)) {
620                         free_extent_map(em);
621                         *em_in = existing;
622                         ret = 0;
623                 } else {
624                         u64 orig_start = em->start;
625                         u64 orig_len = em->len;
626
627                         /*
628                          * The existing extent map is the one nearest to
629                          * the [start, start + len) range which overlaps
630                          */
631                         ret = merge_extent_mapping(em_tree, existing,
632                                                    em, start);
633                         if (ret) {
634                                 free_extent_map(em);
635                                 *em_in = NULL;
636                                 WARN_ONCE(ret,
637 "unexpected error %d: merge existing(start %llu len %llu) with em(start %llu len %llu)\n",
638                                           ret, existing->start, existing->len,
639                                           orig_start, orig_len);
640                         }
641                         free_extent_map(existing);
642                 }
643         }
644
645         ASSERT(ret == 0 || ret == -EEXIST);
646         return ret;
647 }
648
649 /*
650  * Drop all extent maps from a tree in the fastest possible way, rescheduling
651  * if needed. This avoids searching the tree, from the root down to the first
652  * extent map, before each deletion.
653  */
654 static void drop_all_extent_maps_fast(struct extent_map_tree *tree)
655 {
656         write_lock(&tree->lock);
657         while (!RB_EMPTY_ROOT(&tree->map.rb_root)) {
658                 struct extent_map *em;
659                 struct rb_node *node;
660
661                 node = rb_first_cached(&tree->map);
662                 em = rb_entry(node, struct extent_map, rb_node);
663                 em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING);
664                 remove_extent_mapping(tree, em);
665                 free_extent_map(em);
666                 cond_resched_rwlock_write(&tree->lock);
667         }
668         write_unlock(&tree->lock);
669 }
670
671 /*
672  * Drop all extent maps in a given range.
673  *
674  * @inode:       The target inode.
675  * @start:       Start offset of the range.
676  * @end:         End offset of the range (inclusive value).
677  * @skip_pinned: Indicate if pinned extent maps should be ignored or not.
678  *
679  * This drops all the extent maps that intersect the given range [@start, @end].
680  * Extent maps that partially overlap the range and extend behind or beyond it,
681  * are split.
682  * The caller should have locked an appropriate file range in the inode's io
683  * tree before calling this function.
684  */
685 void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
686                                  bool skip_pinned)
687 {
688         struct extent_map *split;
689         struct extent_map *split2;
690         struct extent_map *em;
691         struct extent_map_tree *em_tree = &inode->extent_tree;
692         u64 len = end - start + 1;
693
694         WARN_ON(end < start);
695         if (end == (u64)-1) {
696                 if (start == 0 && !skip_pinned) {
697                         drop_all_extent_maps_fast(em_tree);
698                         return;
699                 }
700                 len = (u64)-1;
701         } else {
702                 /* Make end offset exclusive for use in the loop below. */
703                 end++;
704         }
705
706         /*
707          * It's ok if we fail to allocate the extent maps, see the comment near
708          * the bottom of the loop below. We only need two spare extent maps in
709          * the worst case, where the first extent map that intersects our range
710          * starts before the range and the last extent map that intersects our
711          * range ends after our range (and they might be the same extent map),
712          * because we need to split those two extent maps at the boundaries.
713          */
714         split = alloc_extent_map();
715         split2 = alloc_extent_map();
716
717         write_lock(&em_tree->lock);
718         em = lookup_extent_mapping(em_tree, start, len);
719
720         while (em) {
721                 /* extent_map_end() returns exclusive value (last byte + 1). */
722                 const u64 em_end = extent_map_end(em);
723                 struct extent_map *next_em = NULL;
724                 u64 gen;
725                 unsigned long flags;
726                 bool modified;
727                 bool compressed;
728
729                 if (em_end < end) {
730                         next_em = next_extent_map(em);
731                         if (next_em) {
732                                 if (next_em->start < end)
733                                         refcount_inc(&next_em->refs);
734                                 else
735                                         next_em = NULL;
736                         }
737                 }
738
739                 if (skip_pinned && (em->flags & EXTENT_FLAG_PINNED)) {
740                         start = em_end;
741                         goto next;
742                 }
743
744                 flags = em->flags;
745                 /*
746                  * In case we split the extent map, we want to preserve the
747                  * EXTENT_FLAG_LOGGING flag on our extent map, but we don't want
748                  * it on the new extent maps.
749                  */
750                 em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING);
751                 modified = !list_empty(&em->list);
752
753                 /*
754                  * The extent map does not cross our target range, so no need to
755                  * split it, we can remove it directly.
756                  */
757                 if (em->start >= start && em_end <= end)
758                         goto remove_em;
759
760                 gen = em->generation;
761                 compressed = extent_map_is_compressed(em);
762
763                 if (em->start < start) {
764                         if (!split) {
765                                 split = split2;
766                                 split2 = NULL;
767                                 if (!split)
768                                         goto remove_em;
769                         }
770                         split->start = em->start;
771                         split->len = start - em->start;
772
773                         if (em->block_start < EXTENT_MAP_LAST_BYTE) {
774                                 split->orig_start = em->orig_start;
775                                 split->block_start = em->block_start;
776
777                                 if (compressed)
778                                         split->block_len = em->block_len;
779                                 else
780                                         split->block_len = split->len;
781                                 split->orig_block_len = max(split->block_len,
782                                                 em->orig_block_len);
783                                 split->ram_bytes = em->ram_bytes;
784                         } else {
785                                 split->orig_start = split->start;
786                                 split->block_len = 0;
787                                 split->block_start = em->block_start;
788                                 split->orig_block_len = 0;
789                                 split->ram_bytes = split->len;
790                         }
791
792                         split->generation = gen;
793                         split->flags = flags;
794                         replace_extent_mapping(em_tree, em, split, modified);
795                         free_extent_map(split);
796                         split = split2;
797                         split2 = NULL;
798                 }
799                 if (em_end > end) {
800                         if (!split) {
801                                 split = split2;
802                                 split2 = NULL;
803                                 if (!split)
804                                         goto remove_em;
805                         }
806                         split->start = end;
807                         split->len = em_end - end;
808                         split->block_start = em->block_start;
809                         split->flags = flags;
810                         split->generation = gen;
811
812                         if (em->block_start < EXTENT_MAP_LAST_BYTE) {
813                                 split->orig_block_len = max(em->block_len,
814                                                     em->orig_block_len);
815
816                                 split->ram_bytes = em->ram_bytes;
817                                 if (compressed) {
818                                         split->block_len = em->block_len;
819                                         split->orig_start = em->orig_start;
820                                 } else {
821                                         const u64 diff = end - em->start;
822
823                                         split->block_len = split->len;
824                                         split->block_start += diff;
825                                         split->orig_start = em->orig_start;
826                                 }
827                         } else {
828                                 split->ram_bytes = split->len;
829                                 split->orig_start = split->start;
830                                 split->block_len = 0;
831                                 split->orig_block_len = 0;
832                         }
833
834                         if (extent_map_in_tree(em)) {
835                                 replace_extent_mapping(em_tree, em, split,
836                                                        modified);
837                         } else {
838                                 int ret;
839
840                                 ret = add_extent_mapping(em_tree, split,
841                                                          modified);
842                                 /* Logic error, shouldn't happen. */
843                                 ASSERT(ret == 0);
844                                 if (WARN_ON(ret != 0) && modified)
845                                         btrfs_set_inode_full_sync(inode);
846                         }
847                         free_extent_map(split);
848                         split = NULL;
849                 }
850 remove_em:
851                 if (extent_map_in_tree(em)) {
852                         /*
853                          * If the extent map is still in the tree it means that
854                          * either of the following is true:
855                          *
856                          * 1) It fits entirely in our range (doesn't end beyond
857                          *    it or starts before it);
858                          *
859                          * 2) It starts before our range and/or ends after our
860                          *    range, and we were not able to allocate the extent
861                          *    maps for split operations, @split and @split2.
862                          *
863                          * If we are at case 2) then we just remove the entire
864                          * extent map - this is fine since if anyone needs it to
865                          * access the subranges outside our range, will just
866                          * load it again from the subvolume tree's file extent
867                          * item. However if the extent map was in the list of
868                          * modified extents, then we must mark the inode for a
869                          * full fsync, otherwise a fast fsync will miss this
870                          * extent if it's new and needs to be logged.
871                          */
872                         if ((em->start < start || em_end > end) && modified) {
873                                 ASSERT(!split);
874                                 btrfs_set_inode_full_sync(inode);
875                         }
876                         remove_extent_mapping(em_tree, em);
877                 }
878
879                 /*
880                  * Once for the tree reference (we replaced or removed the
881                  * extent map from the tree).
882                  */
883                 free_extent_map(em);
884 next:
885                 /* Once for us (for our lookup reference). */
886                 free_extent_map(em);
887
888                 em = next_em;
889         }
890
891         write_unlock(&em_tree->lock);
892
893         free_extent_map(split);
894         free_extent_map(split2);
895 }
896
897 /*
898  * Replace a range in the inode's extent map tree with a new extent map.
899  *
900  * @inode:      The target inode.
901  * @new_em:     The new extent map to add to the inode's extent map tree.
902  * @modified:   Indicate if the new extent map should be added to the list of
903  *              modified extents (for fast fsync tracking).
904  *
905  * Drops all the extent maps in the inode's extent map tree that intersect the
906  * range of the new extent map and adds the new extent map to the tree.
907  * The caller should have locked an appropriate file range in the inode's io
908  * tree before calling this function.
909  */
910 int btrfs_replace_extent_map_range(struct btrfs_inode *inode,
911                                    struct extent_map *new_em,
912                                    bool modified)
913 {
914         const u64 end = new_em->start + new_em->len - 1;
915         struct extent_map_tree *tree = &inode->extent_tree;
916         int ret;
917
918         ASSERT(!extent_map_in_tree(new_em));
919
920         /*
921          * The caller has locked an appropriate file range in the inode's io
922          * tree, but getting -EEXIST when adding the new extent map can still
923          * happen in case there are extents that partially cover the range, and
924          * this is due to two tasks operating on different parts of the extent.
925          * See commit 18e83ac75bfe67 ("Btrfs: fix unexpected EEXIST from
926          * btrfs_get_extent") for an example and details.
927          */
928         do {
929                 btrfs_drop_extent_map_range(inode, new_em->start, end, false);
930                 write_lock(&tree->lock);
931                 ret = add_extent_mapping(tree, new_em, modified);
932                 write_unlock(&tree->lock);
933         } while (ret == -EEXIST);
934
935         return ret;
936 }
937
938 /*
939  * Split off the first pre bytes from the extent_map at [start, start + len],
940  * and set the block_start for it to new_logical.
941  *
942  * This function is used when an ordered_extent needs to be split.
943  */
944 int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
945                      u64 new_logical)
946 {
947         struct extent_map_tree *em_tree = &inode->extent_tree;
948         struct extent_map *em;
949         struct extent_map *split_pre = NULL;
950         struct extent_map *split_mid = NULL;
951         int ret = 0;
952         unsigned long flags;
953
954         ASSERT(pre != 0);
955         ASSERT(pre < len);
956
957         split_pre = alloc_extent_map();
958         if (!split_pre)
959                 return -ENOMEM;
960         split_mid = alloc_extent_map();
961         if (!split_mid) {
962                 ret = -ENOMEM;
963                 goto out_free_pre;
964         }
965
966         lock_extent(&inode->io_tree, start, start + len - 1, NULL);
967         write_lock(&em_tree->lock);
968         em = lookup_extent_mapping(em_tree, start, len);
969         if (!em) {
970                 ret = -EIO;
971                 goto out_unlock;
972         }
973
974         ASSERT(em->len == len);
975         ASSERT(!extent_map_is_compressed(em));
976         ASSERT(em->block_start < EXTENT_MAP_LAST_BYTE);
977         ASSERT(em->flags & EXTENT_FLAG_PINNED);
978         ASSERT(!(em->flags & EXTENT_FLAG_LOGGING));
979         ASSERT(!list_empty(&em->list));
980
981         flags = em->flags;
982         em->flags &= ~EXTENT_FLAG_PINNED;
983
984         /* First, replace the em with a new extent_map starting from * em->start */
985         split_pre->start = em->start;
986         split_pre->len = pre;
987         split_pre->orig_start = split_pre->start;
988         split_pre->block_start = new_logical;
989         split_pre->block_len = split_pre->len;
990         split_pre->orig_block_len = split_pre->block_len;
991         split_pre->ram_bytes = split_pre->len;
992         split_pre->flags = flags;
993         split_pre->generation = em->generation;
994
995         replace_extent_mapping(em_tree, em, split_pre, 1);
996
997         /*
998          * Now we only have an extent_map at:
999          *     [em->start, em->start + pre]
1000          */
1001
1002         /* Insert the middle extent_map. */
1003         split_mid->start = em->start + pre;
1004         split_mid->len = em->len - pre;
1005         split_mid->orig_start = split_mid->start;
1006         split_mid->block_start = em->block_start + pre;
1007         split_mid->block_len = split_mid->len;
1008         split_mid->orig_block_len = split_mid->block_len;
1009         split_mid->ram_bytes = split_mid->len;
1010         split_mid->flags = flags;
1011         split_mid->generation = em->generation;
1012         add_extent_mapping(em_tree, split_mid, 1);
1013
1014         /* Once for us */
1015         free_extent_map(em);
1016         /* Once for the tree */
1017         free_extent_map(em);
1018
1019 out_unlock:
1020         write_unlock(&em_tree->lock);
1021         unlock_extent(&inode->io_tree, start, start + len - 1, NULL);
1022         free_extent_map(split_mid);
1023 out_free_pre:
1024         free_extent_map(split_pre);
1025         return ret;
1026 }