4195 lines · 100.1 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/* * fs/f2fs/data.c * * Copyright (c) 2012 Samsung Electronics Co., Ltd. *             http://www.samsung.com/ */#include <linux/fs.h>#include <linux/f2fs_fs.h>#include <linux/buffer_head.h>#include <linux/mpage.h>#include <linux/writeback.h>#include <linux/backing-dev.h>#include <linux/pagevec.h>#include <linux/blkdev.h>#include <linux/bio.h>#include <linux/blk-crypto.h>#include <linux/swap.h>#include <linux/prefetch.h>#include <linux/uio.h>#include <linux/cleancache.h>#include <linux/sched/signal.h>#include <linux/fiemap.h> #include "f2fs.h"#include "node.h"#include "segment.h"#include <trace/events/f2fs.h> #define NUM_PREALLOC_POST_READ_CTXS	128 static struct kmem_cache *bio_post_read_ctx_cache;static struct kmem_cache *bio_entry_slab;static mempool_t *bio_post_read_ctx_pool;static struct bio_set f2fs_bioset; #define	F2FS_BIO_POOL_SIZE	NR_CURSEG_TYPE int __init f2fs_init_bioset(void){	if (bioset_init(&f2fs_bioset, F2FS_BIO_POOL_SIZE,					0, BIOSET_NEED_BVECS))		return -ENOMEM;	return 0;} void f2fs_destroy_bioset(void){	bioset_exit(&f2fs_bioset);} static bool __is_cp_guaranteed(struct page *page){	struct address_space *mapping = page->mapping;	struct inode *inode;	struct f2fs_sb_info *sbi; 	if (!mapping)		return false; 	if (f2fs_is_compressed_page(page))		return false; 	inode = mapping->host;	sbi = F2FS_I_SB(inode); 	if (inode->i_ino == F2FS_META_INO(sbi) ||			inode->i_ino == F2FS_NODE_INO(sbi) ||			S_ISDIR(inode->i_mode) ||			(S_ISREG(inode->i_mode) &&			(f2fs_is_atomic_file(inode) || IS_NOQUOTA(inode))) ||			is_cold_data(page))		return true;	return false;} static enum count_type __read_io_type(struct page *page){	struct address_space *mapping = page_file_mapping(page); 	if (mapping) {		struct inode *inode = mapping->host;		struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 		if (inode->i_ino == F2FS_META_INO(sbi))			return F2FS_RD_META; 		if (inode->i_ino == F2FS_NODE_INO(sbi))			return F2FS_RD_NODE;	}	return F2FS_RD_DATA;} /* postprocessing steps for read bios */enum bio_post_read_step {#ifdef CONFIG_FS_ENCRYPTION	STEP_DECRYPT	= 1 << 0,#else	STEP_DECRYPT	= 0,	/* compile out the decryption-related code */#endif#ifdef CONFIG_F2FS_FS_COMPRESSION	STEP_DECOMPRESS	= 1 << 1,#else	STEP_DECOMPRESS	= 0,	/* compile out the decompression-related code */#endif#ifdef CONFIG_FS_VERITY	STEP_VERITY	= 1 << 2,#else	STEP_VERITY	= 0,	/* compile out the verity-related code */#endif}; struct bio_post_read_ctx {	struct bio *bio;	struct f2fs_sb_info *sbi;	struct work_struct work;	unsigned int enabled_steps;}; static void f2fs_finish_read_bio(struct bio *bio){	struct bio_vec *bv;	struct bvec_iter_all iter_all; 	/*	 * Update and unlock the bio's pagecache pages, and put the	 * decompression context for any compressed pages.	 */	bio_for_each_segment_all(bv, bio, iter_all) {		struct page *page = bv->bv_page; 		if (f2fs_is_compressed_page(page)) {			if (bio->bi_status)				f2fs_end_read_compressed_page(page, true);			f2fs_put_page_dic(page);			continue;		} 		/* PG_error was set if decryption or verity failed. */		if (bio->bi_status || PageError(page)) {			ClearPageUptodate(page);			/* will re-read again later */			ClearPageError(page);		} else {			SetPageUptodate(page);		}		dec_page_count(F2FS_P_SB(page), __read_io_type(page));		unlock_page(page);	} 	if (bio->bi_private)		mempool_free(bio->bi_private, bio_post_read_ctx_pool);	bio_put(bio);} static void f2fs_verify_bio(struct work_struct *work){	struct bio_post_read_ctx *ctx =		container_of(work, struct bio_post_read_ctx, work);	struct bio *bio = ctx->bio;	bool may_have_compressed_pages = (ctx->enabled_steps & STEP_DECOMPRESS); 	/*	 * fsverity_verify_bio() may call readpages() again, and while verity	 * will be disabled for this, decryption and/or decompression may still	 * be needed, resulting in another bio_post_read_ctx being allocated.	 * So to prevent deadlocks we need to release the current ctx to the	 * mempool first.  This assumes that verity is the last post-read step.	 */	mempool_free(ctx, bio_post_read_ctx_pool);	bio->bi_private = NULL; 	/*	 * Verify the bio's pages with fs-verity.  Exclude compressed pages,	 * as those were handled separately by f2fs_end_read_compressed_page().	 */	if (may_have_compressed_pages) {		struct bio_vec *bv;		struct bvec_iter_all iter_all; 		bio_for_each_segment_all(bv, bio, iter_all) {			struct page *page = bv->bv_page; 			if (!f2fs_is_compressed_page(page) &&			    !PageError(page) && !fsverity_verify_page(page))				SetPageError(page);		}	} else {		fsverity_verify_bio(bio);	} 	f2fs_finish_read_bio(bio);} /* * If the bio's data needs to be verified with fs-verity, then enqueue the * verity work for the bio.  Otherwise finish the bio now. * * Note that to avoid deadlocks, the verity work can't be done on the * decryption/decompression workqueue.  This is because verifying the data pages * can involve reading verity metadata pages from the file, and these verity * metadata pages may be encrypted and/or compressed. */static void f2fs_verify_and_finish_bio(struct bio *bio){	struct bio_post_read_ctx *ctx = bio->bi_private; 	if (ctx && (ctx->enabled_steps & STEP_VERITY)) {		INIT_WORK(&ctx->work, f2fs_verify_bio);		fsverity_enqueue_verify_work(&ctx->work);	} else {		f2fs_finish_read_bio(bio);	}} /* * Handle STEP_DECOMPRESS by decompressing any compressed clusters whose last * remaining page was read by @ctx->bio. * * Note that a bio may span clusters (even a mix of compressed and uncompressed * clusters) or be for just part of a cluster.  STEP_DECOMPRESS just indicates * that the bio includes at least one compressed page.  The actual decompression * is done on a per-cluster basis, not a per-bio basis. */static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx){	struct bio_vec *bv;	struct bvec_iter_all iter_all;	bool all_compressed = true; 	bio_for_each_segment_all(bv, ctx->bio, iter_all) {		struct page *page = bv->bv_page; 		/* PG_error was set if decryption failed. */		if (f2fs_is_compressed_page(page))			f2fs_end_read_compressed_page(page, PageError(page));		else			all_compressed = false;	} 	/*	 * Optimization: if all the bio's pages are compressed, then scheduling	 * the per-bio verity work is unnecessary, as verity will be fully	 * handled at the compression cluster level.	 */	if (all_compressed)		ctx->enabled_steps &= ~STEP_VERITY;} static void f2fs_post_read_work(struct work_struct *work){	struct bio_post_read_ctx *ctx =		container_of(work, struct bio_post_read_ctx, work); 	if (ctx->enabled_steps & STEP_DECRYPT)		fscrypt_decrypt_bio(ctx->bio); 	if (ctx->enabled_steps & STEP_DECOMPRESS)		f2fs_handle_step_decompress(ctx); 	f2fs_verify_and_finish_bio(ctx->bio);} static void f2fs_read_end_io(struct bio *bio){	struct f2fs_sb_info *sbi = F2FS_P_SB(bio_first_page_all(bio));	struct bio_post_read_ctx *ctx = bio->bi_private; 	if (time_to_inject(sbi, FAULT_READ_IO)) {		f2fs_show_injection_info(sbi, FAULT_READ_IO);		bio->bi_status = BLK_STS_IOERR;	} 	if (bio->bi_status) {		f2fs_finish_read_bio(bio);		return;	} 	if (ctx && (ctx->enabled_steps & (STEP_DECRYPT | STEP_DECOMPRESS))) {		INIT_WORK(&ctx->work, f2fs_post_read_work);		queue_work(ctx->sbi->post_read_wq, &ctx->work);	} else {		f2fs_verify_and_finish_bio(bio);	}} static void f2fs_write_end_io(struct bio *bio){	struct f2fs_sb_info *sbi = bio->bi_private;	struct bio_vec *bvec;	struct bvec_iter_all iter_all; 	if (time_to_inject(sbi, FAULT_WRITE_IO)) {		f2fs_show_injection_info(sbi, FAULT_WRITE_IO);		bio->bi_status = BLK_STS_IOERR;	} 	bio_for_each_segment_all(bvec, bio, iter_all) {		struct page *page = bvec->bv_page;		enum count_type type = WB_DATA_TYPE(page); 		if (IS_DUMMY_WRITTEN_PAGE(page)) {			set_page_private(page, (unsigned long)NULL);			ClearPagePrivate(page);			unlock_page(page);			mempool_free(page, sbi->write_io_dummy); 			if (unlikely(bio->bi_status))				f2fs_stop_checkpoint(sbi, true);			continue;		} 		fscrypt_finalize_bounce_page(&page); #ifdef CONFIG_F2FS_FS_COMPRESSION		if (f2fs_is_compressed_page(page)) {			f2fs_compress_write_end_io(bio, page);			continue;		}#endif 		if (unlikely(bio->bi_status)) {			mapping_set_error(page->mapping, -EIO);			if (type == F2FS_WB_CP_DATA)				f2fs_stop_checkpoint(sbi, true);		} 		f2fs_bug_on(sbi, page->mapping == NODE_MAPPING(sbi) &&					page->index != nid_of_node(page)); 		dec_page_count(sbi, type);		if (f2fs_in_warm_node_list(sbi, page))			f2fs_del_fsync_node_entry(sbi, page);		clear_cold_data(page);		end_page_writeback(page);	}	if (!get_pages(sbi, F2FS_WB_CP_DATA) &&				wq_has_sleeper(&sbi->cp_wait))		wake_up(&sbi->cp_wait); 	bio_put(bio);} struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi,				block_t blk_addr, struct bio *bio){	struct block_device *bdev = sbi->sb->s_bdev;	int i; 	if (f2fs_is_multi_device(sbi)) {		for (i = 0; i < sbi->s_ndevs; i++) {			if (FDEV(i).start_blk <= blk_addr &&			    FDEV(i).end_blk >= blk_addr) {				blk_addr -= FDEV(i).start_blk;				bdev = FDEV(i).bdev;				break;			}		}	}	if (bio) {		bio_set_dev(bio, bdev);		bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(blk_addr);	}	return bdev;} int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr){	int i; 	if (!f2fs_is_multi_device(sbi))		return 0; 	for (i = 0; i < sbi->s_ndevs; i++)		if (FDEV(i).start_blk <= blkaddr && FDEV(i).end_blk >= blkaddr)			return i;	return 0;} static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages){	struct f2fs_sb_info *sbi = fio->sbi;	struct bio *bio; 	bio = bio_alloc_bioset(GFP_NOIO, npages, &f2fs_bioset); 	f2fs_target_device(sbi, fio->new_blkaddr, bio);	if (is_read_io(fio->op)) {		bio->bi_end_io = f2fs_read_end_io;		bio->bi_private = NULL;	} else {		bio->bi_end_io = f2fs_write_end_io;		bio->bi_private = sbi;		bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi,						fio->type, fio->temp);	}	if (fio->io_wbc)		wbc_init_bio(fio->io_wbc, bio); 	return bio;} static void f2fs_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,				  pgoff_t first_idx,				  const struct f2fs_io_info *fio,				  gfp_t gfp_mask){	/*	 * The f2fs garbage collector sets ->encrypted_page when it wants to	 * read/write raw data without encryption.	 */	if (!fio || !fio->encrypted_page)		fscrypt_set_bio_crypt_ctx(bio, inode, first_idx, gfp_mask);} static bool f2fs_crypt_mergeable_bio(struct bio *bio, const struct inode *inode,				     pgoff_t next_idx,				     const struct f2fs_io_info *fio){	/*	 * The f2fs garbage collector sets ->encrypted_page when it wants to	 * read/write raw data without encryption.	 */	if (fio && fio->encrypted_page)		return !bio_has_crypt_ctx(bio); 	return fscrypt_mergeable_bio(bio, inode, next_idx);} static inline void __submit_bio(struct f2fs_sb_info *sbi,				struct bio *bio, enum page_type type){	if (!is_read_io(bio_op(bio))) {		unsigned int start; 		if (type != DATA && type != NODE)			goto submit_io; 		if (f2fs_lfs_mode(sbi) && current->plug)			blk_finish_plug(current->plug); 		if (!F2FS_IO_ALIGNED(sbi))			goto submit_io; 		start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;		start %= F2FS_IO_SIZE(sbi); 		if (start == 0)			goto submit_io; 		/* fill dummy pages */		for (; start < F2FS_IO_SIZE(sbi); start++) {			struct page *page =				mempool_alloc(sbi->write_io_dummy,					      GFP_NOIO | __GFP_NOFAIL);			f2fs_bug_on(sbi, !page); 			zero_user_segment(page, 0, PAGE_SIZE);			SetPagePrivate(page);			set_page_private(page, DUMMY_WRITTEN_PAGE);			lock_page(page);			if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)				f2fs_bug_on(sbi, 1);		}		/*		 * In the NODE case, we lose next block address chain. So, we		 * need to do checkpoint in f2fs_sync_file.		 */		if (type == NODE)			set_sbi_flag(sbi, SBI_NEED_CP);	}submit_io:	if (is_read_io(bio_op(bio)))		trace_f2fs_submit_read_bio(sbi->sb, type, bio);	else		trace_f2fs_submit_write_bio(sbi->sb, type, bio);	submit_bio(bio);} void f2fs_submit_bio(struct f2fs_sb_info *sbi,				struct bio *bio, enum page_type type){	__submit_bio(sbi, bio, type);} static void __attach_io_flag(struct f2fs_io_info *fio){	struct f2fs_sb_info *sbi = fio->sbi;	unsigned int temp_mask = (1 << NR_TEMP_TYPE) - 1;	unsigned int io_flag, fua_flag, meta_flag; 	if (fio->type == DATA)		io_flag = sbi->data_io_flag;	else if (fio->type == NODE)		io_flag = sbi->node_io_flag;	else		return; 	fua_flag = io_flag & temp_mask;	meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask;

Lines 1–500 of 4195.