Lines Matching refs:mpd

1551 static void mpage_release_unused_pages(struct mpage_da_data *mpd,  in mpage_release_unused_pages()  argument
1557 struct inode *inode = mpd->inode; in mpage_release_unused_pages()
1561 if (mpd->first_page >= mpd->next_page) in mpage_release_unused_pages()
1564 mpd->scanned_until_end = 0; in mpage_release_unused_pages()
1565 index = mpd->first_page; in mpage_release_unused_pages()
1566 end = mpd->next_page - 1; in mpage_release_unused_pages()
1589 if (folio->index < mpd->first_page) in mpage_release_unused_pages()
1889 static void mpage_folio_done(struct mpage_da_data *mpd, struct folio *folio) in mpage_folio_done() argument
1891 mpd->first_page += folio_nr_pages(folio); in mpage_folio_done()
1895 static int mpage_submit_folio(struct mpage_da_data *mpd, struct folio *folio) in mpage_submit_folio() argument
1901 BUG_ON(folio->index != mpd->first_page); in mpage_submit_folio()
1916 size = i_size_read(mpd->inode); in mpage_submit_folio()
1919 !ext4_verity_in_progress(mpd->inode)) in mpage_submit_folio()
1921 err = ext4_bio_write_folio(&mpd->io_submit, folio, len); in mpage_submit_folio()
1923 mpd->wbc->nr_to_write--; in mpage_submit_folio()
1951 static bool mpage_add_bh_to_extent(struct mpage_da_data *mpd, ext4_lblk_t lblk, in mpage_add_bh_to_extent() argument
1954 struct ext4_map_blocks *map = &mpd->map; in mpage_add_bh_to_extent()
1968 if (!mpd->do_map) in mpage_add_bh_to_extent()
2005 static int mpage_process_page_bufs(struct mpage_da_data *mpd, in mpage_process_page_bufs() argument
2010 struct inode *inode = mpd->inode; in mpage_process_page_bufs()
2021 if (lblk >= blocks || !mpage_add_bh_to_extent(mpd, lblk, bh)) { in mpage_process_page_bufs()
2023 if (mpd->map.m_len) in mpage_process_page_bufs()
2026 if (!mpd->do_map) in mpage_process_page_bufs()
2033 if (mpd->map.m_len == 0) { in mpage_process_page_bufs()
2034 err = mpage_submit_folio(mpd, head->b_folio); in mpage_process_page_bufs()
2037 mpage_folio_done(mpd, head->b_folio); in mpage_process_page_bufs()
2040 mpd->scanned_until_end = 1; in mpage_process_page_bufs()
2062 static int mpage_process_folio(struct mpage_da_data *mpd, struct folio *folio, in mpage_process_folio() argument
2067 ext4_io_end_t *io_end = mpd->io_submit.io_end; in mpage_process_folio()
2071 int blkbits = mpd->inode->i_blkbits; in mpage_process_folio()
2077 if (lblk < mpd->map.m_lblk) in mpage_process_folio()
2079 if (lblk >= mpd->map.m_lblk + mpd->map.m_len) { in mpage_process_folio()
2084 mpd->map.m_len = 0; in mpage_process_folio()
2085 mpd->map.m_flags = 0; in mpage_process_folio()
2088 err = mpage_process_page_bufs(mpd, head, bh, lblk); in mpage_process_folio()
2091 if (!err && mpd->map.m_len && mpd->map.m_lblk > lblk) { in mpage_process_folio()
2097 io_end_vec->offset = (loff_t)mpd->map.m_lblk << blkbits; in mpage_process_folio()
2132 static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) in mpage_map_and_submit_buffers() argument
2136 struct inode *inode = mpd->inode; in mpage_map_and_submit_buffers()
2144 start = mpd->map.m_lblk >> bpp_bits; in mpage_map_and_submit_buffers()
2145 end = (mpd->map.m_lblk + mpd->map.m_len - 1) >> bpp_bits; in mpage_map_and_submit_buffers()
2147 pblock = mpd->map.m_pblk; in mpage_map_and_submit_buffers()
2157 err = mpage_process_folio(mpd, folio, &lblk, &pblock, in mpage_map_and_submit_buffers()
2167 err = mpage_submit_folio(mpd, folio); in mpage_map_and_submit_buffers()
2170 mpage_folio_done(mpd, folio); in mpage_map_and_submit_buffers()
2175 mpd->map.m_len = 0; in mpage_map_and_submit_buffers()
2176 mpd->map.m_flags = 0; in mpage_map_and_submit_buffers()
2183 static int mpage_map_one_extent(handle_t *handle, struct mpage_da_data *mpd) in mpage_map_one_extent() argument
2185 struct inode *inode = mpd->inode; in mpage_map_one_extent()
2186 struct ext4_map_blocks *map = &mpd->map; in mpage_map_one_extent()
2212 if (!mpd->io_submit.io_end->handle && in mpage_map_one_extent()
2214 mpd->io_submit.io_end->handle = handle->h_rsv_handle; in mpage_map_one_extent()
2217 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2245 struct mpage_da_data *mpd, in mpage_map_and_submit_extent() argument
2248 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent()
2249 struct ext4_map_blocks *map = &mpd->map; in mpage_map_and_submit_extent()
2253 ext4_io_end_t *io_end = mpd->io_submit.io_end; in mpage_map_and_submit_extent()
2261 err = mpage_map_one_extent(handle, mpd); in mpage_map_and_submit_extent()
2299 err = mpage_map_and_submit_buffers(mpd); in mpage_map_and_submit_extent()
2309 disksize = ((loff_t)mpd->first_page) << PAGE_SHIFT; in mpage_map_and_submit_extent()
2370 struct mpage_da_data *mpd, in mpage_journal_page_buffers() argument
2373 struct inode *inode = mpd->inode; in mpage_journal_page_buffers()
2378 mpd->wbc->nr_to_write--; in mpage_journal_page_buffers()
2407 static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) in mpage_prepare_extent_to_map() argument
2409 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2412 pgoff_t index = mpd->first_page; in mpage_prepare_extent_to_map()
2413 pgoff_t end = mpd->last_page; in mpage_prepare_extent_to_map()
2416 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2420 int bpp = ext4_journal_blocks_per_page(mpd->inode); in mpage_prepare_extent_to_map()
2422 if (mpd->wbc->sync_mode == WB_SYNC_ALL || mpd->wbc->tagged_writepages) in mpage_prepare_extent_to_map()
2427 mpd->map.m_len = 0; in mpage_prepare_extent_to_map()
2428 mpd->next_page = index; in mpage_prepare_extent_to_map()
2429 if (ext4_should_journal_data(mpd->inode)) { in mpage_prepare_extent_to_map()
2430 handle = ext4_journal_start(mpd->inode, EXT4_HT_WRITE_PAGE, in mpage_prepare_extent_to_map()
2453 if (mpd->wbc->sync_mode == WB_SYNC_NONE && in mpage_prepare_extent_to_map()
2454 mpd->wbc->nr_to_write <= in mpage_prepare_extent_to_map()
2455 mpd->map.m_len >> (PAGE_SHIFT - blkbits)) in mpage_prepare_extent_to_map()
2459 if (mpd->map.m_len > 0 && mpd->next_page != folio->index) in mpage_prepare_extent_to_map()
2479 (mpd->wbc->sync_mode == WB_SYNC_NONE)) || in mpage_prepare_extent_to_map()
2498 ext4_warning_inode(mpd->inode, "page %lu does not have buffers attached", folio->index); in mpage_prepare_extent_to_map()
2504 if (mpd->map.m_len == 0) in mpage_prepare_extent_to_map()
2505 mpd->first_page = folio->index; in mpage_prepare_extent_to_map()
2506 mpd->next_page = folio_next_index(folio); in mpage_prepare_extent_to_map()
2517 if (!mpd->can_map) { in mpage_prepare_extent_to_map()
2518 err = mpage_submit_folio(mpd, folio); in mpage_prepare_extent_to_map()
2524 mpd, folio); in mpage_prepare_extent_to_map()
2527 mpd->journalled_more_data = 1; in mpage_prepare_extent_to_map()
2529 mpage_folio_done(mpd, folio); in mpage_prepare_extent_to_map()
2535 err = mpage_process_page_bufs(mpd, head, head, in mpage_prepare_extent_to_map()
2545 mpd->scanned_until_end = 1; in mpage_prepare_extent_to_map()
2556 static int ext4_do_writepages(struct mpage_da_data *mpd) in ext4_do_writepages() argument
2558 struct writeback_control *wbc = mpd->wbc; in ext4_do_writepages()
2564 struct inode *inode = mpd->inode; in ext4_do_writepages()
2627 mpd->can_map = 0; in ext4_do_writepages()
2632 mpd->journalled_more_data = 0; in ext4_do_writepages()
2650 mpd->first_page = writeback_index; in ext4_do_writepages()
2651 mpd->last_page = -1; in ext4_do_writepages()
2653 mpd->first_page = wbc->range_start >> PAGE_SHIFT; in ext4_do_writepages()
2654 mpd->last_page = wbc->range_end >> PAGE_SHIFT; in ext4_do_writepages()
2657 ext4_io_submit_init(&mpd->io_submit, wbc); in ext4_do_writepages()
2660 tag_pages_for_writeback(mapping, mpd->first_page, in ext4_do_writepages()
2661 mpd->last_page); in ext4_do_writepages()
2670 mpd->do_map = 0; in ext4_do_writepages()
2671 mpd->scanned_until_end = 0; in ext4_do_writepages()
2672 mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_do_writepages()
2673 if (!mpd->io_submit.io_end) { in ext4_do_writepages()
2677 ret = mpage_prepare_extent_to_map(mpd); in ext4_do_writepages()
2679 mpage_release_unused_pages(mpd, false); in ext4_do_writepages()
2681 ext4_io_submit(&mpd->io_submit); in ext4_do_writepages()
2682 ext4_put_io_end_defer(mpd->io_submit.io_end); in ext4_do_writepages()
2683 mpd->io_submit.io_end = NULL; in ext4_do_writepages()
2687 while (!mpd->scanned_until_end && wbc->nr_to_write > 0) { in ext4_do_writepages()
2689 mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_do_writepages()
2690 if (!mpd->io_submit.io_end) { in ext4_do_writepages()
2695 WARN_ON_ONCE(!mpd->can_map); in ext4_do_writepages()
2715 ext4_put_io_end(mpd->io_submit.io_end); in ext4_do_writepages()
2716 mpd->io_submit.io_end = NULL; in ext4_do_writepages()
2719 mpd->do_map = 1; in ext4_do_writepages()
2721 trace_ext4_da_write_pages(inode, mpd->first_page, wbc); in ext4_do_writepages()
2722 ret = mpage_prepare_extent_to_map(mpd); in ext4_do_writepages()
2723 if (!ret && mpd->map.m_len) in ext4_do_writepages()
2724 ret = mpage_map_and_submit_extent(handle, mpd, in ext4_do_writepages()
2739 mpd->do_map = 0; in ext4_do_writepages()
2742 mpage_release_unused_pages(mpd, give_up_on_write); in ext4_do_writepages()
2744 ext4_io_submit(&mpd->io_submit); in ext4_do_writepages()
2754 ext4_put_io_end_defer(mpd->io_submit.io_end); in ext4_do_writepages()
2757 ext4_put_io_end(mpd->io_submit.io_end); in ext4_do_writepages()
2758 mpd->io_submit.io_end = NULL; in ext4_do_writepages()
2778 mpd->last_page = writeback_index - 1; in ext4_do_writepages()
2779 mpd->first_page = 0; in ext4_do_writepages()
2789 mapping->writeback_index = mpd->first_page; in ext4_do_writepages()
2801 struct mpage_da_data mpd = { in ext4_writepages() local
2813 ret = ext4_do_writepages(&mpd); in ext4_writepages()
2819 if (!ret && mpd.journalled_more_data) in ext4_writepages()
2820 ret = ext4_do_writepages(&mpd); in ext4_writepages()
2834 struct mpage_da_data mpd = { in ext4_normal_submit_inode_data_buffers() local
2839 return ext4_do_writepages(&mpd); in ext4_normal_submit_inode_data_buffers()