Lines Matching refs:mpd
1544 static void mpage_release_unused_pages(struct mpage_da_data *mpd,
1550 struct inode *inode = mpd->inode;
1554 if (mpd->first_page >= mpd->next_page)
1557 mpd->scanned_until_end = 0;
1558 index = mpd->first_page;
1559 end = mpd->next_page - 1;
1582 if (folio->index < mpd->first_page)
1845 static void mpage_folio_done(struct mpage_da_data *mpd, struct folio *folio)
1847 mpd->first_page += folio_nr_pages(folio);
1851 static int mpage_submit_folio(struct mpage_da_data *mpd, struct folio *folio)
1857 BUG_ON(folio->index != mpd->first_page);
1872 size = i_size_read(mpd->inode);
1875 !ext4_verity_in_progress(mpd->inode))
1877 err = ext4_bio_write_folio(&mpd->io_submit, folio, len);
1879 mpd->wbc->nr_to_write--;
1896 * @mpd - extent of blocks
1907 static bool mpage_add_bh_to_extent(struct mpage_da_data *mpd, ext4_lblk_t lblk,
1910 struct ext4_map_blocks *map = &mpd->map;
1924 if (!mpd->do_map)
1948 * @mpd - extent of blocks for mapping
1961 static int mpage_process_page_bufs(struct mpage_da_data *mpd,
1966 struct inode *inode = mpd->inode;
1977 if (lblk >= blocks || !mpage_add_bh_to_extent(mpd, lblk, bh)) {
1979 if (mpd->map.m_len)
1982 if (!mpd->do_map)
1989 if (mpd->map.m_len == 0) {
1990 err = mpage_submit_folio(mpd, head->b_folio);
1993 mpage_folio_done(mpd, head->b_folio);
1996 mpd->scanned_until_end = 1;
2005 * @mpd: description of extent to map, on return next extent to map
2015 * If the given folio is not fully mapped, we update @mpd to the next extent in
2018 static int mpage_process_folio(struct mpage_da_data *mpd, struct folio *folio,
2023 ext4_io_end_t *io_end = mpd->io_submit.io_end;
2027 int blkbits = mpd->inode->i_blkbits;
2033 if (lblk < mpd->map.m_lblk)
2035 if (lblk >= mpd->map.m_lblk + mpd->map.m_len) {
2040 mpd->map.m_len = 0;
2041 mpd->map.m_flags = 0;
2044 err = mpage_process_page_bufs(mpd, head, bh, lblk);
2047 if (!err && mpd->map.m_len && mpd->map.m_lblk > lblk) {
2053 io_end_vec->offset = (loff_t)mpd->map.m_lblk << blkbits;
2078 * @mpd - description of extent to map, on return next extent to map
2088 static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd)
2092 struct inode *inode = mpd->inode;
2100 start = mpd->map.m_lblk >> bpp_bits;
2101 end = (mpd->map.m_lblk + mpd->map.m_len - 1) >> bpp_bits;
2103 pblock = mpd->map.m_pblk;
2113 err = mpage_process_folio(mpd, folio, &lblk, &pblock,
2123 err = mpage_submit_folio(mpd, folio);
2126 mpage_folio_done(mpd, folio);
2131 mpd->map.m_len = 0;
2132 mpd->map.m_flags = 0;
2139 static int mpage_map_one_extent(handle_t *handle, struct mpage_da_data *mpd)
2141 struct inode *inode = mpd->inode;
2142 struct ext4_map_blocks *map = &mpd->map;
2175 if (!mpd->io_submit.io_end->handle &&
2177 mpd->io_submit.io_end->handle = handle->h_rsv_handle;
2180 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end);
2188 * mpage_map_and_submit_extent - map extent starting at mpd->lblk of length
2189 * mpd->len and submit pages underlying it for IO
2192 * @mpd - extent to map
2197 * The function maps extent starting at mpd->lblk of length mpd->len. If it is
2208 struct mpage_da_data *mpd,
2211 struct inode *inode = mpd->inode;
2212 struct ext4_map_blocks *map = &mpd->map;
2216 ext4_io_end_t *io_end = mpd->io_submit.io_end;
2224 err = mpage_map_one_extent(handle, mpd);
2262 err = mpage_map_and_submit_buffers(mpd);
2272 disksize = ((loff_t)mpd->first_page) << PAGE_SHIFT;
2333 struct mpage_da_data *mpd,
2336 struct inode *inode = mpd->inode;
2341 mpd->wbc->nr_to_write--;
2354 * @mpd - where to look for pages
2362 * extent found is returned in @mpd structure (starting at mpd->lblk with
2363 * length mpd->len blocks).
2370 static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd)
2372 struct address_space *mapping = mpd->inode->i_mapping;
2375 pgoff_t index = mpd->first_page;
2376 pgoff_t end = mpd->last_page;
2379 int blkbits = mpd->inode->i_blkbits;
2383 int bpp = ext4_journal_blocks_per_page(mpd->inode);
2385 if (mpd->wbc->sync_mode == WB_SYNC_ALL || mpd->wbc->tagged_writepages)
2390 mpd->map.m_len = 0;
2391 mpd->next_page = index;
2392 if (ext4_should_journal_data(mpd->inode)) {
2393 handle = ext4_journal_start(mpd->inode, EXT4_HT_WRITE_PAGE,
2416 if (mpd->wbc->sync_mode == WB_SYNC_NONE &&
2417 mpd->wbc->nr_to_write <=
2418 mpd->map.m_len >> (PAGE_SHIFT - blkbits))
2422 if (mpd->map.m_len > 0 && mpd->next_page != folio->index)
2442 (mpd->wbc->sync_mode == WB_SYNC_NONE)) ||
2461 ext4_warning_inode(mpd->inode, "page %lu does not have buffers attached", folio->index);
2467 if (mpd->map.m_len == 0)
2468 mpd->first_page = folio->index;
2469 mpd->next_page = folio_next_index(folio);
2480 if (!mpd->can_map) {
2481 err = mpage_submit_folio(mpd, folio);
2487 mpd, folio);
2490 mpd->journalled_more_data = 1;
2492 mpage_folio_done(mpd, folio);
2494 /* Add all dirty buffers to mpd */
2498 err = mpage_process_page_bufs(mpd, head, head,
2508 mpd->scanned_until_end = 1;
2519 static int ext4_do_writepages(struct mpage_da_data *mpd)
2521 struct writeback_control *wbc = mpd->wbc;
2527 struct inode *inode = mpd->inode;
2590 mpd->can_map = 0;
2595 mpd->journalled_more_data = 0;
2613 mpd->first_page = writeback_index;
2614 mpd->last_page = -1;
2616 mpd->first_page = wbc->range_start >> PAGE_SHIFT;
2617 mpd->last_page = wbc->range_end >> PAGE_SHIFT;
2620 ext4_io_submit_init(&mpd->io_submit, wbc);
2623 tag_pages_for_writeback(mapping, mpd->first_page,
2624 mpd->last_page);
2633 mpd->do_map = 0;
2634 mpd->scanned_until_end = 0;
2635 mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL);
2636 if (!mpd->io_submit.io_end) {
2640 ret = mpage_prepare_extent_to_map(mpd);
2642 mpage_release_unused_pages(mpd, false);
2644 ext4_io_submit(&mpd->io_submit);
2645 ext4_put_io_end_defer(mpd->io_submit.io_end);
2646 mpd->io_submit.io_end = NULL;
2650 while (!mpd->scanned_until_end && wbc->nr_to_write > 0) {
2652 mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL);
2653 if (!mpd->io_submit.io_end) {
2658 WARN_ON_ONCE(!mpd->can_map);
2678 ext4_put_io_end(mpd->io_submit.io_end);
2679 mpd->io_submit.io_end = NULL;
2682 mpd->do_map = 1;
2684 trace_ext4_da_write_pages(inode, mpd->first_page, wbc);
2685 ret = mpage_prepare_extent_to_map(mpd);
2686 if (!ret && mpd->map.m_len)
2687 ret = mpage_map_and_submit_extent(handle, mpd,
2702 mpd->do_map = 0;
2705 mpage_release_unused_pages(mpd, give_up_on_write);
2707 ext4_io_submit(&mpd->io_submit);
2717 ext4_put_io_end_defer(mpd->io_submit.io_end);
2720 ext4_put_io_end(mpd->io_submit.io_end);
2721 mpd->io_submit.io_end = NULL;
2741 mpd->last_page = writeback_index - 1;
2742 mpd->first_page = 0;
2752 mapping->writeback_index = mpd->first_page;
2764 struct mpage_da_data mpd = {
2776 ret = ext4_do_writepages(&mpd);
2782 if (!ret && mpd.journalled_more_data)
2783 ret = ext4_do_writepages(&mpd);
2797 struct mpage_da_data mpd = {
2802 return ext4_do_writepages(&mpd);