Lines Matching full:em

47 	struct extent_map *em;  in alloc_extent_map()  local
48 em = kmem_cache_zalloc(extent_map_cache, GFP_NOFS); in alloc_extent_map()
49 if (!em) in alloc_extent_map()
51 RB_CLEAR_NODE(&em->rb_node); in alloc_extent_map()
52 refcount_set(&em->refs, 1); in alloc_extent_map()
53 INIT_LIST_HEAD(&em->list); in alloc_extent_map()
54 return em; in alloc_extent_map()
58 * Drop the reference out on @em by one and free the structure if the reference
61 void free_extent_map(struct extent_map *em) in free_extent_map() argument
63 if (!em) in free_extent_map()
65 if (refcount_dec_and_test(&em->refs)) { in free_extent_map()
66 WARN_ON(extent_map_in_tree(em)); in free_extent_map()
67 WARN_ON(!list_empty(&em->list)); in free_extent_map()
68 kmem_cache_free(extent_map_cache, em); in free_extent_map()
80 static void remove_em(struct btrfs_inode *inode, struct extent_map *em) in remove_em() argument
84 rb_erase(&em->rb_node, &inode->extent_tree.root); in remove_em()
85 RB_CLEAR_NODE(&em->rb_node); in remove_em()
91 static int tree_insert(struct rb_root *root, struct extent_map *em) in tree_insert() argument
97 u64 end = range_end(em->start, em->len); in tree_insert()
103 if (em->start < entry->start) in tree_insert()
105 else if (em->start >= extent_map_end(entry)) in tree_insert()
112 while (parent && em->start >= extent_map_end(entry)) { in tree_insert()
117 if (end > entry->start && em->start < extent_map_end(entry)) in tree_insert()
122 while (parent && em->start < entry->start) { in tree_insert()
127 if (end > entry->start && em->start < extent_map_end(entry)) in tree_insert()
130 rb_link_node(&em->rb_node, orig_parent, p); in tree_insert()
131 rb_insert_color(&em->rb_node, root); in tree_insert()
189 static inline u64 extent_map_block_len(const struct extent_map *em) in extent_map_block_len() argument
191 if (extent_map_is_compressed(em)) in extent_map_block_len()
192 return em->disk_num_bytes; in extent_map_block_len()
193 return em->len; in extent_map_block_len()
196 static inline u64 extent_map_block_end(const struct extent_map *em) in extent_map_block_end() argument
198 const u64 block_start = extent_map_block_start(em); in extent_map_block_end()
199 const u64 block_end = block_start + extent_map_block_len(em); in extent_map_block_end()
207 static bool can_merge_extent_map(const struct extent_map *em) in can_merge_extent_map() argument
209 if (em->flags & EXTENT_FLAG_PINNED) in can_merge_extent_map()
213 if (extent_map_is_compressed(em)) in can_merge_extent_map()
216 if (em->flags & EXTENT_FLAG_LOGGING) in can_merge_extent_map()
224 if (!list_empty(&em->list)) in can_merge_extent_map()
308 struct extent_map *em) in dump_extent_map() argument
314 prefix, em->start, em->len, em->disk_bytenr, em->disk_num_bytes, in dump_extent_map()
315 em->ram_bytes, em->offset, em->flags); in dump_extent_map()
320 static void validate_extent_map(struct btrfs_fs_info *fs_info, struct extent_map *em) in validate_extent_map() argument
324 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) { in validate_extent_map()
325 if (em->disk_num_bytes == 0) in validate_extent_map()
326 dump_extent_map(fs_info, "zero disk_num_bytes", em); in validate_extent_map()
327 if (em->offset + em->len > em->ram_bytes) in validate_extent_map()
328 dump_extent_map(fs_info, "ram_bytes too small", em); in validate_extent_map()
329 if (em->offset + em->len > em->disk_num_bytes && in validate_extent_map()
330 !extent_map_is_compressed(em)) in validate_extent_map()
331 dump_extent_map(fs_info, "disk_num_bytes too small", em); in validate_extent_map()
332 if (!extent_map_is_compressed(em) && in validate_extent_map()
333 em->ram_bytes != em->disk_num_bytes) in validate_extent_map()
335 "ram_bytes mismatch with disk_num_bytes for non-compressed em", in validate_extent_map()
336 em); in validate_extent_map()
337 } else if (em->offset) { in validate_extent_map()
338 dump_extent_map(fs_info, "non-zero offset for hole/inline", em); in validate_extent_map()
342 static void try_merge_map(struct btrfs_inode *inode, struct extent_map *em) in try_merge_map() argument
356 if (refcount_read(&em->refs) > 2) in try_merge_map()
359 if (!can_merge_extent_map(em)) in try_merge_map()
362 if (em->start != 0) { in try_merge_map()
363 rb = rb_prev(&em->rb_node); in try_merge_map()
366 if (rb && can_merge_extent_map(merge) && mergeable_maps(merge, em)) { in try_merge_map()
367 em->start = merge->start; in try_merge_map()
368 em->len += merge->len; in try_merge_map()
369 em->generation = max(em->generation, merge->generation); in try_merge_map()
371 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) in try_merge_map()
372 merge_ondisk_extents(merge, em, em); in try_merge_map()
373 em->flags |= EXTENT_FLAG_MERGED; in try_merge_map()
375 validate_extent_map(fs_info, em); in try_merge_map()
381 rb = rb_next(&em->rb_node); in try_merge_map()
384 if (rb && can_merge_extent_map(merge) && mergeable_maps(em, merge)) { in try_merge_map()
385 em->len += merge->len; in try_merge_map()
386 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) in try_merge_map()
387 merge_ondisk_extents(em, merge, em); in try_merge_map()
388 validate_extent_map(fs_info, em); in try_merge_map()
389 em->generation = max(em->generation, merge->generation); in try_merge_map()
390 em->flags |= EXTENT_FLAG_MERGED; in try_merge_map()
417 struct extent_map *em; in unpin_extent_cache() local
420 em = lookup_extent_mapping(tree, start, len); in unpin_extent_cache()
422 if (WARN_ON(!em)) { in unpin_extent_cache()
431 if (WARN_ON(em->start != start)) { in unpin_extent_cache()
435 em->start, start, start + len, gen); in unpin_extent_cache()
440 em->generation = gen; in unpin_extent_cache()
441 em->flags &= ~EXTENT_FLAG_PINNED; in unpin_extent_cache()
443 try_merge_map(inode, em); in unpin_extent_cache()
447 free_extent_map(em); in unpin_extent_cache()
452 void clear_em_logging(struct btrfs_inode *inode, struct extent_map *em) in clear_em_logging() argument
456 em->flags &= ~EXTENT_FLAG_LOGGING; in clear_em_logging()
457 if (extent_map_in_tree(em)) in clear_em_logging()
458 try_merge_map(inode, em); in clear_em_logging()
462 struct extent_map *em, in setup_extent_mapping() argument
465 refcount_inc(&em->refs); in setup_extent_mapping()
467 ASSERT(list_empty(&em->list)); in setup_extent_mapping()
470 list_add(&em->list, &inode->extent_tree.modified_extents); in setup_extent_mapping()
472 try_merge_map(inode, em); in setup_extent_mapping()
479 * @em: map to insert
480 * @modified: indicate whether the given @em should be added to the
483 * Insert @em into the @inode's extent map tree or perform a simple
489 struct extent_map *em, int modified) in add_extent_mapping() argument
498 validate_extent_map(fs_info, em); in add_extent_mapping()
499 ret = tree_insert(&tree->root, em); in add_extent_mapping()
503 setup_extent_mapping(inode, em, modified); in add_extent_mapping()
515 struct extent_map *em; in __lookup_extent_mapping() local
528 em = rb_entry(rb_node, struct extent_map, rb_node); in __lookup_extent_mapping()
530 if (strict && !(end > em->start && start < extent_map_end(em))) in __lookup_extent_mapping()
533 refcount_inc(&em->refs); in __lookup_extent_mapping()
534 return em; in __lookup_extent_mapping()
577 * @em: extent map being removed
579 * Remove @em from the extent tree of @inode. No reference counts are dropped,
582 void remove_extent_mapping(struct btrfs_inode *inode, struct extent_map *em) in remove_extent_mapping() argument
588 WARN_ON(em->flags & EXTENT_FLAG_PINNED); in remove_extent_mapping()
589 if (!(em->flags & EXTENT_FLAG_LOGGING)) in remove_extent_mapping()
590 list_del_init(&em->list); in remove_extent_mapping()
592 remove_em(inode, em); in remove_extent_mapping()
617 static struct extent_map *next_extent_map(const struct extent_map *em) in next_extent_map() argument
621 next = rb_next(&em->rb_node); in next_extent_map()
627 static struct extent_map *prev_extent_map(struct extent_map *em) in prev_extent_map() argument
631 prev = rb_prev(&em->rb_node); in prev_extent_map()
645 struct extent_map *em, in merge_extent_mapping() argument
654 if (map_start < em->start || map_start >= extent_map_end(em)) in merge_extent_mapping()
665 start = prev ? extent_map_end(prev) : em->start; in merge_extent_mapping()
666 start = max_t(u64, start, em->start); in merge_extent_mapping()
667 end = next ? next->start : extent_map_end(em); in merge_extent_mapping()
668 end = min_t(u64, end, extent_map_end(em)); in merge_extent_mapping()
669 start_diff = start - em->start; in merge_extent_mapping()
670 em->start = start; in merge_extent_mapping()
671 em->len = end - start; in merge_extent_mapping()
672 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) in merge_extent_mapping()
673 em->offset += start_diff; in merge_extent_mapping()
674 return add_extent_mapping(inode, em, 0); in merge_extent_mapping()
691 * existing em.
701 struct extent_map *em = *em_in; in btrfs_add_extent_mapping() local
708 if (em->disk_bytenr == EXTENT_MAP_INLINE) in btrfs_add_extent_mapping()
709 ASSERT(em->start == 0); in btrfs_add_extent_mapping()
711 ret = add_extent_mapping(inode, em, 0); in btrfs_add_extent_mapping()
721 trace_btrfs_handle_em_exist(fs_info, existing, em, start, len); in btrfs_add_extent_mapping()
729 free_extent_map(em); in btrfs_add_extent_mapping()
733 u64 orig_start = em->start; in btrfs_add_extent_mapping()
734 u64 orig_len = em->len; in btrfs_add_extent_mapping()
740 ret = merge_extent_mapping(inode, existing, em, start); in btrfs_add_extent_mapping()
742 free_extent_map(em); in btrfs_add_extent_mapping()
745 "extent map merge error existing [%llu, %llu) with em [%llu, %llu) start %llu", in btrfs_add_extent_mapping()
770 struct extent_map *em; in drop_all_extent_maps_fast() local
773 em = rb_entry(node, struct extent_map, rb_node); in drop_all_extent_maps_fast()
774 em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING); in drop_all_extent_maps_fast()
775 remove_extent_mapping(inode, em); in drop_all_extent_maps_fast()
776 free_extent_map(em); in drop_all_extent_maps_fast()
805 struct extent_map *em; in btrfs_drop_extent_map_range() local
833 em = lookup_extent_mapping(em_tree, start, len); in btrfs_drop_extent_map_range()
835 while (em) { in btrfs_drop_extent_map_range()
837 const u64 em_end = extent_map_end(em); in btrfs_drop_extent_map_range()
844 next_em = next_extent_map(em); in btrfs_drop_extent_map_range()
853 if (skip_pinned && (em->flags & EXTENT_FLAG_PINNED)) { in btrfs_drop_extent_map_range()
858 flags = em->flags; in btrfs_drop_extent_map_range()
864 em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING); in btrfs_drop_extent_map_range()
865 modified = !list_empty(&em->list); in btrfs_drop_extent_map_range()
871 if (em->start >= start && em_end <= end) in btrfs_drop_extent_map_range()
874 gen = em->generation; in btrfs_drop_extent_map_range()
876 if (em->start < start) { in btrfs_drop_extent_map_range()
883 split->start = em->start; in btrfs_drop_extent_map_range()
884 split->len = start - em->start; in btrfs_drop_extent_map_range()
886 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) { in btrfs_drop_extent_map_range()
887 split->disk_bytenr = em->disk_bytenr; in btrfs_drop_extent_map_range()
888 split->disk_num_bytes = em->disk_num_bytes; in btrfs_drop_extent_map_range()
889 split->offset = em->offset; in btrfs_drop_extent_map_range()
890 split->ram_bytes = em->ram_bytes; in btrfs_drop_extent_map_range()
892 split->disk_bytenr = em->disk_bytenr; in btrfs_drop_extent_map_range()
900 replace_extent_mapping(inode, em, split, modified); in btrfs_drop_extent_map_range()
914 split->disk_bytenr = em->disk_bytenr; in btrfs_drop_extent_map_range()
918 if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) { in btrfs_drop_extent_map_range()
919 split->disk_num_bytes = em->disk_num_bytes; in btrfs_drop_extent_map_range()
920 split->offset = em->offset + end - em->start; in btrfs_drop_extent_map_range()
921 split->ram_bytes = em->ram_bytes; in btrfs_drop_extent_map_range()
928 if (extent_map_in_tree(em)) { in btrfs_drop_extent_map_range()
929 replace_extent_mapping(inode, em, split, modified); in btrfs_drop_extent_map_range()
943 if (extent_map_in_tree(em)) { in btrfs_drop_extent_map_range()
964 if ((em->start < start || em_end > end) && modified) { in btrfs_drop_extent_map_range()
968 remove_extent_mapping(inode, em); in btrfs_drop_extent_map_range()
975 free_extent_map(em); in btrfs_drop_extent_map_range()
978 free_extent_map(em); in btrfs_drop_extent_map_range()
980 em = next_em; in btrfs_drop_extent_map_range()
1040 struct extent_map *em; in split_extent_map() local
1060 em = lookup_extent_mapping(em_tree, start, len); in split_extent_map()
1061 if (!em) { in split_extent_map()
1066 ASSERT(em->len == len); in split_extent_map()
1067 ASSERT(!extent_map_is_compressed(em)); in split_extent_map()
1068 ASSERT(em->disk_bytenr < EXTENT_MAP_LAST_BYTE); in split_extent_map()
1069 ASSERT(em->flags & EXTENT_FLAG_PINNED); in split_extent_map()
1070 ASSERT(!(em->flags & EXTENT_FLAG_LOGGING)); in split_extent_map()
1071 ASSERT(!list_empty(&em->list)); in split_extent_map()
1073 flags = em->flags; in split_extent_map()
1074 em->flags &= ~EXTENT_FLAG_PINNED; in split_extent_map()
1076 /* First, replace the em with a new extent_map starting from * em->start */ in split_extent_map()
1077 split_pre->start = em->start; in split_extent_map()
1084 split_pre->generation = em->generation; in split_extent_map()
1086 replace_extent_mapping(inode, em, split_pre, 1); in split_extent_map()
1090 * [em->start, em->start + pre] in split_extent_map()
1094 split_mid->start = em->start + pre; in split_extent_map()
1095 split_mid->len = em->len - pre; in split_extent_map()
1096 split_mid->disk_bytenr = extent_map_block_start(em) + pre; in split_extent_map()
1101 split_mid->generation = em->generation; in split_extent_map()
1105 free_extent_map(em); in split_extent_map()
1107 free_extent_map(em); in split_extent_map()
1153 struct extent_map *em; in btrfs_scan_inode() local
1155 em = rb_entry(node, struct extent_map, rb_node); in btrfs_scan_inode()
1158 if (em->flags & EXTENT_FLAG_PINNED) in btrfs_scan_inode()
1168 if (!list_empty(&em->list) && em->generation >= cur_fs_gen) in btrfs_scan_inode()
1171 remove_extent_mapping(inode, em); in btrfs_scan_inode()
1172 trace_btrfs_extent_map_shrinker_remove_em(inode, em); in btrfs_scan_inode()
1174 free_extent_map(em); in btrfs_scan_inode()