Lines Matching refs:mpd
1563 static void mpage_release_unused_pages(struct mpage_da_data *mpd, in mpage_release_unused_pages() argument
1569 struct inode *inode = mpd->inode; in mpage_release_unused_pages()
1573 if (mpd->first_page >= mpd->next_page) in mpage_release_unused_pages()
1576 mpd->scanned_until_end = 0; in mpage_release_unused_pages()
1577 index = mpd->first_page; in mpage_release_unused_pages()
1578 end = mpd->next_page - 1; in mpage_release_unused_pages()
1601 if (folio->index < mpd->first_page) in mpage_release_unused_pages()
2094 static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) in mpage_submit_page() argument
2100 BUG_ON(page->index != mpd->first_page); in mpage_submit_page()
2115 size = i_size_read(mpd->inode); in mpage_submit_page()
2117 !ext4_verity_in_progress(mpd->inode)) in mpage_submit_page()
2121 err = ext4_bio_write_page(&mpd->io_submit, page, len, false); in mpage_submit_page()
2123 mpd->wbc->nr_to_write--; in mpage_submit_page()
2124 mpd->first_page++; in mpage_submit_page()
2152 static bool mpage_add_bh_to_extent(struct mpage_da_data *mpd, ext4_lblk_t lblk, in mpage_add_bh_to_extent() argument
2155 struct ext4_map_blocks *map = &mpd->map; in mpage_add_bh_to_extent()
2169 if (!mpd->do_map) in mpage_add_bh_to_extent()
2206 static int mpage_process_page_bufs(struct mpage_da_data *mpd, in mpage_process_page_bufs() argument
2211 struct inode *inode = mpd->inode; in mpage_process_page_bufs()
2222 if (lblk >= blocks || !mpage_add_bh_to_extent(mpd, lblk, bh)) { in mpage_process_page_bufs()
2224 if (mpd->map.m_len) in mpage_process_page_bufs()
2227 if (!mpd->do_map) in mpage_process_page_bufs()
2234 if (mpd->map.m_len == 0) { in mpage_process_page_bufs()
2235 err = mpage_submit_page(mpd, head->b_page); in mpage_process_page_bufs()
2240 mpd->scanned_until_end = 1; in mpage_process_page_bufs()
2261 static int mpage_process_page(struct mpage_da_data *mpd, struct page *page, in mpage_process_page() argument
2266 ext4_io_end_t *io_end = mpd->io_submit.io_end; in mpage_process_page()
2270 int blkbits = mpd->inode->i_blkbits; in mpage_process_page()
2276 if (lblk < mpd->map.m_lblk) in mpage_process_page()
2278 if (lblk >= mpd->map.m_lblk + mpd->map.m_len) { in mpage_process_page()
2283 mpd->map.m_len = 0; in mpage_process_page()
2284 mpd->map.m_flags = 0; in mpage_process_page()
2287 err = mpage_process_page_bufs(mpd, head, bh, lblk); in mpage_process_page()
2290 if (!err && mpd->map.m_len && mpd->map.m_lblk > lblk) { in mpage_process_page()
2296 io_end_vec->offset = (loff_t)mpd->map.m_lblk << blkbits; in mpage_process_page()
2331 static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) in mpage_map_and_submit_buffers() argument
2335 struct inode *inode = mpd->inode; in mpage_map_and_submit_buffers()
2343 start = mpd->map.m_lblk >> bpp_bits; in mpage_map_and_submit_buffers()
2344 end = (mpd->map.m_lblk + mpd->map.m_len - 1) >> bpp_bits; in mpage_map_and_submit_buffers()
2346 pblock = mpd->map.m_pblk; in mpage_map_and_submit_buffers()
2356 err = mpage_process_page(mpd, page, &lblk, &pblock, in mpage_map_and_submit_buffers()
2366 err = mpage_submit_page(mpd, page); in mpage_map_and_submit_buffers()
2373 mpd->map.m_len = 0; in mpage_map_and_submit_buffers()
2374 mpd->map.m_flags = 0; in mpage_map_and_submit_buffers()
2381 static int mpage_map_one_extent(handle_t *handle, struct mpage_da_data *mpd) in mpage_map_one_extent() argument
2383 struct inode *inode = mpd->inode; in mpage_map_one_extent()
2384 struct ext4_map_blocks *map = &mpd->map; in mpage_map_one_extent()
2417 if (!mpd->io_submit.io_end->handle && in mpage_map_one_extent()
2419 mpd->io_submit.io_end->handle = handle->h_rsv_handle; in mpage_map_one_extent()
2422 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2450 struct mpage_da_data *mpd, in mpage_map_and_submit_extent() argument
2453 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent()
2454 struct ext4_map_blocks *map = &mpd->map; in mpage_map_and_submit_extent()
2458 ext4_io_end_t *io_end = mpd->io_submit.io_end; in mpage_map_and_submit_extent()
2466 err = mpage_map_one_extent(handle, mpd); in mpage_map_and_submit_extent()
2505 err = mpage_map_and_submit_buffers(mpd); in mpage_map_and_submit_extent()
2515 disksize = ((loff_t)mpd->first_page) << PAGE_SHIFT; in mpage_map_and_submit_extent()
2572 static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) in mpage_prepare_extent_to_map() argument
2574 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2577 long left = mpd->wbc->nr_to_write; in mpage_prepare_extent_to_map()
2578 pgoff_t index = mpd->first_page; in mpage_prepare_extent_to_map()
2579 pgoff_t end = mpd->last_page; in mpage_prepare_extent_to_map()
2582 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2586 if (mpd->wbc->sync_mode == WB_SYNC_ALL || mpd->wbc->tagged_writepages) in mpage_prepare_extent_to_map()
2592 mpd->map.m_len = 0; in mpage_prepare_extent_to_map()
2593 mpd->next_page = index; in mpage_prepare_extent_to_map()
2611 if (mpd->wbc->sync_mode == WB_SYNC_NONE && left <= 0) in mpage_prepare_extent_to_map()
2615 if (mpd->map.m_len > 0 && mpd->next_page != page->index) in mpage_prepare_extent_to_map()
2628 (mpd->wbc->sync_mode == WB_SYNC_NONE)) || in mpage_prepare_extent_to_map()
2647 ext4_warning_inode(mpd->inode, "page %lu does not have buffers attached", page->index); in mpage_prepare_extent_to_map()
2653 if (mpd->map.m_len == 0) in mpage_prepare_extent_to_map()
2654 mpd->first_page = page->index; in mpage_prepare_extent_to_map()
2655 mpd->next_page = page->index + 1; in mpage_prepare_extent_to_map()
2660 err = mpage_process_page_bufs(mpd, head, head, lblk); in mpage_prepare_extent_to_map()
2669 mpd->scanned_until_end = 1; in mpage_prepare_extent_to_map()
2684 struct mpage_da_data mpd; in ext4_writepages() local
2760 mpd.first_page = writeback_index; in ext4_writepages()
2761 mpd.last_page = -1; in ext4_writepages()
2763 mpd.first_page = wbc->range_start >> PAGE_SHIFT; in ext4_writepages()
2764 mpd.last_page = wbc->range_end >> PAGE_SHIFT; in ext4_writepages()
2767 mpd.inode = inode; in ext4_writepages()
2768 mpd.wbc = wbc; in ext4_writepages()
2769 ext4_io_submit_init(&mpd.io_submit, wbc); in ext4_writepages()
2772 tag_pages_for_writeback(mapping, mpd.first_page, mpd.last_page); in ext4_writepages()
2781 mpd.do_map = 0; in ext4_writepages()
2782 mpd.scanned_until_end = 0; in ext4_writepages()
2783 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2784 if (!mpd.io_submit.io_end) { in ext4_writepages()
2788 ret = mpage_prepare_extent_to_map(&mpd); in ext4_writepages()
2790 mpage_release_unused_pages(&mpd, false); in ext4_writepages()
2792 ext4_io_submit(&mpd.io_submit); in ext4_writepages()
2793 ext4_put_io_end_defer(mpd.io_submit.io_end); in ext4_writepages()
2794 mpd.io_submit.io_end = NULL; in ext4_writepages()
2798 while (!mpd.scanned_until_end && wbc->nr_to_write > 0) { in ext4_writepages()
2800 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2801 if (!mpd.io_submit.io_end) { in ext4_writepages()
2825 ext4_put_io_end(mpd.io_submit.io_end); in ext4_writepages()
2826 mpd.io_submit.io_end = NULL; in ext4_writepages()
2829 mpd.do_map = 1; in ext4_writepages()
2831 trace_ext4_da_write_pages(inode, mpd.first_page, mpd.wbc); in ext4_writepages()
2832 ret = mpage_prepare_extent_to_map(&mpd); in ext4_writepages()
2833 if (!ret && mpd.map.m_len) in ext4_writepages()
2834 ret = mpage_map_and_submit_extent(handle, &mpd, in ext4_writepages()
2849 mpd.do_map = 0; in ext4_writepages()
2852 mpage_release_unused_pages(&mpd, give_up_on_write); in ext4_writepages()
2854 ext4_io_submit(&mpd.io_submit); in ext4_writepages()
2864 ext4_put_io_end_defer(mpd.io_submit.io_end); in ext4_writepages()
2867 ext4_put_io_end(mpd.io_submit.io_end); in ext4_writepages()
2868 mpd.io_submit.io_end = NULL; in ext4_writepages()
2888 mpd.last_page = writeback_index - 1; in ext4_writepages()
2889 mpd.first_page = 0; in ext4_writepages()
2899 mapping->writeback_index = mpd.first_page; in ext4_writepages()