extent_io.c (664b0bae0b87f69bc9deb098f5e0158b9cf18e04) extent_io.c (b93b016313b3ba8003c3b8bb71f569af91f19fc7)
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/bitops.h>
3#include <linux/slab.h>
4#include <linux/bio.h>
5#include <linux/mm.h>
6#include <linux/pagemap.h>
7#include <linux/page-flags.h>
8#include <linux/spinlock.h>

--- 62 unchanged lines hidden (view full) ---

71 extent_state_in_tree(state),
72 refcount_read(&state->refs));
73 list_del(&state->leak_list);
74 kmem_cache_free(extent_state_cache, state);
75 }
76
77 while (!list_empty(&buffers)) {
78 eb = list_entry(buffers.next, struct extent_buffer, leak_list);
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/bitops.h>
3#include <linux/slab.h>
4#include <linux/bio.h>
5#include <linux/mm.h>
6#include <linux/pagemap.h>
7#include <linux/page-flags.h>
8#include <linux/spinlock.h>

--- 62 unchanged lines hidden (view full) ---

71 extent_state_in_tree(state),
72 refcount_read(&state->refs));
73 list_del(&state->leak_list);
74 kmem_cache_free(extent_state_cache, state);
75 }
76
77 while (!list_empty(&buffers)) {
78 eb = list_entry(buffers.next, struct extent_buffer, leak_list);
79 pr_err("BTRFS: buffer leak start %llu len %lu refs %d\n",
80 eb->start, eb->len, atomic_read(&eb->refs));
79 pr_err("BTRFS: buffer leak start %llu len %lu refs %d bflags %lu\n",
80 eb->start, eb->len, atomic_read(&eb->refs), eb->bflags);
81 list_del(&eb->leak_list);
82 kmem_cache_free(extent_buffer_cache, eb);
83 }
84}
85
86#define btrfs_debug_check_extent_io_range(tree, start, end) \
87 __btrfs_debug_check_extent_io_range(__func__, (tree), (start), (end))
88static inline void __btrfs_debug_check_extent_io_range(const char *caller,

--- 25 unchanged lines hidden (view full) ---

114 * it still does the unlocking
115 */
116 unsigned int extent_locked:1;
117
118 /* tells the submit_bio code to use REQ_SYNC */
119 unsigned int sync_io:1;
120};
121
81 list_del(&eb->leak_list);
82 kmem_cache_free(extent_buffer_cache, eb);
83 }
84}
85
86#define btrfs_debug_check_extent_io_range(tree, start, end) \
87 __btrfs_debug_check_extent_io_range(__func__, (tree), (start), (end))
88static inline void __btrfs_debug_check_extent_io_range(const char *caller,

--- 25 unchanged lines hidden (view full) ---

114 * it still does the unlocking
115 */
116 unsigned int extent_locked:1;
117
118 /* tells the submit_bio code to use REQ_SYNC */
119 unsigned int sync_io:1;
120};
121
122static void add_extent_changeset(struct extent_state *state, unsigned bits,
122static int add_extent_changeset(struct extent_state *state, unsigned bits,
123 struct extent_changeset *changeset,
124 int set)
125{
126 int ret;
127
128 if (!changeset)
123 struct extent_changeset *changeset,
124 int set)
125{
126 int ret;
127
128 if (!changeset)
129 return;
129 return 0;
130 if (set && (state->state & bits) == bits)
130 if (set && (state->state & bits) == bits)
131 return;
131 return 0;
132 if (!set && (state->state & bits) == 0)
132 if (!set && (state->state & bits) == 0)
133 return;
133 return 0;
134 changeset->bytes_changed += state->end - state->start + 1;
135 ret = ulist_add(&changeset->range_changed, state->start, state->end,
136 GFP_ATOMIC);
134 changeset->bytes_changed += state->end - state->start + 1;
135 ret = ulist_add(&changeset->range_changed, state->start, state->end,
136 GFP_ATOMIC);
137 /* ENOMEM */
138 BUG_ON(ret < 0);
137 return ret;
139}
140
141static void flush_write_bio(struct extent_page_data *epd);
142
143static inline struct btrfs_fs_info *
144tree_fs_info(struct extent_io_tree *tree)
145{
146 if (tree->ops)

--- 35 unchanged lines hidden (view full) ---

182 extent_buffer_cache = NULL;
183
184free_state_cache:
185 kmem_cache_destroy(extent_state_cache);
186 extent_state_cache = NULL;
187 return -ENOMEM;
188}
189
138}
139
140static void flush_write_bio(struct extent_page_data *epd);
141
142static inline struct btrfs_fs_info *
143tree_fs_info(struct extent_io_tree *tree)
144{
145 if (tree->ops)

--- 35 unchanged lines hidden (view full) ---

181 extent_buffer_cache = NULL;
182
183free_state_cache:
184 kmem_cache_destroy(extent_state_cache);
185 extent_state_cache = NULL;
186 return -ENOMEM;
187}
188
190void extent_io_exit(void)
189void __cold extent_io_exit(void)
191{
192 btrfs_leak_debug_check();
193
194 /*
195 * Make sure all delayed rcu free are flushed before we
196 * destroy caches.
197 */
198 rcu_barrier();

--- 323 unchanged lines hidden (view full) ---

522 */
523static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
524 struct extent_state *state,
525 unsigned *bits, int wake,
526 struct extent_changeset *changeset)
527{
528 struct extent_state *next;
529 unsigned bits_to_clear = *bits & ~EXTENT_CTLBITS;
190{
191 btrfs_leak_debug_check();
192
193 /*
194 * Make sure all delayed rcu free are flushed before we
195 * destroy caches.
196 */
197 rcu_barrier();

--- 323 unchanged lines hidden (view full) ---

521 */
522static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
523 struct extent_state *state,
524 unsigned *bits, int wake,
525 struct extent_changeset *changeset)
526{
527 struct extent_state *next;
528 unsigned bits_to_clear = *bits & ~EXTENT_CTLBITS;
529 int ret;
530
531 if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) {
532 u64 range = state->end - state->start + 1;
533 WARN_ON(range > tree->dirty_bytes);
534 tree->dirty_bytes -= range;
535 }
536 clear_state_cb(tree, state, bits);
530
531 if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) {
532 u64 range = state->end - state->start + 1;
533 WARN_ON(range > tree->dirty_bytes);
534 tree->dirty_bytes -= range;
535 }
536 clear_state_cb(tree, state, bits);
537 add_extent_changeset(state, bits_to_clear, changeset, 0);
537 ret = add_extent_changeset(state, bits_to_clear, changeset, 0);
538 BUG_ON(ret < 0);
538 state->state &= ~bits_to_clear;
539 if (wake)
540 wake_up(&state->wq);
541 if (state->state == 0) {
542 next = next_state(state);
543 if (extent_state_in_tree(state)) {
544 rb_erase(&state->rb_node, &tree->state);
545 RB_CLEAR_NODE(&state->rb_node);

--- 254 unchanged lines hidden (view full) ---

800 spin_unlock(&tree->lock);
801}
802
803static void set_state_bits(struct extent_io_tree *tree,
804 struct extent_state *state,
805 unsigned *bits, struct extent_changeset *changeset)
806{
807 unsigned bits_to_set = *bits & ~EXTENT_CTLBITS;
539 state->state &= ~bits_to_clear;
540 if (wake)
541 wake_up(&state->wq);
542 if (state->state == 0) {
543 next = next_state(state);
544 if (extent_state_in_tree(state)) {
545 rb_erase(&state->rb_node, &tree->state);
546 RB_CLEAR_NODE(&state->rb_node);

--- 254 unchanged lines hidden (view full) ---

801 spin_unlock(&tree->lock);
802}
803
804static void set_state_bits(struct extent_io_tree *tree,
805 struct extent_state *state,
806 unsigned *bits, struct extent_changeset *changeset)
807{
808 unsigned bits_to_set = *bits & ~EXTENT_CTLBITS;
809 int ret;
808
809 set_state_cb(tree, state, bits);
810 if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) {
811 u64 range = state->end - state->start + 1;
812 tree->dirty_bytes += range;
813 }
810
811 set_state_cb(tree, state, bits);
812 if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) {
813 u64 range = state->end - state->start + 1;
814 tree->dirty_bytes += range;
815 }
814 add_extent_changeset(state, bits_to_set, changeset, 1);
816 ret = add_extent_changeset(state, bits_to_set, changeset, 1);
817 BUG_ON(ret < 0);
815 state->state |= bits_to_set;
816}
817
818static void cache_state_if_flags(struct extent_state *state,
819 struct extent_state **cached_ptr,
820 unsigned flags)
821{
822 if (cached_ptr && !(*cached_ptr)) {

--- 1916 unchanged lines hidden (view full) ---

2739 ret = tree->ops->submit_bio_hook(tree->private_data, bio,
2740 mirror_num, bio_flags, start);
2741 else
2742 btrfsic_submit_bio(bio);
2743
2744 return blk_status_to_errno(ret);
2745}
2746
818 state->state |= bits_to_set;
819}
820
821static void cache_state_if_flags(struct extent_state *state,
822 struct extent_state **cached_ptr,
823 unsigned flags)
824{
825 if (cached_ptr && !(*cached_ptr)) {

--- 1916 unchanged lines hidden (view full) ---

2742 ret = tree->ops->submit_bio_hook(tree->private_data, bio,
2743 mirror_num, bio_flags, start);
2744 else
2745 btrfsic_submit_bio(bio);
2746
2747 return blk_status_to_errno(ret);
2748}
2749
2747static int merge_bio(struct extent_io_tree *tree, struct page *page,
2748 unsigned long offset, size_t size, struct bio *bio,
2749 unsigned long bio_flags)
2750{
2751 int ret = 0;
2752 if (tree->ops)
2753 ret = tree->ops->merge_bio_hook(page, offset, size, bio,
2754 bio_flags);
2755 return ret;
2756
2757}
2758
2759/*
2760 * @opf: bio REQ_OP_* and REQ_* flags as one value
2750/*
2751 * @opf: bio REQ_OP_* and REQ_* flags as one value
2752 * @tree: tree so we can call our merge_bio hook
2753 * @wbc: optional writeback control for io accounting
2754 * @page: page to add to the bio
2755 * @pg_offset: offset of the new bio or to check whether we are adding
2756 * a contiguous page to the previous one
2757 * @size: portion of page that we want to write
2758 * @offset: starting offset in the page
2759 * @bdev: attach newly created bios to this bdev
2760 * @bio_ret: must be valid pointer, newly allocated bio will be stored there
2761 * @end_io_func: end_io callback for new bio
2762 * @mirror_num: desired mirror to read/write
2763 * @prev_bio_flags: flags of previous bio to see if we can merge the current one
2764 * @bio_flags: flags of the current bio to see if we can merge them
2761 */
2762static int submit_extent_page(unsigned int opf, struct extent_io_tree *tree,
2763 struct writeback_control *wbc,
2764 struct page *page, u64 offset,
2765 size_t size, unsigned long pg_offset,
2766 struct block_device *bdev,
2767 struct bio **bio_ret,
2768 bio_end_io_t end_io_func,
2769 int mirror_num,
2770 unsigned long prev_bio_flags,
2771 unsigned long bio_flags,
2772 bool force_bio_submit)
2773{
2774 int ret = 0;
2775 struct bio *bio;
2765 */
2766static int submit_extent_page(unsigned int opf, struct extent_io_tree *tree,
2767 struct writeback_control *wbc,
2768 struct page *page, u64 offset,
2769 size_t size, unsigned long pg_offset,
2770 struct block_device *bdev,
2771 struct bio **bio_ret,
2772 bio_end_io_t end_io_func,
2773 int mirror_num,
2774 unsigned long prev_bio_flags,
2775 unsigned long bio_flags,
2776 bool force_bio_submit)
2777{
2778 int ret = 0;
2779 struct bio *bio;
2776 int contig = 0;
2777 int old_compressed = prev_bio_flags & EXTENT_BIO_COMPRESSED;
2778 size_t page_size = min_t(size_t, size, PAGE_SIZE);
2779 sector_t sector = offset >> 9;
2780
2780 size_t page_size = min_t(size_t, size, PAGE_SIZE);
2781 sector_t sector = offset >> 9;
2782
2781 if (bio_ret && *bio_ret) {
2783 ASSERT(bio_ret);
2784
2785 if (*bio_ret) {
2786 bool contig;
2787 bool can_merge = true;
2788
2782 bio = *bio_ret;
2789 bio = *bio_ret;
2783 if (old_compressed)
2790 if (prev_bio_flags & EXTENT_BIO_COMPRESSED)
2784 contig = bio->bi_iter.bi_sector == sector;
2785 else
2786 contig = bio_end_sector(bio) == sector;
2787
2791 contig = bio->bi_iter.bi_sector == sector;
2792 else
2793 contig = bio_end_sector(bio) == sector;
2794
2788 if (prev_bio_flags != bio_flags || !contig ||
2795 if (tree->ops && tree->ops->merge_bio_hook(page, offset,
2796 page_size, bio, bio_flags))
2797 can_merge = false;
2798
2799 if (prev_bio_flags != bio_flags || !contig || !can_merge ||
2789 force_bio_submit ||
2800 force_bio_submit ||
2790 merge_bio(tree, page, pg_offset, page_size, bio, bio_flags) ||
2791 bio_add_page(bio, page, page_size, pg_offset) < page_size) {
2792 ret = submit_one_bio(bio, mirror_num, prev_bio_flags);
2793 if (ret < 0) {
2794 *bio_ret = NULL;
2795 return ret;
2796 }
2797 bio = NULL;
2798 } else {

--- 9 unchanged lines hidden (view full) ---

2808 bio->bi_private = tree;
2809 bio->bi_write_hint = page->mapping->host->i_write_hint;
2810 bio->bi_opf = opf;
2811 if (wbc) {
2812 wbc_init_bio(wbc, bio);
2813 wbc_account_io(wbc, page, page_size);
2814 }
2815
2801 bio_add_page(bio, page, page_size, pg_offset) < page_size) {
2802 ret = submit_one_bio(bio, mirror_num, prev_bio_flags);
2803 if (ret < 0) {
2804 *bio_ret = NULL;
2805 return ret;
2806 }
2807 bio = NULL;
2808 } else {

--- 9 unchanged lines hidden (view full) ---

2818 bio->bi_private = tree;
2819 bio->bi_write_hint = page->mapping->host->i_write_hint;
2820 bio->bi_opf = opf;
2821 if (wbc) {
2822 wbc_init_bio(wbc, bio);
2823 wbc_account_io(wbc, page, page_size);
2824 }
2825
2816 if (bio_ret)
2817 *bio_ret = bio;
2818 else
2819 ret = submit_one_bio(bio, mirror_num, bio_flags);
2826 *bio_ret = bio;
2820
2821 return ret;
2822}
2823
2824static void attach_extent_buffer_page(struct extent_buffer *eb,
2825 struct page *page)
2826{
2827 if (!PagePrivate(page)) {

--- 53 unchanged lines hidden (view full) ---

2881 get_extent_t *get_extent,
2882 struct extent_map **em_cached,
2883 struct bio **bio, int mirror_num,
2884 unsigned long *bio_flags, unsigned int read_flags,
2885 u64 *prev_em_start)
2886{
2887 struct inode *inode = page->mapping->host;
2888 u64 start = page_offset(page);
2827
2828 return ret;
2829}
2830
2831static void attach_extent_buffer_page(struct extent_buffer *eb,
2832 struct page *page)
2833{
2834 if (!PagePrivate(page)) {

--- 53 unchanged lines hidden (view full) ---

2888 get_extent_t *get_extent,
2889 struct extent_map **em_cached,
2890 struct bio **bio, int mirror_num,
2891 unsigned long *bio_flags, unsigned int read_flags,
2892 u64 *prev_em_start)
2893{
2894 struct inode *inode = page->mapping->host;
2895 u64 start = page_offset(page);
2889 u64 page_end = start + PAGE_SIZE - 1;
2890 u64 end;
2896 const u64 end = start + PAGE_SIZE - 1;
2891 u64 cur = start;
2892 u64 extent_offset;
2893 u64 last_byte = i_size_read(inode);
2894 u64 block_start;
2895 u64 cur_end;
2896 struct extent_map *em;
2897 struct block_device *bdev;
2898 int ret = 0;
2899 int nr = 0;
2900 size_t pg_offset = 0;
2901 size_t iosize;
2902 size_t disk_io_size;
2903 size_t blocksize = inode->i_sb->s_blocksize;
2904 unsigned long this_bio_flag = 0;
2905
2906 set_page_extent_mapped(page);
2907
2897 u64 cur = start;
2898 u64 extent_offset;
2899 u64 last_byte = i_size_read(inode);
2900 u64 block_start;
2901 u64 cur_end;
2902 struct extent_map *em;
2903 struct block_device *bdev;
2904 int ret = 0;
2905 int nr = 0;
2906 size_t pg_offset = 0;
2907 size_t iosize;
2908 size_t disk_io_size;
2909 size_t blocksize = inode->i_sb->s_blocksize;
2910 unsigned long this_bio_flag = 0;
2911
2912 set_page_extent_mapped(page);
2913
2908 end = page_end;
2909 if (!PageUptodate(page)) {
2910 if (cleancache_get_page(page) == 0) {
2911 BUG_ON(blocksize != PAGE_SIZE);
2912 unlock_extent(tree, start, end);
2913 goto out;
2914 }
2915 }
2916

--- 1036 unchanged lines hidden (view full) ---

3953 unsigned i;
3954
3955 scanned = 1;
3956 for (i = 0; i < nr_pages; i++) {
3957 struct page *page = pvec.pages[i];
3958
3959 done_index = page->index;
3960 /*
2914 if (!PageUptodate(page)) {
2915 if (cleancache_get_page(page) == 0) {
2916 BUG_ON(blocksize != PAGE_SIZE);
2917 unlock_extent(tree, start, end);
2918 goto out;
2919 }
2920 }
2921

--- 1036 unchanged lines hidden (view full) ---

3958 unsigned i;
3959
3960 scanned = 1;
3961 for (i = 0; i < nr_pages; i++) {
3962 struct page *page = pvec.pages[i];
3963
3964 done_index = page->index;
3965 /*
3961 * At this point we hold neither mapping->tree_lock nor
3962 * lock on the page itself: the page may be truncated or
3963 * invalidated (changing page->mapping to NULL), or even
3964 * swizzled back from swapper_space to tmpfs file
3965 * mapping
3966 * At this point we hold neither the i_pages lock nor
3967 * the page lock: the page may be truncated or
3968 * invalidated (changing page->mapping to NULL),
3969 * or even swizzled back from swapper_space to
3970 * tmpfs file mapping
3966 */
3967 if (!trylock_page(page)) {
3968 flush_write_bio(epd);
3969 lock_page(page);
3970 }
3971
3972 if (unlikely(page->mapping != mapping)) {
3973 unlock_page(page);

--- 1190 unchanged lines hidden (view full) ---

5164 page = eb->pages[i];
5165 if (!PageDirty(page))
5166 continue;
5167
5168 lock_page(page);
5169 WARN_ON(!PagePrivate(page));
5170
5171 clear_page_dirty_for_io(page);
3971 */
3972 if (!trylock_page(page)) {
3973 flush_write_bio(epd);
3974 lock_page(page);
3975 }
3976
3977 if (unlikely(page->mapping != mapping)) {
3978 unlock_page(page);

--- 1190 unchanged lines hidden (view full) ---

5169 page = eb->pages[i];
5170 if (!PageDirty(page))
5171 continue;
5172
5173 lock_page(page);
5174 WARN_ON(!PagePrivate(page));
5175
5176 clear_page_dirty_for_io(page);
5172 spin_lock_irq(&page->mapping->tree_lock);
5177 xa_lock_irq(&page->mapping->i_pages);
5173 if (!PageDirty(page)) {
5178 if (!PageDirty(page)) {
5174 radix_tree_tag_clear(&page->mapping->page_tree,
5179 radix_tree_tag_clear(&page->mapping->i_pages,
5175 page_index(page),
5176 PAGECACHE_TAG_DIRTY);
5177 }
5180 page_index(page),
5181 PAGECACHE_TAG_DIRTY);
5182 }
5178 spin_unlock_irq(&page->mapping->tree_lock);
5183 xa_unlock_irq(&page->mapping->i_pages);
5179 ClearPageError(page);
5180 unlock_page(page);
5181 }
5182 WARN_ON(atomic_read(&eb->refs) == 0);
5183}
5184
5185int set_extent_buffer_dirty(struct extent_buffer *eb)
5186{

--- 38 unchanged lines hidden (view full) ---

5225 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
5226 num_pages = num_extent_pages(eb->start, eb->len);
5227 for (i = 0; i < num_pages; i++) {
5228 page = eb->pages[i];
5229 SetPageUptodate(page);
5230 }
5231}
5232
5184 ClearPageError(page);
5185 unlock_page(page);
5186 }
5187 WARN_ON(atomic_read(&eb->refs) == 0);
5188}
5189
5190int set_extent_buffer_dirty(struct extent_buffer *eb)
5191{

--- 38 unchanged lines hidden (view full) ---

5230 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
5231 num_pages = num_extent_pages(eb->start, eb->len);
5232 for (i = 0; i < num_pages; i++) {
5233 page = eb->pages[i];
5234 SetPageUptodate(page);
5235 }
5236}
5237
5233int extent_buffer_uptodate(struct extent_buffer *eb)
5234{
5235 return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
5236}
5237
5238int read_extent_buffer_pages(struct extent_io_tree *tree,
5239 struct extent_buffer *eb, int wait, int mirror_num)
5240{
5241 unsigned long i;
5242 struct page *page;
5243 int err;
5244 int ret = 0;
5245 int locked_pages = 0;

--- 719 unchanged lines hidden ---
5238int read_extent_buffer_pages(struct extent_io_tree *tree,
5239 struct extent_buffer *eb, int wait, int mirror_num)
5240{
5241 unsigned long i;
5242 struct page *page;
5243 int err;
5244 int ret = 0;
5245 int locked_pages = 0;

--- 719 unchanged lines hidden ---