mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	mpage: pass the operation to bio_alloc
Refactor the mpage read/write page code to pass the op to bio_alloc instead of setting it just before the submission. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20220222154634.597067-2-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									451f0b6f4c
								
							
						
					
					
						commit
						77c436de01
					
				
					 1 changed files with 21 additions and 29 deletions
				
			
		
							
								
								
									
										50
									
								
								fs/mpage.c
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								fs/mpage.c
									
									
									
									
									
								
							|  | @ -57,10 +57,9 @@ static void mpage_end_io(struct bio *bio) | |||
| 	bio_put(bio); | ||||
| } | ||||
| 
 | ||||
| static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio) | ||||
| static struct bio *mpage_bio_submit(struct bio *bio) | ||||
| { | ||||
| 	bio->bi_end_io = mpage_end_io; | ||||
| 	bio_set_op_attrs(bio, op, op_flags); | ||||
| 	guard_bio_eod(bio); | ||||
| 	submit_bio(bio); | ||||
| 	return NULL; | ||||
|  | @ -146,16 +145,15 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 	struct block_device *bdev = NULL; | ||||
| 	int length; | ||||
| 	int fully_mapped = 1; | ||||
| 	int op_flags; | ||||
| 	int op = REQ_OP_READ; | ||||
| 	unsigned nblocks; | ||||
| 	unsigned relative_block; | ||||
| 	gfp_t gfp; | ||||
| 
 | ||||
| 	if (args->is_readahead) { | ||||
| 		op_flags = REQ_RAHEAD; | ||||
| 		op |= REQ_RAHEAD; | ||||
| 		gfp = readahead_gfp_mask(page->mapping); | ||||
| 	} else { | ||||
| 		op_flags = 0; | ||||
| 		gfp = mapping_gfp_constraint(page->mapping, GFP_KERNEL); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -264,7 +262,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 	 * This page will go to BIO.  Do we need to send this BIO off first? | ||||
| 	 */ | ||||
| 	if (args->bio && (args->last_block_in_bio != blocks[0] - 1)) | ||||
| 		args->bio = mpage_bio_submit(REQ_OP_READ, op_flags, args->bio); | ||||
| 		args->bio = mpage_bio_submit(args->bio); | ||||
| 
 | ||||
| alloc_new: | ||||
| 	if (args->bio == NULL) { | ||||
|  | @ -273,7 +271,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 								page)) | ||||
| 				goto out; | ||||
| 		} | ||||
| 		args->bio = bio_alloc(bdev, bio_max_segs(args->nr_pages), 0, | ||||
| 		args->bio = bio_alloc(bdev, bio_max_segs(args->nr_pages), op, | ||||
| 				      gfp); | ||||
| 		if (args->bio == NULL) | ||||
| 			goto confused; | ||||
|  | @ -282,7 +280,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 
 | ||||
| 	length = first_hole << blkbits; | ||||
| 	if (bio_add_page(args->bio, page, length, 0) < length) { | ||||
| 		args->bio = mpage_bio_submit(REQ_OP_READ, op_flags, args->bio); | ||||
| 		args->bio = mpage_bio_submit(args->bio); | ||||
| 		goto alloc_new; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -290,7 +288,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 	nblocks = map_bh->b_size >> blkbits; | ||||
| 	if ((buffer_boundary(map_bh) && relative_block == nblocks) || | ||||
| 	    (first_hole != blocks_per_page)) | ||||
| 		args->bio = mpage_bio_submit(REQ_OP_READ, op_flags, args->bio); | ||||
| 		args->bio = mpage_bio_submit(args->bio); | ||||
| 	else | ||||
| 		args->last_block_in_bio = blocks[blocks_per_page - 1]; | ||||
| out: | ||||
|  | @ -298,7 +296,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) | |||
| 
 | ||||
| confused: | ||||
| 	if (args->bio) | ||||
| 		args->bio = mpage_bio_submit(REQ_OP_READ, op_flags, args->bio); | ||||
| 		args->bio = mpage_bio_submit(args->bio); | ||||
| 	if (!PageUptodate(page)) | ||||
| 		block_read_full_page(page, args->get_block); | ||||
| 	else | ||||
|  | @ -361,7 +359,7 @@ void mpage_readahead(struct readahead_control *rac, get_block_t get_block) | |||
| 		put_page(page); | ||||
| 	} | ||||
| 	if (args.bio) | ||||
| 		mpage_bio_submit(REQ_OP_READ, REQ_RAHEAD, args.bio); | ||||
| 		mpage_bio_submit(args.bio); | ||||
| } | ||||
| EXPORT_SYMBOL(mpage_readahead); | ||||
| 
 | ||||
