Lines Matching +full:non +full:- +full:contiguous
1 // SPDX-License-Identifier: GPL-2.0
30 #include <linux/backing-dev.h>
37 * The mpage code never puts partial pages into a BIO (except for end-of-file).
38 * If a page does not map to a contiguous run of blocks then it simply falls
49 int err = blk_status_to_errno(bio->bi_status); in mpage_read_end_io()
60 int err = blk_status_to_errno(bio->bi_status); in mpage_write_end_io()
64 mapping_set_error(fi.folio->mapping, err); in mpage_write_end_io()
73 bio->bi_end_io = mpage_read_end_io; in mpage_bio_submit_read()
81 bio->bi_end_io = mpage_write_end_io; in mpage_bio_submit_write()
100 struct inode *inode = folio->mapping->host; in map_buffer_to_folio()
110 if (inode->i_blkbits == folio_shift(folio) && in map_buffer_to_folio()
121 page_bh->b_state = bh->b_state; in map_buffer_to_folio()
122 page_bh->b_bdev = bh->b_bdev; in map_buffer_to_folio()
123 page_bh->b_blocknr = bh->b_blocknr; in map_buffer_to_folio()
126 page_bh = page_bh->b_this_page; in map_buffer_to_folio()
145 * blocks are not contiguous on the disk.
153 struct folio *folio = args->folio; in do_mpage_readpage()
154 struct inode *inode = folio->mapping->host; in do_mpage_readpage()
155 const unsigned blkbits = inode->i_blkbits; in do_mpage_readpage()
158 struct buffer_head *map_bh = &args->map_bh; in do_mpage_readpage()
171 gfp_t gfp = mapping_gfp_constraint(folio->mapping, GFP_KERNEL); in do_mpage_readpage()
173 if (args->is_readahead) { in do_mpage_readpage()
182 last_block = block_in_file + ((args->nr_pages * PAGE_SIZE) >> blkbits); in do_mpage_readpage()
183 last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits; in do_mpage_readpage()
191 nblocks = map_bh->b_size >> blkbits; in do_mpage_readpage()
193 block_in_file > args->first_logical_block && in do_mpage_readpage()
194 block_in_file < (args->first_logical_block + nblocks)) { in do_mpage_readpage()
195 unsigned map_offset = block_in_file - args->first_logical_block; in do_mpage_readpage()
196 unsigned last = nblocks - map_offset; in do_mpage_readpage()
198 first_block = map_bh->b_blocknr + map_offset; in do_mpage_readpage()
209 bdev = map_bh->b_bdev; in do_mpage_readpage()
215 map_bh->b_folio = folio; in do_mpage_readpage()
217 map_bh->b_state = 0; in do_mpage_readpage()
218 map_bh->b_size = 0; in do_mpage_readpage()
221 map_bh->b_size = (last_block-block_in_file) << blkbits; in do_mpage_readpage()
222 if (args->get_block(inode, block_in_file, map_bh, 0)) in do_mpage_readpage()
224 args->first_logical_block = block_in_file; in do_mpage_readpage()
248 goto confused; /* hole -> non-hole */ in do_mpage_readpage()
250 /* Contiguous blocks? */ in do_mpage_readpage()
252 first_block = map_bh->b_blocknr; in do_mpage_readpage()
253 else if (first_block + page_block != map_bh->b_blocknr) in do_mpage_readpage()
255 nblocks = map_bh->b_size >> blkbits; in do_mpage_readpage()
265 bdev = map_bh->b_bdev; in do_mpage_readpage()
282 if (args->bio && (args->last_block_in_bio != first_block - 1)) in do_mpage_readpage()
283 args->bio = mpage_bio_submit_read(args->bio); in do_mpage_readpage()
286 if (args->bio == NULL) { in do_mpage_readpage()
287 args->bio = bio_alloc(bdev, bio_max_segs(args->nr_pages), opf, in do_mpage_readpage()
289 if (args->bio == NULL) in do_mpage_readpage()
291 args->bio->bi_iter.bi_sector = first_block << (blkbits - 9); in do_mpage_readpage()
295 if (!bio_add_folio(args->bio, folio, length, 0)) { in do_mpage_readpage()
296 args->bio = mpage_bio_submit_read(args->bio); in do_mpage_readpage()
300 relative_block = block_in_file - args->first_logical_block; in do_mpage_readpage()
301 nblocks = map_bh->b_size >> blkbits; in do_mpage_readpage()
304 args->bio = mpage_bio_submit_read(args->bio); in do_mpage_readpage()
306 args->last_block_in_bio = first_block + blocks_per_folio - 1; in do_mpage_readpage()
311 if (args->bio) in do_mpage_readpage()
312 args->bio = mpage_bio_submit_read(args->bio); in do_mpage_readpage()
314 block_read_full_folio(folio, args->get_block); in do_mpage_readpage()
321 * mpage_readahead - start reads against pages
330 * - encountering a page which has buffers
331 * - encountering a page which has a non-hole after a hole
332 * - encountering a page with non-contiguous blocks
334 * then this code just gives up and calls the buffer_head-based read function.
335 * It does handle a page which has holes at the end - that is a common case:
336 * the end-of-file on blocksize < PAGE_SIZE setups.
368 prefetchw(&folio->flags); in mpage_readahead()
406 * mapping. We only support pages which are fully mapped-and-dirty, with a
407 * special case for pages which are unmapped at the end: end-of-file.
411 * If all blocks are found to be contiguous then the page can go into the
415 * written, so it can intelligently allocate a suitably-sized BIO. For now,
416 * just allocate full-size (16-page) BIOs.
442 bh = bh->b_this_page; in clean_buffers()
457 struct bio *bio = mpd->bio; in mpage_write_folio()
458 struct address_space *mapping = folio->mapping; in mpage_write_folio()
459 struct inode *inode = mapping->host; in mpage_write_folio()
460 const unsigned blkbits = inode->i_blkbits; in mpage_write_folio()
487 * block_dirty_folio -> mmapped data in mpage_write_folio()
497 goto confused; /* hole -> non-hole */ in mpage_write_folio()
502 if (bh->b_blocknr != first_block + page_block) in mpage_write_folio()
505 first_block = bh->b_blocknr; in mpage_write_folio()
510 boundary_block = bh->b_blocknr; in mpage_write_folio()
511 boundary_bdev = bh->b_bdev; in mpage_write_folio()
513 bdev = bh->b_bdev; in mpage_write_folio()
514 } while ((bh = bh->b_this_page) != head); in mpage_write_folio()
537 if (block_in_file >= (i_size + (1 << blkbits) - 1) >> blkbits) in mpage_write_folio()
539 last_block = (i_size - 1) >> blkbits; in mpage_write_folio()
545 if (mpd->get_block(inode, block_in_file, &map_bh, 1)) in mpage_write_folio()
586 length = i_size - folio_pos(folio); in mpage_write_folio()
593 if (bio && mpd->last_block_in_bio != first_block - 1) in mpage_write_folio()
601 bio->bi_iter.bi_sector = first_block << (blkbits - 9); in mpage_write_folio()
603 bio->bi_write_hint = inode->i_write_hint; in mpage_write_folio()
630 mpd->last_block_in_bio = first_block + blocks_per_folio - 1; in mpage_write_folio()
641 ret = block_write_full_folio(folio, wbc, mpd->get_block); in mpage_write_folio()
644 mpd->bio = bio; in mpage_write_folio()
649 …* mpage_writepages - walk the list of dirty pages of the given address space & writepage() all of …
651 * @wbc: subtract the number of written pages from *@wbc->nr_to_write