|  | @ -378,7 +376,7 @@ int mpage_readpage(struct page *page, get_block_t get_block) | |||
| 
 | ||||
| 	args.bio = do_mpage_readpage(&args); | ||||
| 	if (args.bio) | ||||
| 		mpage_bio_submit(REQ_OP_READ, 0, args.bio); | ||||
| 		mpage_bio_submit(args.bio); | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL(mpage_readpage); | ||||
|  | @ -469,7 +467,6 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 	struct buffer_head map_bh; | ||||
| 	loff_t i_size = i_size_read(inode); | ||||
| 	int ret = 0; | ||||
| 	int op_flags = wbc_to_write_flags(wbc); | ||||
| 
 | ||||
| 	if (page_has_buffers(page)) { | ||||
| 		struct buffer_head *head = page_buffers(page); | ||||
|  | @ -577,7 +574,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 	 * This page will go to BIO.  Do we need to send this BIO off first? | ||||
| 	 */ | ||||
| 	if (bio && mpd->last_block_in_bio != blocks[0] - 1) | ||||
| 		bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); | ||||
| 		bio = mpage_bio_submit(bio); | ||||
| 
 | ||||
| alloc_new: | ||||
| 	if (bio == NULL) { | ||||
|  | @ -586,9 +583,10 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 								page, wbc)) | ||||
| 				goto out; | ||||
| 		} | ||||
| 		bio = bio_alloc(bdev, BIO_MAX_VECS, 0, GFP_NOFS); | ||||
| 		bio = bio_alloc(bdev, BIO_MAX_VECS, | ||||
| 				REQ_OP_WRITE | wbc_to_write_flags(wbc), | ||||
| 				GFP_NOFS); | ||||
| 		bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); | ||||
| 
 | ||||
| 		wbc_init_bio(wbc, bio); | ||||
| 		bio->bi_write_hint = inode->i_write_hint; | ||||
| 	} | ||||
|  | @ -601,7 +599,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 	wbc_account_cgroup_owner(wbc, page, PAGE_SIZE); | ||||
| 	length = first_unmapped << blkbits; | ||||
| 	if (bio_add_page(bio, page, length, 0) < length) { | ||||
| 		bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); | ||||
| 		bio = mpage_bio_submit(bio); | ||||
| 		goto alloc_new; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -611,7 +609,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 	set_page_writeback(page); | ||||
| 	unlock_page(page); | ||||
| 	if (boundary || (first_unmapped != blocks_per_page)) { | ||||
| 		bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); | ||||
| 		bio = mpage_bio_submit(bio); | ||||
| 		if (boundary_block) { | ||||
| 			write_boundary_block(boundary_bdev, | ||||
| 					boundary_block, 1 << blkbits); | ||||
|  | @ -623,7 +621,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
| 
 | ||||
| confused: | ||||
| 	if (bio) | ||||
| 		bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); | ||||
| 		bio = mpage_bio_submit(bio); | ||||
| 
 | ||||
| 	if (mpd->use_writepage) { | ||||
| 		ret = mapping->a_ops->writepage(page, wbc); | ||||
|  | @ -679,11 +677,8 @@ mpage_writepages(struct address_space *mapping, | |||
| 		}; | ||||
| 
 | ||||
| 		ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd); | ||||
| 		if (mpd.bio) { | ||||
| 			int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? | ||||
| 				  REQ_SYNC : 0); | ||||
| 			mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); | ||||
| 		} | ||||
| 		if (mpd.bio) | ||||
| 			mpage_bio_submit(mpd.bio); | ||||
| 	} | ||||
| 	blk_finish_plug(&plug); | ||||
| 	return ret; | ||||
|  | @ -700,11 +695,8 @@ int mpage_writepage(struct page *page, get_block_t get_block, | |||
| 		.use_writepage = 0, | ||||
| 	}; | ||||
| 	int ret = __mpage_writepage(page, wbc, &mpd); | ||||
| 	if (mpd.bio) { | ||||
| 		int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? | ||||
| 			  REQ_SYNC : 0); | ||||
| 		mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); | ||||
| 	} | ||||
| 	if (mpd.bio) | ||||
| 		mpage_bio_submit(mpd.bio); | ||||
| 	return ret; | ||||
| } | ||||
| EXPORT_SYMBOL(mpage_writepage); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Christoph Hellwig
						Christoph Hellwig