xref: /OK3568_Linux_fs/kernel/fs/f2fs/data.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * fs/f2fs/data.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun  *             http://www.samsung.com/
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun #include <linux/fs.h>
9*4882a593Smuzhiyun #include <linux/f2fs_fs.h>
10*4882a593Smuzhiyun #include <linux/buffer_head.h>
11*4882a593Smuzhiyun #include <linux/mpage.h>
12*4882a593Smuzhiyun #include <linux/writeback.h>
13*4882a593Smuzhiyun #include <linux/backing-dev.h>
14*4882a593Smuzhiyun #include <linux/pagevec.h>
15*4882a593Smuzhiyun #include <linux/blkdev.h>
16*4882a593Smuzhiyun #include <linux/bio.h>
17*4882a593Smuzhiyun #include <linux/blk-crypto.h>
18*4882a593Smuzhiyun #include <linux/swap.h>
19*4882a593Smuzhiyun #include <linux/prefetch.h>
20*4882a593Smuzhiyun #include <linux/uio.h>
21*4882a593Smuzhiyun #include <linux/cleancache.h>
22*4882a593Smuzhiyun #include <linux/sched/signal.h>
23*4882a593Smuzhiyun #include <linux/fiemap.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "f2fs.h"
26*4882a593Smuzhiyun #include "node.h"
27*4882a593Smuzhiyun #include "segment.h"
28*4882a593Smuzhiyun #include <trace/events/f2fs.h>
29*4882a593Smuzhiyun #include <trace/events/android_fs.h>
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define NUM_PREALLOC_POST_READ_CTXS	128
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun static struct kmem_cache *bio_post_read_ctx_cache;
34*4882a593Smuzhiyun static struct kmem_cache *bio_entry_slab;
35*4882a593Smuzhiyun static mempool_t *bio_post_read_ctx_pool;
36*4882a593Smuzhiyun static struct bio_set f2fs_bioset;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define	F2FS_BIO_POOL_SIZE	NR_CURSEG_TYPE
39*4882a593Smuzhiyun 
f2fs_init_bioset(void)40*4882a593Smuzhiyun int __init f2fs_init_bioset(void)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun 	if (bioset_init(&f2fs_bioset, F2FS_BIO_POOL_SIZE,
43*4882a593Smuzhiyun 					0, BIOSET_NEED_BVECS))
44*4882a593Smuzhiyun 		return -ENOMEM;
45*4882a593Smuzhiyun 	return 0;
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
f2fs_destroy_bioset(void)48*4882a593Smuzhiyun void f2fs_destroy_bioset(void)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun 	bioset_exit(&f2fs_bioset);
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
__is_cp_guaranteed(struct page * page)53*4882a593Smuzhiyun static bool __is_cp_guaranteed(struct page *page)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	struct address_space *mapping = page->mapping;
56*4882a593Smuzhiyun 	struct inode *inode;
57*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	if (!mapping)
60*4882a593Smuzhiyun 		return false;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	inode = mapping->host;
63*4882a593Smuzhiyun 	sbi = F2FS_I_SB(inode);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	if (inode->i_ino == F2FS_META_INO(sbi) ||
66*4882a593Smuzhiyun 			inode->i_ino == F2FS_NODE_INO(sbi) ||
67*4882a593Smuzhiyun 			S_ISDIR(inode->i_mode))
68*4882a593Smuzhiyun 		return true;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	if (f2fs_is_compressed_page(page))
71*4882a593Smuzhiyun 		return false;
72*4882a593Smuzhiyun 	if ((S_ISREG(inode->i_mode) &&
73*4882a593Smuzhiyun 			(f2fs_is_atomic_file(inode) || IS_NOQUOTA(inode))) ||
74*4882a593Smuzhiyun 			page_private_gcing(page))
75*4882a593Smuzhiyun 		return true;
76*4882a593Smuzhiyun 	return false;
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
__read_io_type(struct page * page)79*4882a593Smuzhiyun static enum count_type __read_io_type(struct page *page)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun 	struct address_space *mapping = page_file_mapping(page);
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	if (mapping) {
84*4882a593Smuzhiyun 		struct inode *inode = mapping->host;
85*4882a593Smuzhiyun 		struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 		if (inode->i_ino == F2FS_META_INO(sbi))
88*4882a593Smuzhiyun 			return F2FS_RD_META;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 		if (inode->i_ino == F2FS_NODE_INO(sbi))
91*4882a593Smuzhiyun 			return F2FS_RD_NODE;
92*4882a593Smuzhiyun 	}
93*4882a593Smuzhiyun 	return F2FS_RD_DATA;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* postprocessing steps for read bios */
97*4882a593Smuzhiyun enum bio_post_read_step {
98*4882a593Smuzhiyun #ifdef CONFIG_FS_ENCRYPTION
99*4882a593Smuzhiyun 	STEP_DECRYPT	= 1 << 0,
100*4882a593Smuzhiyun #else
101*4882a593Smuzhiyun 	STEP_DECRYPT	= 0,	/* compile out the decryption-related code */
102*4882a593Smuzhiyun #endif
103*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
104*4882a593Smuzhiyun 	STEP_DECOMPRESS	= 1 << 1,
105*4882a593Smuzhiyun #else
106*4882a593Smuzhiyun 	STEP_DECOMPRESS	= 0,	/* compile out the decompression-related code */
107*4882a593Smuzhiyun #endif
108*4882a593Smuzhiyun #ifdef CONFIG_FS_VERITY
109*4882a593Smuzhiyun 	STEP_VERITY	= 1 << 2,
110*4882a593Smuzhiyun #else
111*4882a593Smuzhiyun 	STEP_VERITY	= 0,	/* compile out the verity-related code */
112*4882a593Smuzhiyun #endif
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun struct bio_post_read_ctx {
116*4882a593Smuzhiyun 	struct bio *bio;
117*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi;
118*4882a593Smuzhiyun 	struct work_struct work;
119*4882a593Smuzhiyun 	unsigned int enabled_steps;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
f2fs_finish_read_bio(struct bio * bio,bool in_task)122*4882a593Smuzhiyun static void f2fs_finish_read_bio(struct bio *bio, bool in_task)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun 	struct bio_vec *bv;
125*4882a593Smuzhiyun 	struct bvec_iter_all iter_all;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	/*
128*4882a593Smuzhiyun 	 * Update and unlock the bio's pagecache pages, and put the
129*4882a593Smuzhiyun 	 * decompression context for any compressed pages.
130*4882a593Smuzhiyun 	 */
131*4882a593Smuzhiyun 	bio_for_each_segment_all(bv, bio, iter_all) {
132*4882a593Smuzhiyun 		struct page *page = bv->bv_page;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 		if (f2fs_is_compressed_page(page)) {
135*4882a593Smuzhiyun 			if (bio->bi_status)
136*4882a593Smuzhiyun 				f2fs_end_read_compressed_page(page, true, 0,
137*4882a593Smuzhiyun 							in_task);
138*4882a593Smuzhiyun 			f2fs_put_page_dic(page, in_task);
139*4882a593Smuzhiyun 			continue;
140*4882a593Smuzhiyun 		}
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 		/* PG_error was set if decryption or verity failed. */
143*4882a593Smuzhiyun 		if (bio->bi_status || PageError(page)) {
144*4882a593Smuzhiyun 			ClearPageUptodate(page);
145*4882a593Smuzhiyun 			/* will re-read again later */
146*4882a593Smuzhiyun 			ClearPageError(page);
147*4882a593Smuzhiyun 		} else {
148*4882a593Smuzhiyun 			SetPageUptodate(page);
149*4882a593Smuzhiyun 		}
150*4882a593Smuzhiyun 		dec_page_count(F2FS_P_SB(page), __read_io_type(page));
151*4882a593Smuzhiyun 		unlock_page(page);
152*4882a593Smuzhiyun 	}
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	if (bio->bi_private)
155*4882a593Smuzhiyun 		mempool_free(bio->bi_private, bio_post_read_ctx_pool);
156*4882a593Smuzhiyun 	bio_put(bio);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
f2fs_verify_bio(struct work_struct * work)159*4882a593Smuzhiyun static void f2fs_verify_bio(struct work_struct *work)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	struct bio_post_read_ctx *ctx =
162*4882a593Smuzhiyun 		container_of(work, struct bio_post_read_ctx, work);
163*4882a593Smuzhiyun 	struct bio *bio = ctx->bio;
164*4882a593Smuzhiyun 	bool may_have_compressed_pages = (ctx->enabled_steps & STEP_DECOMPRESS);
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	/*
167*4882a593Smuzhiyun 	 * fsverity_verify_bio() may call readpages() again, and while verity
168*4882a593Smuzhiyun 	 * will be disabled for this, decryption and/or decompression may still
169*4882a593Smuzhiyun 	 * be needed, resulting in another bio_post_read_ctx being allocated.
170*4882a593Smuzhiyun 	 * So to prevent deadlocks we need to release the current ctx to the
171*4882a593Smuzhiyun 	 * mempool first.  This assumes that verity is the last post-read step.
172*4882a593Smuzhiyun 	 */
173*4882a593Smuzhiyun 	mempool_free(ctx, bio_post_read_ctx_pool);
174*4882a593Smuzhiyun 	bio->bi_private = NULL;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	/*
177*4882a593Smuzhiyun 	 * Verify the bio's pages with fs-verity.  Exclude compressed pages,
178*4882a593Smuzhiyun 	 * as those were handled separately by f2fs_end_read_compressed_page().
179*4882a593Smuzhiyun 	 */
180*4882a593Smuzhiyun 	if (may_have_compressed_pages) {
181*4882a593Smuzhiyun 		struct bio_vec *bv;
182*4882a593Smuzhiyun 		struct bvec_iter_all iter_all;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 		bio_for_each_segment_all(bv, bio, iter_all) {
185*4882a593Smuzhiyun 			struct page *page = bv->bv_page;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 			if (!f2fs_is_compressed_page(page) &&
188*4882a593Smuzhiyun 			    !PageError(page) && !fsverity_verify_page(page))
189*4882a593Smuzhiyun 				SetPageError(page);
190*4882a593Smuzhiyun 		}
191*4882a593Smuzhiyun 	} else {
192*4882a593Smuzhiyun 		fsverity_verify_bio(bio);
193*4882a593Smuzhiyun 	}
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	f2fs_finish_read_bio(bio, true);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /*
199*4882a593Smuzhiyun  * If the bio's data needs to be verified with fs-verity, then enqueue the
200*4882a593Smuzhiyun  * verity work for the bio.  Otherwise finish the bio now.
201*4882a593Smuzhiyun  *
202*4882a593Smuzhiyun  * Note that to avoid deadlocks, the verity work can't be done on the
203*4882a593Smuzhiyun  * decryption/decompression workqueue.  This is because verifying the data pages
204*4882a593Smuzhiyun  * can involve reading verity metadata pages from the file, and these verity
205*4882a593Smuzhiyun  * metadata pages may be encrypted and/or compressed.
206*4882a593Smuzhiyun  */
f2fs_verify_and_finish_bio(struct bio * bio,bool in_task)207*4882a593Smuzhiyun static void f2fs_verify_and_finish_bio(struct bio *bio, bool in_task)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun 	struct bio_post_read_ctx *ctx = bio->bi_private;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	if (ctx && (ctx->enabled_steps & STEP_VERITY)) {
212*4882a593Smuzhiyun 		INIT_WORK(&ctx->work, f2fs_verify_bio);
213*4882a593Smuzhiyun 		fsverity_enqueue_verify_work(&ctx->work);
214*4882a593Smuzhiyun 	} else {
215*4882a593Smuzhiyun 		f2fs_finish_read_bio(bio, in_task);
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun /*
220*4882a593Smuzhiyun  * Handle STEP_DECOMPRESS by decompressing any compressed clusters whose last
221*4882a593Smuzhiyun  * remaining page was read by @ctx->bio.
222*4882a593Smuzhiyun  *
223*4882a593Smuzhiyun  * Note that a bio may span clusters (even a mix of compressed and uncompressed
224*4882a593Smuzhiyun  * clusters) or be for just part of a cluster.  STEP_DECOMPRESS just indicates
225*4882a593Smuzhiyun  * that the bio includes at least one compressed page.  The actual decompression
226*4882a593Smuzhiyun  * is done on a per-cluster basis, not a per-bio basis.
227*4882a593Smuzhiyun  */
f2fs_handle_step_decompress(struct bio_post_read_ctx * ctx,bool in_task)228*4882a593Smuzhiyun static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx,
229*4882a593Smuzhiyun 		bool in_task)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	struct bio_vec *bv;
232*4882a593Smuzhiyun 	struct bvec_iter_all iter_all;
233*4882a593Smuzhiyun 	bool all_compressed = true;
234*4882a593Smuzhiyun 	block_t blkaddr = SECTOR_TO_BLOCK(ctx->bio->bi_iter.bi_sector);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	bio_for_each_segment_all(bv, ctx->bio, iter_all) {
237*4882a593Smuzhiyun 		struct page *page = bv->bv_page;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 		/* PG_error was set if decryption failed. */
240*4882a593Smuzhiyun 		if (f2fs_is_compressed_page(page))
241*4882a593Smuzhiyun 			f2fs_end_read_compressed_page(page, PageError(page),
242*4882a593Smuzhiyun 						blkaddr, in_task);
243*4882a593Smuzhiyun 		else
244*4882a593Smuzhiyun 			all_compressed = false;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 		blkaddr++;
247*4882a593Smuzhiyun 	}
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	/*
250*4882a593Smuzhiyun 	 * Optimization: if all the bio's pages are compressed, then scheduling
251*4882a593Smuzhiyun 	 * the per-bio verity work is unnecessary, as verity will be fully
252*4882a593Smuzhiyun 	 * handled at the compression cluster level.
253*4882a593Smuzhiyun 	 */
254*4882a593Smuzhiyun 	if (all_compressed)
255*4882a593Smuzhiyun 		ctx->enabled_steps &= ~STEP_VERITY;
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
f2fs_post_read_work(struct work_struct * work)258*4882a593Smuzhiyun static void f2fs_post_read_work(struct work_struct *work)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun 	struct bio_post_read_ctx *ctx =
261*4882a593Smuzhiyun 		container_of(work, struct bio_post_read_ctx, work);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	if (ctx->enabled_steps & STEP_DECRYPT)
264*4882a593Smuzhiyun 		fscrypt_decrypt_bio(ctx->bio);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	if (ctx->enabled_steps & STEP_DECOMPRESS)
267*4882a593Smuzhiyun 		f2fs_handle_step_decompress(ctx, true);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	f2fs_verify_and_finish_bio(ctx->bio, true);
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
f2fs_read_end_io(struct bio * bio)272*4882a593Smuzhiyun static void f2fs_read_end_io(struct bio *bio)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_P_SB(bio_first_page_all(bio));
275*4882a593Smuzhiyun 	struct bio_post_read_ctx *ctx = bio->bi_private;
276*4882a593Smuzhiyun 	bool intask = in_task();
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	if (time_to_inject(sbi, FAULT_READ_IO)) {
279*4882a593Smuzhiyun 		f2fs_show_injection_info(sbi, FAULT_READ_IO);
280*4882a593Smuzhiyun 		bio->bi_status = BLK_STS_IOERR;
281*4882a593Smuzhiyun 	}
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	if (bio->bi_status) {
284*4882a593Smuzhiyun 		f2fs_finish_read_bio(bio, intask);
285*4882a593Smuzhiyun 		return;
286*4882a593Smuzhiyun 	}
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	if (ctx) {
289*4882a593Smuzhiyun 		unsigned int enabled_steps = ctx->enabled_steps &
290*4882a593Smuzhiyun 					(STEP_DECRYPT | STEP_DECOMPRESS);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 		/*
293*4882a593Smuzhiyun 		 * If we have only decompression step between decompression and
294*4882a593Smuzhiyun 		 * decrypt, we don't need post processing for this.
295*4882a593Smuzhiyun 		 */
296*4882a593Smuzhiyun 		if (enabled_steps == STEP_DECOMPRESS &&
297*4882a593Smuzhiyun 				!f2fs_low_mem_mode(sbi)) {
298*4882a593Smuzhiyun 			f2fs_handle_step_decompress(ctx, intask);
299*4882a593Smuzhiyun 		} else if (enabled_steps) {
300*4882a593Smuzhiyun 			INIT_WORK(&ctx->work, f2fs_post_read_work);
301*4882a593Smuzhiyun 			queue_work(ctx->sbi->post_read_wq, &ctx->work);
302*4882a593Smuzhiyun 			return;
303*4882a593Smuzhiyun 		}
304*4882a593Smuzhiyun 	}
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	f2fs_verify_and_finish_bio(bio, intask);
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun 
f2fs_write_end_io(struct bio * bio)309*4882a593Smuzhiyun static void f2fs_write_end_io(struct bio *bio)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = bio->bi_private;
312*4882a593Smuzhiyun 	struct bio_vec *bvec;
313*4882a593Smuzhiyun 	struct bvec_iter_all iter_all;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	if (time_to_inject(sbi, FAULT_WRITE_IO)) {
316*4882a593Smuzhiyun 		f2fs_show_injection_info(sbi, FAULT_WRITE_IO);
317*4882a593Smuzhiyun 		bio->bi_status = BLK_STS_IOERR;
318*4882a593Smuzhiyun 	}
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	bio_for_each_segment_all(bvec, bio, iter_all) {
321*4882a593Smuzhiyun 		struct page *page = bvec->bv_page;
322*4882a593Smuzhiyun 		enum count_type type = WB_DATA_TYPE(page);
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 		if (page_private_dummy(page)) {
325*4882a593Smuzhiyun 			clear_page_private_dummy(page);
326*4882a593Smuzhiyun 			unlock_page(page);
327*4882a593Smuzhiyun 			mempool_free(page, sbi->write_io_dummy);
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 			if (unlikely(bio->bi_status))
330*4882a593Smuzhiyun 				f2fs_stop_checkpoint(sbi, true,
331*4882a593Smuzhiyun 						STOP_CP_REASON_WRITE_FAIL);
332*4882a593Smuzhiyun 			continue;
333*4882a593Smuzhiyun 		}
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 		fscrypt_finalize_bounce_page(&page);
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
338*4882a593Smuzhiyun 		if (f2fs_is_compressed_page(page)) {
339*4882a593Smuzhiyun 			f2fs_compress_write_end_io(bio, page);
340*4882a593Smuzhiyun 			continue;
341*4882a593Smuzhiyun 		}
342*4882a593Smuzhiyun #endif
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		if (unlikely(bio->bi_status)) {
345*4882a593Smuzhiyun 			mapping_set_error(page->mapping, -EIO);
346*4882a593Smuzhiyun 			if (type == F2FS_WB_CP_DATA)
347*4882a593Smuzhiyun 				f2fs_stop_checkpoint(sbi, true,
348*4882a593Smuzhiyun 						STOP_CP_REASON_WRITE_FAIL);
349*4882a593Smuzhiyun 		}
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 		f2fs_bug_on(sbi, page->mapping == NODE_MAPPING(sbi) &&
352*4882a593Smuzhiyun 					page->index != nid_of_node(page));
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 		dec_page_count(sbi, type);
355*4882a593Smuzhiyun 		if (f2fs_in_warm_node_list(sbi, page))
356*4882a593Smuzhiyun 			f2fs_del_fsync_node_entry(sbi, page);
357*4882a593Smuzhiyun 		clear_page_private_gcing(page);
358*4882a593Smuzhiyun 		end_page_writeback(page);
359*4882a593Smuzhiyun 	}
360*4882a593Smuzhiyun 	if (!get_pages(sbi, F2FS_WB_CP_DATA) &&
361*4882a593Smuzhiyun 				wq_has_sleeper(&sbi->cp_wait))
362*4882a593Smuzhiyun 		wake_up(&sbi->cp_wait);
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	bio_put(bio);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
f2fs_target_device(struct f2fs_sb_info * sbi,block_t blk_addr,struct bio * bio)367*4882a593Smuzhiyun struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi,
368*4882a593Smuzhiyun 				block_t blk_addr, struct bio *bio)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun 	struct block_device *bdev = sbi->sb->s_bdev;
371*4882a593Smuzhiyun 	int i;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	if (f2fs_is_multi_device(sbi)) {
374*4882a593Smuzhiyun 		for (i = 0; i < sbi->s_ndevs; i++) {
375*4882a593Smuzhiyun 			if (FDEV(i).start_blk <= blk_addr &&
376*4882a593Smuzhiyun 			    FDEV(i).end_blk >= blk_addr) {
377*4882a593Smuzhiyun 				blk_addr -= FDEV(i).start_blk;
378*4882a593Smuzhiyun 				bdev = FDEV(i).bdev;
379*4882a593Smuzhiyun 				break;
380*4882a593Smuzhiyun 			}
381*4882a593Smuzhiyun 		}
382*4882a593Smuzhiyun 	}
383*4882a593Smuzhiyun 	if (bio) {
384*4882a593Smuzhiyun 		bio_set_dev(bio, bdev);
385*4882a593Smuzhiyun 		bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(blk_addr);
386*4882a593Smuzhiyun 	}
387*4882a593Smuzhiyun 	return bdev;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
f2fs_target_device_index(struct f2fs_sb_info * sbi,block_t blkaddr)390*4882a593Smuzhiyun int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	int i;
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	if (!f2fs_is_multi_device(sbi))
395*4882a593Smuzhiyun 		return 0;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	for (i = 0; i < sbi->s_ndevs; i++)
398*4882a593Smuzhiyun 		if (FDEV(i).start_blk <= blkaddr && FDEV(i).end_blk >= blkaddr)
399*4882a593Smuzhiyun 			return i;
400*4882a593Smuzhiyun 	return 0;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun /*
404*4882a593Smuzhiyun  * Return true, if pre_bio's bdev is same as its target device.
405*4882a593Smuzhiyun  */
__same_bdev(struct f2fs_sb_info * sbi,block_t blk_addr,struct bio * bio)406*4882a593Smuzhiyun static bool __same_bdev(struct f2fs_sb_info *sbi,
407*4882a593Smuzhiyun 				block_t blk_addr, struct bio *bio)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun 	struct block_device *b = f2fs_target_device(sbi, blk_addr, NULL);
410*4882a593Smuzhiyun 	return bio->bi_disk == b->bd_disk && bio->bi_partno == b->bd_partno;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun 
__bio_alloc(struct f2fs_io_info * fio,int npages)413*4882a593Smuzhiyun static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = fio->sbi;
416*4882a593Smuzhiyun 	struct bio *bio;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	bio = bio_alloc_bioset(GFP_NOIO, npages, &f2fs_bioset);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	f2fs_target_device(sbi, fio->new_blkaddr, bio);
421*4882a593Smuzhiyun 	if (is_read_io(fio->op)) {
422*4882a593Smuzhiyun 		bio->bi_end_io = f2fs_read_end_io;
423*4882a593Smuzhiyun 		bio->bi_private = NULL;
424*4882a593Smuzhiyun 	} else {
425*4882a593Smuzhiyun 		bio->bi_end_io = f2fs_write_end_io;
426*4882a593Smuzhiyun 		bio->bi_private = sbi;
427*4882a593Smuzhiyun 		bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi,
428*4882a593Smuzhiyun 						fio->type, fio->temp);
429*4882a593Smuzhiyun 	}
430*4882a593Smuzhiyun 	if (fio->io_wbc)
431*4882a593Smuzhiyun 		wbc_init_bio(fio->io_wbc, bio);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	return bio;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun 
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)436*4882a593Smuzhiyun static void f2fs_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
437*4882a593Smuzhiyun 				  pgoff_t first_idx,
438*4882a593Smuzhiyun 				  const struct f2fs_io_info *fio,
439*4882a593Smuzhiyun 				  gfp_t gfp_mask)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun 	/*
442*4882a593Smuzhiyun 	 * The f2fs garbage collector sets ->encrypted_page when it wants to
443*4882a593Smuzhiyun 	 * read/write raw data without encryption.
444*4882a593Smuzhiyun 	 */
445*4882a593Smuzhiyun 	if (!fio || !fio->encrypted_page)
446*4882a593Smuzhiyun 		fscrypt_set_bio_crypt_ctx(bio, inode, first_idx, gfp_mask);
447*4882a593Smuzhiyun 	else if (fscrypt_inode_should_skip_dm_default_key(inode))
448*4882a593Smuzhiyun 		bio_set_skip_dm_default_key(bio);
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun 
f2fs_crypt_mergeable_bio(struct bio * bio,const struct inode * inode,pgoff_t next_idx,const struct f2fs_io_info * fio)451*4882a593Smuzhiyun static bool f2fs_crypt_mergeable_bio(struct bio *bio, const struct inode *inode,
452*4882a593Smuzhiyun 				     pgoff_t next_idx,
453*4882a593Smuzhiyun 				     const struct f2fs_io_info *fio)
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun 	/*
456*4882a593Smuzhiyun 	 * The f2fs garbage collector sets ->encrypted_page when it wants to
457*4882a593Smuzhiyun 	 * read/write raw data without encryption.
458*4882a593Smuzhiyun 	 */
459*4882a593Smuzhiyun 	if (fio && fio->encrypted_page)
460*4882a593Smuzhiyun 		return !bio_has_crypt_ctx(bio) &&
461*4882a593Smuzhiyun 			(bio_should_skip_dm_default_key(bio) ==
462*4882a593Smuzhiyun 			 fscrypt_inode_should_skip_dm_default_key(inode));
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	return fscrypt_mergeable_bio(bio, inode, next_idx);
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun 
__submit_bio(struct f2fs_sb_info * sbi,struct bio * bio,enum page_type type)467*4882a593Smuzhiyun static inline void __submit_bio(struct f2fs_sb_info *sbi,
468*4882a593Smuzhiyun 				struct bio *bio, enum page_type type)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	if (!is_read_io(bio_op(bio))) {
471*4882a593Smuzhiyun 		unsigned int start;
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 		if (type != DATA && type != NODE)
474*4882a593Smuzhiyun 			goto submit_io;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 		if (f2fs_lfs_mode(sbi) && current->plug)
477*4882a593Smuzhiyun 			blk_finish_plug(current->plug);
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 		if (!F2FS_IO_ALIGNED(sbi))
480*4882a593Smuzhiyun 			goto submit_io;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 		start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;
483*4882a593Smuzhiyun 		start %= F2FS_IO_SIZE(sbi);
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 		if (start == 0)
486*4882a593Smuzhiyun 			goto submit_io;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 		/* fill dummy pages */
489*4882a593Smuzhiyun 		for (; start < F2FS_IO_SIZE(sbi); start++) {
490*4882a593Smuzhiyun 			struct page *page =
491*4882a593Smuzhiyun 				mempool_alloc(sbi->write_io_dummy,
492*4882a593Smuzhiyun 					      GFP_NOIO | __GFP_NOFAIL);
493*4882a593Smuzhiyun 			f2fs_bug_on(sbi, !page);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 			lock_page(page);
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 			zero_user_segment(page, 0, PAGE_SIZE);
498*4882a593Smuzhiyun 			set_page_private_dummy(page);
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 			if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
501*4882a593Smuzhiyun 				f2fs_bug_on(sbi, 1);
502*4882a593Smuzhiyun 		}
503*4882a593Smuzhiyun 		/*
504*4882a593Smuzhiyun 		 * In the NODE case, we lose next block address chain. So, we
505*4882a593Smuzhiyun 		 * need to do checkpoint in f2fs_sync_file.
506*4882a593Smuzhiyun 		 */
507*4882a593Smuzhiyun 		if (type == NODE)
508*4882a593Smuzhiyun 			set_sbi_flag(sbi, SBI_NEED_CP);
509*4882a593Smuzhiyun 	}
510*4882a593Smuzhiyun submit_io:
511*4882a593Smuzhiyun 	if (is_read_io(bio_op(bio)))
512*4882a593Smuzhiyun 		trace_f2fs_submit_read_bio(sbi->sb, type, bio);
513*4882a593Smuzhiyun 	else
514*4882a593Smuzhiyun 		trace_f2fs_submit_write_bio(sbi->sb, type, bio);
515*4882a593Smuzhiyun 	submit_bio(bio);
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun 
f2fs_submit_bio(struct f2fs_sb_info * sbi,struct bio * bio,enum page_type type)518*4882a593Smuzhiyun void f2fs_submit_bio(struct f2fs_sb_info *sbi,
519*4882a593Smuzhiyun 				struct bio *bio, enum page_type type)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun 	__submit_bio(sbi, bio, type);
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun 
__attach_io_flag(struct f2fs_io_info * fio)524*4882a593Smuzhiyun static void __attach_io_flag(struct f2fs_io_info *fio)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = fio->sbi;
527*4882a593Smuzhiyun 	unsigned int temp_mask = (1 << NR_TEMP_TYPE) - 1;
528*4882a593Smuzhiyun 	unsigned int io_flag, fua_flag, meta_flag;
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	if (fio->type == DATA)
531*4882a593Smuzhiyun 		io_flag = sbi->data_io_flag;
532*4882a593Smuzhiyun 	else if (fio->type == NODE)
533*4882a593Smuzhiyun 		io_flag = sbi->node_io_flag;
534*4882a593Smuzhiyun 	else
535*4882a593Smuzhiyun 		return;
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	fua_flag = io_flag & temp_mask;
538*4882a593Smuzhiyun 	meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	/*
541*4882a593Smuzhiyun 	 * data/node io flag bits per temp:
542*4882a593Smuzhiyun 	 *      REQ_META     |      REQ_FUA      |
543*4882a593Smuzhiyun 	 *    5 |    4 |   3 |    2 |    1 |   0 |
544*4882a593Smuzhiyun 	 * Cold | Warm | Hot | Cold | Warm | Hot |
545*4882a593Smuzhiyun 	 */
546*4882a593Smuzhiyun 	if ((1 << fio->temp) & meta_flag)
547*4882a593Smuzhiyun 		fio->op_flags |= REQ_META;
548*4882a593Smuzhiyun 	if ((1 << fio->temp) & fua_flag)
549*4882a593Smuzhiyun 		fio->op_flags |= REQ_FUA;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
__submit_merged_bio(struct f2fs_bio_info * io)552*4882a593Smuzhiyun static void __submit_merged_bio(struct f2fs_bio_info *io)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun 	struct f2fs_io_info *fio = &io->fio;
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 	if (!io->bio)
557*4882a593Smuzhiyun 		return;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	__attach_io_flag(fio);
560*4882a593Smuzhiyun 	bio_set_op_attrs(io->bio, fio->op, fio->op_flags);
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	if (is_read_io(fio->op))
563*4882a593Smuzhiyun 		trace_f2fs_prepare_read_bio(io->sbi->sb, fio->type, io->bio);
564*4882a593Smuzhiyun 	else
565*4882a593Smuzhiyun 		trace_f2fs_prepare_write_bio(io->sbi->sb, fio->type, io->bio);
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	__submit_bio(io->sbi, io->bio, fio->type);
568*4882a593Smuzhiyun 	io->bio = NULL;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun 
__has_merged_page(struct bio * bio,struct inode * inode,struct page * page,nid_t ino)571*4882a593Smuzhiyun static bool __has_merged_page(struct bio *bio, struct inode *inode,
572*4882a593Smuzhiyun 						struct page *page, nid_t ino)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun 	struct bio_vec *bvec;
575*4882a593Smuzhiyun 	struct bvec_iter_all iter_all;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	if (!bio)
578*4882a593Smuzhiyun 		return false;
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	if (!inode && !page && !ino)
581*4882a593Smuzhiyun 		return true;
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	bio_for_each_segment_all(bvec, bio, iter_all) {
584*4882a593Smuzhiyun 		struct page *target = bvec->bv_page;
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 		if (fscrypt_is_bounce_page(target)) {
587*4882a593Smuzhiyun 			target = fscrypt_pagecache_page(target);
588*4882a593Smuzhiyun 			if (IS_ERR(target))
589*4882a593Smuzhiyun 				continue;
590*4882a593Smuzhiyun 		}
591*4882a593Smuzhiyun 		if (f2fs_is_compressed_page(target)) {
592*4882a593Smuzhiyun 			target = f2fs_compress_control_page(target);
593*4882a593Smuzhiyun 			if (IS_ERR(target))
594*4882a593Smuzhiyun 				continue;
595*4882a593Smuzhiyun 		}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 		if (inode && inode == target->mapping->host)
598*4882a593Smuzhiyun 			return true;
599*4882a593Smuzhiyun 		if (page && page == target)
600*4882a593Smuzhiyun 			return true;
601*4882a593Smuzhiyun 		if (ino && ino == ino_of_node(target))
602*4882a593Smuzhiyun 			return true;
603*4882a593Smuzhiyun 	}
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	return false;
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun 
__f2fs_submit_merged_write(struct f2fs_sb_info * sbi,enum page_type type,enum temp_type temp)608*4882a593Smuzhiyun static void __f2fs_submit_merged_write(struct f2fs_sb_info *sbi,
609*4882a593Smuzhiyun 				enum page_type type, enum temp_type temp)
610*4882a593Smuzhiyun {
611*4882a593Smuzhiyun 	enum page_type btype = PAGE_TYPE_OF_BIO(type);
612*4882a593Smuzhiyun 	struct f2fs_bio_info *io = sbi->write_io[btype] + temp;
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun 	f2fs_down_write(&io->io_rwsem);
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	/* change META to META_FLUSH in the checkpoint procedure */
617*4882a593Smuzhiyun 	if (type >= META_FLUSH) {
618*4882a593Smuzhiyun 		io->fio.type = META_FLUSH;
619*4882a593Smuzhiyun 		io->fio.op = REQ_OP_WRITE;
620*4882a593Smuzhiyun 		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
621*4882a593Smuzhiyun 		if (!test_opt(sbi, NOBARRIER))
622*4882a593Smuzhiyun 			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
623*4882a593Smuzhiyun 	}
624*4882a593Smuzhiyun 	__submit_merged_bio(io);
625*4882a593Smuzhiyun 	f2fs_up_write(&io->io_rwsem);
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun 
__submit_merged_write_cond(struct f2fs_sb_info * sbi,struct inode * inode,struct page * page,nid_t ino,enum page_type type,bool force)628*4882a593Smuzhiyun static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
629*4882a593Smuzhiyun 				struct inode *inode, struct page *page,
630*4882a593Smuzhiyun 				nid_t ino, enum page_type type, bool force)
631*4882a593Smuzhiyun {
632*4882a593Smuzhiyun 	enum temp_type temp;
633*4882a593Smuzhiyun 	bool ret = true;
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun 	for (temp = HOT; temp < NR_TEMP_TYPE; temp++) {
636*4882a593Smuzhiyun 		if (!force)	{
637*4882a593Smuzhiyun 			enum page_type btype = PAGE_TYPE_OF_BIO(type);
638*4882a593Smuzhiyun 			struct f2fs_bio_info *io = sbi->write_io[btype] + temp;
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 			f2fs_down_read(&io->io_rwsem);
641*4882a593Smuzhiyun 			ret = __has_merged_page(io->bio, inode, page, ino);
642*4882a593Smuzhiyun 			f2fs_up_read(&io->io_rwsem);
643*4882a593Smuzhiyun 		}
644*4882a593Smuzhiyun 		if (ret)
645*4882a593Smuzhiyun 			__f2fs_submit_merged_write(sbi, type, temp);
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun 		/* TODO: use HOT temp only for meta pages now. */
648*4882a593Smuzhiyun 		if (type >= META)
649*4882a593Smuzhiyun 			break;
650*4882a593Smuzhiyun 	}
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun 
f2fs_submit_merged_write(struct f2fs_sb_info * sbi,enum page_type type)653*4882a593Smuzhiyun void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type)
654*4882a593Smuzhiyun {
655*4882a593Smuzhiyun 	__submit_merged_write_cond(sbi, NULL, NULL, 0, type, true);
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun 
f2fs_submit_merged_write_cond(struct f2fs_sb_info * sbi,struct inode * inode,struct page * page,nid_t ino,enum page_type type)658*4882a593Smuzhiyun void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
659*4882a593Smuzhiyun 				struct inode *inode, struct page *page,
660*4882a593Smuzhiyun 				nid_t ino, enum page_type type)
661*4882a593Smuzhiyun {
662*4882a593Smuzhiyun 	__submit_merged_write_cond(sbi, inode, page, ino, type, false);
663*4882a593Smuzhiyun }
664*4882a593Smuzhiyun 
f2fs_flush_merged_writes(struct f2fs_sb_info * sbi)665*4882a593Smuzhiyun void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi)
666*4882a593Smuzhiyun {
667*4882a593Smuzhiyun 	f2fs_submit_merged_write(sbi, DATA);
668*4882a593Smuzhiyun 	f2fs_submit_merged_write(sbi, NODE);
669*4882a593Smuzhiyun 	f2fs_submit_merged_write(sbi, META);
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun /*
673*4882a593Smuzhiyun  * Fill the locked page with data located in the block address.
674*4882a593Smuzhiyun  * A caller needs to unlock the page on failure.
675*4882a593Smuzhiyun  */
f2fs_submit_page_bio(struct f2fs_io_info * fio)676*4882a593Smuzhiyun int f2fs_submit_page_bio(struct f2fs_io_info *fio)
677*4882a593Smuzhiyun {
678*4882a593Smuzhiyun 	struct bio *bio;
679*4882a593Smuzhiyun 	struct page *page = fio->encrypted_page ?
680*4882a593Smuzhiyun 			fio->encrypted_page : fio->page;
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
683*4882a593Smuzhiyun 			fio->is_por ? META_POR : (__is_meta_io(fio) ?
684*4882a593Smuzhiyun 			META_GENERIC : DATA_GENERIC_ENHANCE)))
685*4882a593Smuzhiyun 		return -EFSCORRUPTED;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 	trace_f2fs_submit_page_bio(page, fio);
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 	/* Allocate a new bio */
690*4882a593Smuzhiyun 	bio = __bio_alloc(fio, 1);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
693*4882a593Smuzhiyun 			       fio->page->index, fio, GFP_NOIO);
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
696*4882a593Smuzhiyun 		bio_put(bio);
697*4882a593Smuzhiyun 		return -EFAULT;
698*4882a593Smuzhiyun 	}
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	if (fio->io_wbc && !is_read_io(fio->op))
701*4882a593Smuzhiyun 		wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun 	__attach_io_flag(fio);
704*4882a593Smuzhiyun 	bio_set_op_attrs(bio, fio->op, fio->op_flags);
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	inc_page_count(fio->sbi, is_read_io(fio->op) ?
707*4882a593Smuzhiyun 			__read_io_type(page): WB_DATA_TYPE(fio->page));
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	__submit_bio(fio->sbi, bio, fio->type);
710*4882a593Smuzhiyun 	return 0;
711*4882a593Smuzhiyun }
712*4882a593Smuzhiyun 
page_is_mergeable(struct f2fs_sb_info * sbi,struct bio * bio,block_t last_blkaddr,block_t cur_blkaddr)713*4882a593Smuzhiyun static bool page_is_mergeable(struct f2fs_sb_info *sbi, struct bio *bio,
714*4882a593Smuzhiyun 				block_t last_blkaddr, block_t cur_blkaddr)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	if (unlikely(sbi->max_io_bytes &&
717*4882a593Smuzhiyun 			bio->bi_iter.bi_size >= sbi->max_io_bytes))
718*4882a593Smuzhiyun 		return false;
719*4882a593Smuzhiyun 	if (last_blkaddr + 1 != cur_blkaddr)
720*4882a593Smuzhiyun 		return false;
721*4882a593Smuzhiyun 	return __same_bdev(sbi, cur_blkaddr, bio);
722*4882a593Smuzhiyun }
723*4882a593Smuzhiyun 
io_type_is_mergeable(struct f2fs_bio_info * io,struct f2fs_io_info * fio)724*4882a593Smuzhiyun static bool io_type_is_mergeable(struct f2fs_bio_info *io,
725*4882a593Smuzhiyun 						struct f2fs_io_info *fio)
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun 	if (io->fio.op != fio->op)
728*4882a593Smuzhiyun 		return false;
729*4882a593Smuzhiyun 	return io->fio.op_flags == fio->op_flags;
730*4882a593Smuzhiyun }
731*4882a593Smuzhiyun 
io_is_mergeable(struct f2fs_sb_info * sbi,struct bio * bio,struct f2fs_bio_info * io,struct f2fs_io_info * fio,block_t last_blkaddr,block_t cur_blkaddr)732*4882a593Smuzhiyun static bool io_is_mergeable(struct f2fs_sb_info *sbi, struct bio *bio,
733*4882a593Smuzhiyun 					struct f2fs_bio_info *io,
734*4882a593Smuzhiyun 					struct f2fs_io_info *fio,
735*4882a593Smuzhiyun 					block_t last_blkaddr,
736*4882a593Smuzhiyun 					block_t cur_blkaddr)
737*4882a593Smuzhiyun {
738*4882a593Smuzhiyun 	if (F2FS_IO_ALIGNED(sbi) && (fio->type == DATA || fio->type == NODE)) {
739*4882a593Smuzhiyun 		unsigned int filled_blocks =
740*4882a593Smuzhiyun 				F2FS_BYTES_TO_BLK(bio->bi_iter.bi_size);
741*4882a593Smuzhiyun 		unsigned int io_size = F2FS_IO_SIZE(sbi);
742*4882a593Smuzhiyun 		unsigned int left_vecs = bio->bi_max_vecs - bio->bi_vcnt;
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 		/* IOs in bio is aligned and left space of vectors is not enough */
745*4882a593Smuzhiyun 		if (!(filled_blocks % io_size) && left_vecs < io_size)
746*4882a593Smuzhiyun 			return false;
747*4882a593Smuzhiyun 	}
748*4882a593Smuzhiyun 	if (!page_is_mergeable(sbi, bio, last_blkaddr, cur_blkaddr))
749*4882a593Smuzhiyun 		return false;
750*4882a593Smuzhiyun 	return io_type_is_mergeable(io, fio);
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun 
add_bio_entry(struct f2fs_sb_info * sbi,struct bio * bio,struct page * page,enum temp_type temp)753*4882a593Smuzhiyun static void add_bio_entry(struct f2fs_sb_info *sbi, struct bio *bio,
754*4882a593Smuzhiyun 				struct page *page, enum temp_type temp)
755*4882a593Smuzhiyun {
756*4882a593Smuzhiyun 	struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
757*4882a593Smuzhiyun 	struct bio_entry *be;
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 	be = f2fs_kmem_cache_alloc(bio_entry_slab, GFP_NOFS);
760*4882a593Smuzhiyun 	be->bio = bio;
761*4882a593Smuzhiyun 	bio_get(bio);
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	if (bio_add_page(bio, page, PAGE_SIZE, 0) != PAGE_SIZE)
764*4882a593Smuzhiyun 		f2fs_bug_on(sbi, 1);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	f2fs_down_write(&io->bio_list_lock);
767*4882a593Smuzhiyun 	list_add_tail(&be->list, &io->bio_list);
768*4882a593Smuzhiyun 	f2fs_up_write(&io->bio_list_lock);
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun 
del_bio_entry(struct bio_entry * be)771*4882a593Smuzhiyun static void del_bio_entry(struct bio_entry *be)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun 	list_del(&be->list);
774*4882a593Smuzhiyun 	kmem_cache_free(bio_entry_slab, be);
775*4882a593Smuzhiyun }
776*4882a593Smuzhiyun 
add_ipu_page(struct f2fs_io_info * fio,struct bio ** bio,struct page * page)777*4882a593Smuzhiyun static int add_ipu_page(struct f2fs_io_info *fio, struct bio **bio,
778*4882a593Smuzhiyun 							struct page *page)
779*4882a593Smuzhiyun {
780*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = fio->sbi;
781*4882a593Smuzhiyun 	enum temp_type temp;
782*4882a593Smuzhiyun 	bool found = false;
783*4882a593Smuzhiyun 	int ret = -EAGAIN;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
786*4882a593Smuzhiyun 		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
787*4882a593Smuzhiyun 		struct list_head *head = &io->bio_list;
788*4882a593Smuzhiyun 		struct bio_entry *be;
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun 		f2fs_down_write(&io->bio_list_lock);
791*4882a593Smuzhiyun 		list_for_each_entry(be, head, list) {
792*4882a593Smuzhiyun 			if (be->bio != *bio)
793*4882a593Smuzhiyun 				continue;
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 			found = true;
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 			f2fs_bug_on(sbi, !page_is_mergeable(sbi, *bio,
798*4882a593Smuzhiyun 							    *fio->last_block,
799*4882a593Smuzhiyun 							    fio->new_blkaddr));
800*4882a593Smuzhiyun 			if (f2fs_crypt_mergeable_bio(*bio,
801*4882a593Smuzhiyun 					fio->page->mapping->host,
802*4882a593Smuzhiyun 					fio->page->index, fio) &&
803*4882a593Smuzhiyun 			    bio_add_page(*bio, page, PAGE_SIZE, 0) ==
804*4882a593Smuzhiyun 					PAGE_SIZE) {
805*4882a593Smuzhiyun 				ret = 0;
806*4882a593Smuzhiyun 				break;
807*4882a593Smuzhiyun 			}
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 			/* page can't be merged into bio; submit the bio */
810*4882a593Smuzhiyun 			del_bio_entry(be);
811*4882a593Smuzhiyun 			__submit_bio(sbi, *bio, DATA);
812*4882a593Smuzhiyun 			break;
813*4882a593Smuzhiyun 		}
814*4882a593Smuzhiyun 		f2fs_up_write(&io->bio_list_lock);
815*4882a593Smuzhiyun 	}
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	if (ret) {
818*4882a593Smuzhiyun 		bio_put(*bio);
819*4882a593Smuzhiyun 		*bio = NULL;
820*4882a593Smuzhiyun 	}
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	return ret;
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun 
f2fs_submit_merged_ipu_write(struct f2fs_sb_info * sbi,struct bio ** bio,struct page * page)825*4882a593Smuzhiyun void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi,
826*4882a593Smuzhiyun 					struct bio **bio, struct page *page)
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun 	enum temp_type temp;
829*4882a593Smuzhiyun 	bool found = false;
830*4882a593Smuzhiyun 	struct bio *target = bio ? *bio : NULL;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
833*4882a593Smuzhiyun 		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
834*4882a593Smuzhiyun 		struct list_head *head = &io->bio_list;
835*4882a593Smuzhiyun 		struct bio_entry *be;
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 		if (list_empty(head))
838*4882a593Smuzhiyun 			continue;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 		f2fs_down_read(&io->bio_list_lock);
841*4882a593Smuzhiyun 		list_for_each_entry(be, head, list) {
842*4882a593Smuzhiyun 			if (target)
843*4882a593Smuzhiyun 				found = (target == be->bio);
844*4882a593Smuzhiyun 			else
845*4882a593Smuzhiyun 				found = __has_merged_page(be->bio, NULL,
846*4882a593Smuzhiyun 								page, 0);
847*4882a593Smuzhiyun 			if (found)
848*4882a593Smuzhiyun 				break;
849*4882a593Smuzhiyun 		}
850*4882a593Smuzhiyun 		f2fs_up_read(&io->bio_list_lock);
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun 		if (!found)
853*4882a593Smuzhiyun 			continue;
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun 		found = false;
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun 		f2fs_down_write(&io->bio_list_lock);
858*4882a593Smuzhiyun 		list_for_each_entry(be, head, list) {
859*4882a593Smuzhiyun 			if (target)
860*4882a593Smuzhiyun 				found = (target == be->bio);
861*4882a593Smuzhiyun 			else
862*4882a593Smuzhiyun 				found = __has_merged_page(be->bio, NULL,
863*4882a593Smuzhiyun 								page, 0);
864*4882a593Smuzhiyun 			if (found) {
865*4882a593Smuzhiyun 				target = be->bio;
866*4882a593Smuzhiyun 				del_bio_entry(be);
867*4882a593Smuzhiyun 				break;
868*4882a593Smuzhiyun 			}
869*4882a593Smuzhiyun 		}
870*4882a593Smuzhiyun 		f2fs_up_write(&io->bio_list_lock);
871*4882a593Smuzhiyun 	}
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	if (found)
874*4882a593Smuzhiyun 		__submit_bio(sbi, target, DATA);
875*4882a593Smuzhiyun 	if (bio && *bio) {
876*4882a593Smuzhiyun 		bio_put(*bio);
877*4882a593Smuzhiyun 		*bio = NULL;
878*4882a593Smuzhiyun 	}
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun 
f2fs_merge_page_bio(struct f2fs_io_info * fio)881*4882a593Smuzhiyun int f2fs_merge_page_bio(struct f2fs_io_info *fio)
882*4882a593Smuzhiyun {
883*4882a593Smuzhiyun 	struct bio *bio = *fio->bio;
884*4882a593Smuzhiyun 	struct page *page = fio->encrypted_page ?
885*4882a593Smuzhiyun 			fio->encrypted_page : fio->page;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
888*4882a593Smuzhiyun 			__is_meta_io(fio) ? META_GENERIC : DATA_GENERIC))
889*4882a593Smuzhiyun 		return -EFSCORRUPTED;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	trace_f2fs_submit_page_bio(page, fio);
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun 	if (bio && !page_is_mergeable(fio->sbi, bio, *fio->last_block,
894*4882a593Smuzhiyun 						fio->new_blkaddr))
895*4882a593Smuzhiyun 		f2fs_submit_merged_ipu_write(fio->sbi, &bio, NULL);
896*4882a593Smuzhiyun alloc_new:
897*4882a593Smuzhiyun 	if (!bio) {
898*4882a593Smuzhiyun 		bio = __bio_alloc(fio, BIO_MAX_PAGES);
899*4882a593Smuzhiyun 		__attach_io_flag(fio);
900*4882a593Smuzhiyun 		f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
901*4882a593Smuzhiyun 				       fio->page->index, fio, GFP_NOIO);
902*4882a593Smuzhiyun 		bio_set_op_attrs(bio, fio->op, fio->op_flags);
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 		add_bio_entry(fio->sbi, bio, page, fio->temp);
905*4882a593Smuzhiyun 	} else {
906*4882a593Smuzhiyun 		if (add_ipu_page(fio, &bio, page))
907*4882a593Smuzhiyun 			goto alloc_new;
908*4882a593Smuzhiyun 	}
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	if (fio->io_wbc)
911*4882a593Smuzhiyun 		wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 	inc_page_count(fio->sbi, WB_DATA_TYPE(page));
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	*fio->last_block = fio->new_blkaddr;
916*4882a593Smuzhiyun 	*fio->bio = bio;
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun 	return 0;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun 
f2fs_submit_page_write(struct f2fs_io_info * fio)921*4882a593Smuzhiyun void f2fs_submit_page_write(struct f2fs_io_info *fio)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = fio->sbi;
924*4882a593Smuzhiyun 	enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
925*4882a593Smuzhiyun 	struct f2fs_bio_info *io = sbi->write_io[btype] + fio->temp;
926*4882a593Smuzhiyun 	struct page *bio_page;
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun 	f2fs_bug_on(sbi, is_read_io(fio->op));
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun 	f2fs_down_write(&io->io_rwsem);
931*4882a593Smuzhiyun next:
932*4882a593Smuzhiyun 	if (fio->in_list) {
933*4882a593Smuzhiyun 		spin_lock(&io->io_lock);
934*4882a593Smuzhiyun 		if (list_empty(&io->io_list)) {
935*4882a593Smuzhiyun 			spin_unlock(&io->io_lock);
936*4882a593Smuzhiyun 			goto out;
937*4882a593Smuzhiyun 		}
938*4882a593Smuzhiyun 		fio = list_first_entry(&io->io_list,
939*4882a593Smuzhiyun 						struct f2fs_io_info, list);
940*4882a593Smuzhiyun 		list_del(&fio->list);
941*4882a593Smuzhiyun 		spin_unlock(&io->io_lock);
942*4882a593Smuzhiyun 	}
943*4882a593Smuzhiyun 
944*4882a593Smuzhiyun 	verify_fio_blkaddr(fio);
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	if (fio->encrypted_page)
947*4882a593Smuzhiyun 		bio_page = fio->encrypted_page;
948*4882a593Smuzhiyun 	else if (fio->compressed_page)
949*4882a593Smuzhiyun 		bio_page = fio->compressed_page;
950*4882a593Smuzhiyun 	else
951*4882a593Smuzhiyun 		bio_page = fio->page;
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	/* set submitted = true as a return value */
954*4882a593Smuzhiyun 	fio->submitted = true;
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun 	inc_page_count(sbi, WB_DATA_TYPE(bio_page));
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun 	if (io->bio &&
959*4882a593Smuzhiyun 	    (!io_is_mergeable(sbi, io->bio, io, fio, io->last_block_in_bio,
960*4882a593Smuzhiyun 			      fio->new_blkaddr) ||
961*4882a593Smuzhiyun 	     !f2fs_crypt_mergeable_bio(io->bio, fio->page->mapping->host,
962*4882a593Smuzhiyun 				       bio_page->index, fio)))
963*4882a593Smuzhiyun 		__submit_merged_bio(io);
964*4882a593Smuzhiyun alloc_new:
965*4882a593Smuzhiyun 	if (io->bio == NULL) {
966*4882a593Smuzhiyun 		if (F2FS_IO_ALIGNED(sbi) &&
967*4882a593Smuzhiyun 				(fio->type == DATA || fio->type == NODE) &&
968*4882a593Smuzhiyun 				fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
969*4882a593Smuzhiyun 			dec_page_count(sbi, WB_DATA_TYPE(bio_page));
970*4882a593Smuzhiyun 			fio->retry = true;
971*4882a593Smuzhiyun 			goto skip;
972*4882a593Smuzhiyun 		}
973*4882a593Smuzhiyun 		io->bio = __bio_alloc(fio, BIO_MAX_PAGES);
974*4882a593Smuzhiyun 		f2fs_set_bio_crypt_ctx(io->bio, fio->page->mapping->host,
975*4882a593Smuzhiyun 				       bio_page->index, fio, GFP_NOIO);
976*4882a593Smuzhiyun 		io->fio = *fio;
977*4882a593Smuzhiyun 	}
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	if (bio_add_page(io->bio, bio_page, PAGE_SIZE, 0) < PAGE_SIZE) {
980*4882a593Smuzhiyun 		__submit_merged_bio(io);
981*4882a593Smuzhiyun 		goto alloc_new;
982*4882a593Smuzhiyun 	}
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun 	if (fio->io_wbc)
985*4882a593Smuzhiyun 		wbc_account_cgroup_owner(fio->io_wbc, bio_page, PAGE_SIZE);
986*4882a593Smuzhiyun 
987*4882a593Smuzhiyun 	io->last_block_in_bio = fio->new_blkaddr;
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	trace_f2fs_submit_page_write(fio->page, fio);
990*4882a593Smuzhiyun skip:
991*4882a593Smuzhiyun 	if (fio->in_list)
992*4882a593Smuzhiyun 		goto next;
993*4882a593Smuzhiyun out:
994*4882a593Smuzhiyun 	if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
995*4882a593Smuzhiyun 				!f2fs_is_checkpoint_ready(sbi))
996*4882a593Smuzhiyun 		__submit_merged_bio(io);
997*4882a593Smuzhiyun 	f2fs_up_write(&io->io_rwsem);
998*4882a593Smuzhiyun }
999*4882a593Smuzhiyun 
f2fs_grab_read_bio(struct inode * inode,block_t blkaddr,unsigned nr_pages,unsigned op_flag,pgoff_t first_idx,bool for_write)1000*4882a593Smuzhiyun static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr,
1001*4882a593Smuzhiyun 				      unsigned nr_pages, unsigned op_flag,
1002*4882a593Smuzhiyun 				      pgoff_t first_idx, bool for_write)
1003*4882a593Smuzhiyun {
1004*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1005*4882a593Smuzhiyun 	struct bio *bio;
1006*4882a593Smuzhiyun 	struct bio_post_read_ctx *ctx;
1007*4882a593Smuzhiyun 	unsigned int post_read_steps = 0;
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	bio = bio_alloc_bioset(for_write ? GFP_NOIO : GFP_KERNEL,
1010*4882a593Smuzhiyun 			       min_t(int, nr_pages, BIO_MAX_PAGES),
1011*4882a593Smuzhiyun 			       &f2fs_bioset);
1012*4882a593Smuzhiyun 	if (!bio)
1013*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
1014*4882a593Smuzhiyun 
1015*4882a593Smuzhiyun 	f2fs_set_bio_crypt_ctx(bio, inode, first_idx, NULL, GFP_NOFS);
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun 	f2fs_target_device(sbi, blkaddr, bio);
1018*4882a593Smuzhiyun 	bio->bi_end_io = f2fs_read_end_io;
1019*4882a593Smuzhiyun 	bio_set_op_attrs(bio, REQ_OP_READ, op_flag);
1020*4882a593Smuzhiyun 
1021*4882a593Smuzhiyun 	if (fscrypt_inode_uses_fs_layer_crypto(inode))
1022*4882a593Smuzhiyun 		post_read_steps |= STEP_DECRYPT;
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun 	if (f2fs_need_verity(inode, first_idx))
1025*4882a593Smuzhiyun 		post_read_steps |= STEP_VERITY;
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun 	/*
1028*4882a593Smuzhiyun 	 * STEP_DECOMPRESS is handled specially, since a compressed file might
1029*4882a593Smuzhiyun 	 * contain both compressed and uncompressed clusters.  We'll allocate a
1030*4882a593Smuzhiyun 	 * bio_post_read_ctx if the file is compressed, but the caller is
1031*4882a593Smuzhiyun 	 * responsible for enabling STEP_DECOMPRESS if it's actually needed.
1032*4882a593Smuzhiyun 	 */
1033*4882a593Smuzhiyun 
1034*4882a593Smuzhiyun 	if (post_read_steps || f2fs_compressed_file(inode)) {
1035*4882a593Smuzhiyun 		/* Due to the mempool, this never fails. */
1036*4882a593Smuzhiyun 		ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS);
1037*4882a593Smuzhiyun 		ctx->bio = bio;
1038*4882a593Smuzhiyun 		ctx->sbi = sbi;
1039*4882a593Smuzhiyun 		ctx->enabled_steps = post_read_steps;
1040*4882a593Smuzhiyun 		bio->bi_private = ctx;
1041*4882a593Smuzhiyun 	}
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun 	return bio;
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun /* This can handle encryption stuffs */
f2fs_submit_page_read(struct inode * inode,struct page * page,block_t blkaddr,int op_flags,bool for_write)1047*4882a593Smuzhiyun static int f2fs_submit_page_read(struct inode *inode, struct page *page,
1048*4882a593Smuzhiyun 				 block_t blkaddr, int op_flags, bool for_write)
1049*4882a593Smuzhiyun {
1050*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1051*4882a593Smuzhiyun 	struct bio *bio;
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun 	bio = f2fs_grab_read_bio(inode, blkaddr, 1, op_flags,
1054*4882a593Smuzhiyun 					page->index, for_write);
1055*4882a593Smuzhiyun 	if (IS_ERR(bio))
1056*4882a593Smuzhiyun 		return PTR_ERR(bio);
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun 	/* wait for GCed page writeback via META_MAPPING */
1059*4882a593Smuzhiyun 	f2fs_wait_on_block_writeback(inode, blkaddr);
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun 	if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
1062*4882a593Smuzhiyun 		bio_put(bio);
1063*4882a593Smuzhiyun 		return -EFAULT;
1064*4882a593Smuzhiyun 	}
1065*4882a593Smuzhiyun 	ClearPageError(page);
1066*4882a593Smuzhiyun 	inc_page_count(sbi, F2FS_RD_DATA);
1067*4882a593Smuzhiyun 	f2fs_update_iostat(sbi, FS_DATA_READ_IO, F2FS_BLKSIZE);
1068*4882a593Smuzhiyun 	__submit_bio(sbi, bio, DATA);
1069*4882a593Smuzhiyun 	return 0;
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun 
__set_data_blkaddr(struct dnode_of_data * dn)1072*4882a593Smuzhiyun static void __set_data_blkaddr(struct dnode_of_data *dn)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun 	struct f2fs_node *rn = F2FS_NODE(dn->node_page);
1075*4882a593Smuzhiyun 	__le32 *addr_array;
1076*4882a593Smuzhiyun 	int base = 0;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 	if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
1079*4882a593Smuzhiyun 		base = get_extra_isize(dn->inode);
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun 	/* Get physical address of data block */
1082*4882a593Smuzhiyun 	addr_array = blkaddr_in_node(rn);
1083*4882a593Smuzhiyun 	addr_array[base + dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun /*
1087*4882a593Smuzhiyun  * Lock ordering for the change of data block address:
1088*4882a593Smuzhiyun  * ->data_page
1089*4882a593Smuzhiyun  *  ->node_page
1090*4882a593Smuzhiyun  *    update block addresses in the node page
1091*4882a593Smuzhiyun  */
f2fs_set_data_blkaddr(struct dnode_of_data * dn)1092*4882a593Smuzhiyun void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
1093*4882a593Smuzhiyun {
1094*4882a593Smuzhiyun 	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
1095*4882a593Smuzhiyun 	__set_data_blkaddr(dn);
1096*4882a593Smuzhiyun 	if (set_page_dirty(dn->node_page))
1097*4882a593Smuzhiyun 		dn->node_changed = true;
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun 
f2fs_update_data_blkaddr(struct dnode_of_data * dn,block_t blkaddr)1100*4882a593Smuzhiyun void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
1101*4882a593Smuzhiyun {
1102*4882a593Smuzhiyun 	dn->data_blkaddr = blkaddr;
1103*4882a593Smuzhiyun 	f2fs_set_data_blkaddr(dn);
1104*4882a593Smuzhiyun 	f2fs_update_read_extent_cache(dn);
1105*4882a593Smuzhiyun }
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun /* dn->ofs_in_node will be returned with up-to-date last block pointer */
f2fs_reserve_new_blocks(struct dnode_of_data * dn,blkcnt_t count)1108*4882a593Smuzhiyun int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
1109*4882a593Smuzhiyun {
1110*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1111*4882a593Smuzhiyun 	int err;
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun 	if (!count)
1114*4882a593Smuzhiyun 		return 0;
1115*4882a593Smuzhiyun 
1116*4882a593Smuzhiyun 	if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
1117*4882a593Smuzhiyun 		return -EPERM;
1118*4882a593Smuzhiyun 	if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
1119*4882a593Smuzhiyun 		return err;
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun 	trace_f2fs_reserve_new_blocks(dn->inode, dn->nid,
1122*4882a593Smuzhiyun 						dn->ofs_in_node, count);
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
1125*4882a593Smuzhiyun 
1126*4882a593Smuzhiyun 	for (; count > 0; dn->ofs_in_node++) {
1127*4882a593Smuzhiyun 		block_t blkaddr = f2fs_data_blkaddr(dn);
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 		if (blkaddr == NULL_ADDR) {
1130*4882a593Smuzhiyun 			dn->data_blkaddr = NEW_ADDR;
1131*4882a593Smuzhiyun 			__set_data_blkaddr(dn);
1132*4882a593Smuzhiyun 			count--;
1133*4882a593Smuzhiyun 		}
1134*4882a593Smuzhiyun 	}
1135*4882a593Smuzhiyun 
1136*4882a593Smuzhiyun 	if (set_page_dirty(dn->node_page))
1137*4882a593Smuzhiyun 		dn->node_changed = true;
1138*4882a593Smuzhiyun 	return 0;
1139*4882a593Smuzhiyun }
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun /* Should keep dn->ofs_in_node unchanged */
f2fs_reserve_new_block(struct dnode_of_data * dn)1142*4882a593Smuzhiyun int f2fs_reserve_new_block(struct dnode_of_data *dn)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun 	unsigned int ofs_in_node = dn->ofs_in_node;
1145*4882a593Smuzhiyun 	int ret;
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun 	ret = f2fs_reserve_new_blocks(dn, 1);
1148*4882a593Smuzhiyun 	dn->ofs_in_node = ofs_in_node;
1149*4882a593Smuzhiyun 	return ret;
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun 
f2fs_reserve_block(struct dnode_of_data * dn,pgoff_t index)1152*4882a593Smuzhiyun int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
1153*4882a593Smuzhiyun {
1154*4882a593Smuzhiyun 	bool need_put = dn->inode_page ? false : true;
1155*4882a593Smuzhiyun 	int err;
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	err = f2fs_get_dnode_of_data(dn, index, ALLOC_NODE);
1158*4882a593Smuzhiyun 	if (err)
1159*4882a593Smuzhiyun 		return err;
1160*4882a593Smuzhiyun 
1161*4882a593Smuzhiyun 	if (dn->data_blkaddr == NULL_ADDR)
1162*4882a593Smuzhiyun 		err = f2fs_reserve_new_block(dn);
1163*4882a593Smuzhiyun 	if (err || need_put)
1164*4882a593Smuzhiyun 		f2fs_put_dnode(dn);
1165*4882a593Smuzhiyun 	return err;
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun 
f2fs_get_block(struct dnode_of_data * dn,pgoff_t index)1168*4882a593Smuzhiyun int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index)
1169*4882a593Smuzhiyun {
1170*4882a593Smuzhiyun 	struct extent_info ei = {0, };
1171*4882a593Smuzhiyun 	struct inode *inode = dn->inode;
1172*4882a593Smuzhiyun 
1173*4882a593Smuzhiyun 	if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
1174*4882a593Smuzhiyun 		dn->data_blkaddr = ei.blk + index - ei.fofs;
1175*4882a593Smuzhiyun 		return 0;
1176*4882a593Smuzhiyun 	}
1177*4882a593Smuzhiyun 
1178*4882a593Smuzhiyun 	return f2fs_reserve_block(dn, index);
1179*4882a593Smuzhiyun }
1180*4882a593Smuzhiyun 
f2fs_get_read_data_page(struct inode * inode,pgoff_t index,int op_flags,bool for_write)1181*4882a593Smuzhiyun struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index,
1182*4882a593Smuzhiyun 						int op_flags, bool for_write)
1183*4882a593Smuzhiyun {
1184*4882a593Smuzhiyun 	struct address_space *mapping = inode->i_mapping;
1185*4882a593Smuzhiyun 	struct dnode_of_data dn;
1186*4882a593Smuzhiyun 	struct page *page;
1187*4882a593Smuzhiyun 	struct extent_info ei = {0, };
1188*4882a593Smuzhiyun 	int err;
1189*4882a593Smuzhiyun 
1190*4882a593Smuzhiyun 	page = f2fs_grab_cache_page(mapping, index, for_write);
1191*4882a593Smuzhiyun 	if (!page)
1192*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun 	if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
1195*4882a593Smuzhiyun 		dn.data_blkaddr = ei.blk + index - ei.fofs;
1196*4882a593Smuzhiyun 		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr,
1197*4882a593Smuzhiyun 						DATA_GENERIC_ENHANCE_READ)) {
1198*4882a593Smuzhiyun 			err = -EFSCORRUPTED;
1199*4882a593Smuzhiyun 			goto put_err;
1200*4882a593Smuzhiyun 		}
1201*4882a593Smuzhiyun 		goto got_it;
1202*4882a593Smuzhiyun 	}
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, NULL, NULL, 0);
1205*4882a593Smuzhiyun 	err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
1206*4882a593Smuzhiyun 	if (err)
1207*4882a593Smuzhiyun 		goto put_err;
1208*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	if (unlikely(dn.data_blkaddr == NULL_ADDR)) {
1211*4882a593Smuzhiyun 		err = -ENOENT;
1212*4882a593Smuzhiyun 		goto put_err;
1213*4882a593Smuzhiyun 	}
1214*4882a593Smuzhiyun 	if (dn.data_blkaddr != NEW_ADDR &&
1215*4882a593Smuzhiyun 			!f2fs_is_valid_blkaddr(F2FS_I_SB(inode),
1216*4882a593Smuzhiyun 						dn.data_blkaddr,
1217*4882a593Smuzhiyun 						DATA_GENERIC_ENHANCE)) {
1218*4882a593Smuzhiyun 		err = -EFSCORRUPTED;
1219*4882a593Smuzhiyun 		goto put_err;
1220*4882a593Smuzhiyun 	}
1221*4882a593Smuzhiyun got_it:
1222*4882a593Smuzhiyun 	if (PageUptodate(page)) {
1223*4882a593Smuzhiyun 		unlock_page(page);
1224*4882a593Smuzhiyun 		return page;
1225*4882a593Smuzhiyun 	}
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun 	/*
1228*4882a593Smuzhiyun 	 * A new dentry page is allocated but not able to be written, since its
1229*4882a593Smuzhiyun 	 * new inode page couldn't be allocated due to -ENOSPC.
1230*4882a593Smuzhiyun 	 * In such the case, its blkaddr can be remained as NEW_ADDR.
1231*4882a593Smuzhiyun 	 * see, f2fs_add_link -> f2fs_get_new_data_page ->
1232*4882a593Smuzhiyun 	 * f2fs_init_inode_metadata.
1233*4882a593Smuzhiyun 	 */
1234*4882a593Smuzhiyun 	if (dn.data_blkaddr == NEW_ADDR) {
1235*4882a593Smuzhiyun 		zero_user_segment(page, 0, PAGE_SIZE);
1236*4882a593Smuzhiyun 		if (!PageUptodate(page))
1237*4882a593Smuzhiyun 			SetPageUptodate(page);
1238*4882a593Smuzhiyun 		unlock_page(page);
1239*4882a593Smuzhiyun 		return page;
1240*4882a593Smuzhiyun 	}
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun 	err = f2fs_submit_page_read(inode, page, dn.data_blkaddr,
1243*4882a593Smuzhiyun 						op_flags, for_write);
1244*4882a593Smuzhiyun 	if (err)
1245*4882a593Smuzhiyun 		goto put_err;
1246*4882a593Smuzhiyun 	return page;
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun put_err:
1249*4882a593Smuzhiyun 	f2fs_put_page(page, 1);
1250*4882a593Smuzhiyun 	return ERR_PTR(err);
1251*4882a593Smuzhiyun }
1252*4882a593Smuzhiyun 
f2fs_find_data_page(struct inode * inode,pgoff_t index)1253*4882a593Smuzhiyun struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index)
1254*4882a593Smuzhiyun {
1255*4882a593Smuzhiyun 	struct address_space *mapping = inode->i_mapping;
1256*4882a593Smuzhiyun 	struct page *page;
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun 	page = find_get_page(mapping, index);
1259*4882a593Smuzhiyun 	if (page && PageUptodate(page))
1260*4882a593Smuzhiyun 		return page;
1261*4882a593Smuzhiyun 	f2fs_put_page(page, 0);
1262*4882a593Smuzhiyun 
1263*4882a593Smuzhiyun 	page = f2fs_get_read_data_page(inode, index, 0, false);
1264*4882a593Smuzhiyun 	if (IS_ERR(page))
1265*4882a593Smuzhiyun 		return page;
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun 	if (PageUptodate(page))
1268*4882a593Smuzhiyun 		return page;
1269*4882a593Smuzhiyun 
1270*4882a593Smuzhiyun 	wait_on_page_locked(page);
1271*4882a593Smuzhiyun 	if (unlikely(!PageUptodate(page))) {
1272*4882a593Smuzhiyun 		f2fs_put_page(page, 0);
1273*4882a593Smuzhiyun 		return ERR_PTR(-EIO);
1274*4882a593Smuzhiyun 	}
1275*4882a593Smuzhiyun 	return page;
1276*4882a593Smuzhiyun }
1277*4882a593Smuzhiyun 
1278*4882a593Smuzhiyun /*
1279*4882a593Smuzhiyun  * If it tries to access a hole, return an error.
1280*4882a593Smuzhiyun  * Because, the callers, functions in dir.c and GC, should be able to know
1281*4882a593Smuzhiyun  * whether this page exists or not.
1282*4882a593Smuzhiyun  */
f2fs_get_lock_data_page(struct inode * inode,pgoff_t index,bool for_write)1283*4882a593Smuzhiyun struct page *f2fs_get_lock_data_page(struct inode *inode, pgoff_t index,
1284*4882a593Smuzhiyun 							bool for_write)
1285*4882a593Smuzhiyun {
1286*4882a593Smuzhiyun 	struct address_space *mapping = inode->i_mapping;
1287*4882a593Smuzhiyun 	struct page *page;
1288*4882a593Smuzhiyun repeat:
1289*4882a593Smuzhiyun 	page = f2fs_get_read_data_page(inode, index, 0, for_write);
1290*4882a593Smuzhiyun 	if (IS_ERR(page))
1291*4882a593Smuzhiyun 		return page;
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun 	/* wait for read completion */
1294*4882a593Smuzhiyun 	lock_page(page);
1295*4882a593Smuzhiyun 	if (unlikely(page->mapping != mapping)) {
1296*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1297*4882a593Smuzhiyun 		goto repeat;
1298*4882a593Smuzhiyun 	}
1299*4882a593Smuzhiyun 	if (unlikely(!PageUptodate(page))) {
1300*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1301*4882a593Smuzhiyun 		return ERR_PTR(-EIO);
1302*4882a593Smuzhiyun 	}
1303*4882a593Smuzhiyun 	return page;
1304*4882a593Smuzhiyun }
1305*4882a593Smuzhiyun 
1306*4882a593Smuzhiyun /*
1307*4882a593Smuzhiyun  * Caller ensures that this data page is never allocated.
1308*4882a593Smuzhiyun  * A new zero-filled data page is allocated in the page cache.
1309*4882a593Smuzhiyun  *
1310*4882a593Smuzhiyun  * Also, caller should grab and release a rwsem by calling f2fs_lock_op() and
1311*4882a593Smuzhiyun  * f2fs_unlock_op().
1312*4882a593Smuzhiyun  * Note that, ipage is set only by make_empty_dir, and if any error occur,
1313*4882a593Smuzhiyun  * ipage should be released by this function.
1314*4882a593Smuzhiyun  */
f2fs_get_new_data_page(struct inode * inode,struct page * ipage,pgoff_t index,bool new_i_size)1315*4882a593Smuzhiyun struct page *f2fs_get_new_data_page(struct inode *inode,
1316*4882a593Smuzhiyun 		struct page *ipage, pgoff_t index, bool new_i_size)
1317*4882a593Smuzhiyun {
1318*4882a593Smuzhiyun 	struct address_space *mapping = inode->i_mapping;
1319*4882a593Smuzhiyun 	struct page *page;
1320*4882a593Smuzhiyun 	struct dnode_of_data dn;
1321*4882a593Smuzhiyun 	int err;
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun 	page = f2fs_grab_cache_page(mapping, index, true);
1324*4882a593Smuzhiyun 	if (!page) {
1325*4882a593Smuzhiyun 		/*
1326*4882a593Smuzhiyun 		 * before exiting, we should make sure ipage will be released
1327*4882a593Smuzhiyun 		 * if any error occur.
1328*4882a593Smuzhiyun 		 */
1329*4882a593Smuzhiyun 		f2fs_put_page(ipage, 1);
1330*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
1331*4882a593Smuzhiyun 	}
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, ipage, NULL, 0);
1334*4882a593Smuzhiyun 	err = f2fs_reserve_block(&dn, index);
1335*4882a593Smuzhiyun 	if (err) {
1336*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1337*4882a593Smuzhiyun 		return ERR_PTR(err);
1338*4882a593Smuzhiyun 	}
1339*4882a593Smuzhiyun 	if (!ipage)
1340*4882a593Smuzhiyun 		f2fs_put_dnode(&dn);
1341*4882a593Smuzhiyun 
1342*4882a593Smuzhiyun 	if (PageUptodate(page))
1343*4882a593Smuzhiyun 		goto got_it;
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun 	if (dn.data_blkaddr == NEW_ADDR) {
1346*4882a593Smuzhiyun 		zero_user_segment(page, 0, PAGE_SIZE);
1347*4882a593Smuzhiyun 		if (!PageUptodate(page))
1348*4882a593Smuzhiyun 			SetPageUptodate(page);
1349*4882a593Smuzhiyun 	} else {
1350*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1351*4882a593Smuzhiyun 
1352*4882a593Smuzhiyun 		/* if ipage exists, blkaddr should be NEW_ADDR */
1353*4882a593Smuzhiyun 		f2fs_bug_on(F2FS_I_SB(inode), ipage);
1354*4882a593Smuzhiyun 		page = f2fs_get_lock_data_page(inode, index, true);
1355*4882a593Smuzhiyun 		if (IS_ERR(page))
1356*4882a593Smuzhiyun 			return page;
1357*4882a593Smuzhiyun 	}
1358*4882a593Smuzhiyun got_it:
1359*4882a593Smuzhiyun 	if (new_i_size && i_size_read(inode) <
1360*4882a593Smuzhiyun 				((loff_t)(index + 1) << PAGE_SHIFT))
1361*4882a593Smuzhiyun 		f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT));
1362*4882a593Smuzhiyun 	return page;
1363*4882a593Smuzhiyun }
1364*4882a593Smuzhiyun 
__allocate_data_block(struct dnode_of_data * dn,int seg_type)1365*4882a593Smuzhiyun static int __allocate_data_block(struct dnode_of_data *dn, int seg_type)
1366*4882a593Smuzhiyun {
1367*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1368*4882a593Smuzhiyun 	struct f2fs_summary sum;
1369*4882a593Smuzhiyun 	struct node_info ni;
1370*4882a593Smuzhiyun 	block_t old_blkaddr;
1371*4882a593Smuzhiyun 	blkcnt_t count = 1;
1372*4882a593Smuzhiyun 	int err;
1373*4882a593Smuzhiyun 
1374*4882a593Smuzhiyun 	if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
1375*4882a593Smuzhiyun 		return -EPERM;
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun 	err = f2fs_get_node_info(sbi, dn->nid, &ni, false);
1378*4882a593Smuzhiyun 	if (err)
1379*4882a593Smuzhiyun 		return err;
1380*4882a593Smuzhiyun 
1381*4882a593Smuzhiyun 	dn->data_blkaddr = f2fs_data_blkaddr(dn);
1382*4882a593Smuzhiyun 	if (dn->data_blkaddr != NULL_ADDR)
1383*4882a593Smuzhiyun 		goto alloc;
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun 	if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
1386*4882a593Smuzhiyun 		return err;
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun alloc:
1389*4882a593Smuzhiyun 	set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
1390*4882a593Smuzhiyun 	old_blkaddr = dn->data_blkaddr;
1391*4882a593Smuzhiyun 	f2fs_allocate_data_block(sbi, NULL, old_blkaddr, &dn->data_blkaddr,
1392*4882a593Smuzhiyun 				&sum, seg_type, NULL);
1393*4882a593Smuzhiyun 	if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) {
1394*4882a593Smuzhiyun 		invalidate_mapping_pages(META_MAPPING(sbi),
1395*4882a593Smuzhiyun 					old_blkaddr, old_blkaddr);
1396*4882a593Smuzhiyun 		f2fs_invalidate_compress_page(sbi, old_blkaddr);
1397*4882a593Smuzhiyun 	}
1398*4882a593Smuzhiyun 	f2fs_update_data_blkaddr(dn, dn->data_blkaddr);
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun 	/*
1401*4882a593Smuzhiyun 	 * i_size will be updated by direct_IO. Otherwise, we'll get stale
1402*4882a593Smuzhiyun 	 * data from unwritten block via dio_read.
1403*4882a593Smuzhiyun 	 */
1404*4882a593Smuzhiyun 	return 0;
1405*4882a593Smuzhiyun }
1406*4882a593Smuzhiyun 
f2fs_preallocate_blocks(struct kiocb * iocb,struct iov_iter * from)1407*4882a593Smuzhiyun int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
1408*4882a593Smuzhiyun {
1409*4882a593Smuzhiyun 	struct inode *inode = file_inode(iocb->ki_filp);
1410*4882a593Smuzhiyun 	struct f2fs_map_blocks map;
1411*4882a593Smuzhiyun 	int flag;
1412*4882a593Smuzhiyun 	int err = 0;
1413*4882a593Smuzhiyun 	bool direct_io = iocb->ki_flags & IOCB_DIRECT;
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun 	map.m_lblk = F2FS_BLK_ALIGN(iocb->ki_pos);
1416*4882a593Smuzhiyun 	map.m_len = F2FS_BYTES_TO_BLK(iocb->ki_pos + iov_iter_count(from));
1417*4882a593Smuzhiyun 	if (map.m_len > map.m_lblk)
1418*4882a593Smuzhiyun 		map.m_len -= map.m_lblk;
1419*4882a593Smuzhiyun 	else
1420*4882a593Smuzhiyun 		map.m_len = 0;
1421*4882a593Smuzhiyun 
1422*4882a593Smuzhiyun 	map.m_next_pgofs = NULL;
1423*4882a593Smuzhiyun 	map.m_next_extent = NULL;
1424*4882a593Smuzhiyun 	map.m_seg_type = NO_CHECK_TYPE;
1425*4882a593Smuzhiyun 	map.m_may_create = true;
1426*4882a593Smuzhiyun 
1427*4882a593Smuzhiyun 	if (direct_io) {
1428*4882a593Smuzhiyun 		map.m_seg_type = f2fs_rw_hint_to_seg_type(iocb->ki_hint);
1429*4882a593Smuzhiyun 		flag = f2fs_force_buffered_io(inode, iocb, from) ?
1430*4882a593Smuzhiyun 					F2FS_GET_BLOCK_PRE_AIO :
1431*4882a593Smuzhiyun 					F2FS_GET_BLOCK_PRE_DIO;
1432*4882a593Smuzhiyun 		goto map_blocks;
1433*4882a593Smuzhiyun 	}
1434*4882a593Smuzhiyun 	if (iocb->ki_pos + iov_iter_count(from) > MAX_INLINE_DATA(inode)) {
1435*4882a593Smuzhiyun 		err = f2fs_convert_inline_inode(inode);
1436*4882a593Smuzhiyun 		if (err)
1437*4882a593Smuzhiyun 			return err;
1438*4882a593Smuzhiyun 	}
1439*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode))
1440*4882a593Smuzhiyun 		return err;
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun 	flag = F2FS_GET_BLOCK_PRE_AIO;
1443*4882a593Smuzhiyun 
1444*4882a593Smuzhiyun map_blocks:
1445*4882a593Smuzhiyun 	err = f2fs_map_blocks(inode, &map, 1, flag);
1446*4882a593Smuzhiyun 	if (map.m_len > 0 && err == -ENOSPC) {
1447*4882a593Smuzhiyun 		if (!direct_io)
1448*4882a593Smuzhiyun 			set_inode_flag(inode, FI_NO_PREALLOC);
1449*4882a593Smuzhiyun 		err = 0;
1450*4882a593Smuzhiyun 	}
1451*4882a593Smuzhiyun 	return err;
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun 
f2fs_do_map_lock(struct f2fs_sb_info * sbi,int flag,bool lock)1454*4882a593Smuzhiyun void f2fs_do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
1455*4882a593Smuzhiyun {
1456*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_PRE_AIO) {
1457*4882a593Smuzhiyun 		if (lock)
1458*4882a593Smuzhiyun 			f2fs_down_read(&sbi->node_change);
1459*4882a593Smuzhiyun 		else
1460*4882a593Smuzhiyun 			f2fs_up_read(&sbi->node_change);
1461*4882a593Smuzhiyun 	} else {
1462*4882a593Smuzhiyun 		if (lock)
1463*4882a593Smuzhiyun 			f2fs_lock_op(sbi);
1464*4882a593Smuzhiyun 		else
1465*4882a593Smuzhiyun 			f2fs_unlock_op(sbi);
1466*4882a593Smuzhiyun 	}
1467*4882a593Smuzhiyun }
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun /*
1470*4882a593Smuzhiyun  * f2fs_map_blocks() tries to find or build mapping relationship which
1471*4882a593Smuzhiyun  * maps continuous logical blocks to physical blocks, and return such
1472*4882a593Smuzhiyun  * info via f2fs_map_blocks structure.
1473*4882a593Smuzhiyun  */
f2fs_map_blocks(struct inode * inode,struct f2fs_map_blocks * map,int create,int flag)1474*4882a593Smuzhiyun int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
1475*4882a593Smuzhiyun 						int create, int flag)
1476*4882a593Smuzhiyun {
1477*4882a593Smuzhiyun 	unsigned int maxblocks = map->m_len;
1478*4882a593Smuzhiyun 	struct dnode_of_data dn;
1479*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1480*4882a593Smuzhiyun 	int mode = map->m_may_create ? ALLOC_NODE : LOOKUP_NODE;
1481*4882a593Smuzhiyun 	pgoff_t pgofs, end_offset, end;
1482*4882a593Smuzhiyun 	int err = 0, ofs = 1;
1483*4882a593Smuzhiyun 	unsigned int ofs_in_node, last_ofs_in_node;
1484*4882a593Smuzhiyun 	blkcnt_t prealloc;
1485*4882a593Smuzhiyun 	struct extent_info ei = {0, };
1486*4882a593Smuzhiyun 	block_t blkaddr;
1487*4882a593Smuzhiyun 	unsigned int start_pgofs;
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun 	if (!maxblocks)
1490*4882a593Smuzhiyun 		return 0;
1491*4882a593Smuzhiyun 
1492*4882a593Smuzhiyun 	map->m_len = 0;
1493*4882a593Smuzhiyun 	map->m_flags = 0;
1494*4882a593Smuzhiyun 
1495*4882a593Smuzhiyun 	/* it only supports block size == page size */
1496*4882a593Smuzhiyun 	pgofs =	(pgoff_t)map->m_lblk;
1497*4882a593Smuzhiyun 	end = pgofs + maxblocks;
1498*4882a593Smuzhiyun 
1499*4882a593Smuzhiyun 	if (!create && f2fs_lookup_read_extent_cache(inode, pgofs, &ei)) {
1500*4882a593Smuzhiyun 		if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
1501*4882a593Smuzhiyun 							map->m_may_create)
1502*4882a593Smuzhiyun 			goto next_dnode;
1503*4882a593Smuzhiyun 
1504*4882a593Smuzhiyun 		map->m_pblk = ei.blk + pgofs - ei.fofs;
1505*4882a593Smuzhiyun 		map->m_len = min((pgoff_t)maxblocks, ei.fofs + ei.len - pgofs);
1506*4882a593Smuzhiyun 		map->m_flags = F2FS_MAP_MAPPED;
1507*4882a593Smuzhiyun 		if (map->m_next_extent)
1508*4882a593Smuzhiyun 			*map->m_next_extent = pgofs + map->m_len;
1509*4882a593Smuzhiyun 
1510*4882a593Smuzhiyun 		/* for hardware encryption, but to avoid potential issue in future */
1511*4882a593Smuzhiyun 		if (flag == F2FS_GET_BLOCK_DIO)
1512*4882a593Smuzhiyun 			f2fs_wait_on_block_writeback_range(inode,
1513*4882a593Smuzhiyun 						map->m_pblk, map->m_len);
1514*4882a593Smuzhiyun 		goto out;
1515*4882a593Smuzhiyun 	}
1516*4882a593Smuzhiyun 
1517*4882a593Smuzhiyun next_dnode:
1518*4882a593Smuzhiyun 	if (map->m_may_create)
1519*4882a593Smuzhiyun 		f2fs_do_map_lock(sbi, flag, true);
1520*4882a593Smuzhiyun 
1521*4882a593Smuzhiyun 	/* When reading holes, we need its node page */
1522*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, NULL, NULL, 0);
1523*4882a593Smuzhiyun 	err = f2fs_get_dnode_of_data(&dn, pgofs, mode);
1524*4882a593Smuzhiyun 	if (err) {
1525*4882a593Smuzhiyun 		if (flag == F2FS_GET_BLOCK_BMAP)
1526*4882a593Smuzhiyun 			map->m_pblk = 0;
1527*4882a593Smuzhiyun 
1528*4882a593Smuzhiyun 		if (err == -ENOENT) {
1529*4882a593Smuzhiyun 			/*
1530*4882a593Smuzhiyun 			 * There is one exceptional case that read_node_page()
1531*4882a593Smuzhiyun 			 * may return -ENOENT due to filesystem has been
1532*4882a593Smuzhiyun 			 * shutdown or cp_error, so force to convert error
1533*4882a593Smuzhiyun 			 * number to EIO for such case.
1534*4882a593Smuzhiyun 			 */
1535*4882a593Smuzhiyun 			if (map->m_may_create &&
1536*4882a593Smuzhiyun 				(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
1537*4882a593Smuzhiyun 				f2fs_cp_error(sbi))) {
1538*4882a593Smuzhiyun 				err = -EIO;
1539*4882a593Smuzhiyun 				goto unlock_out;
1540*4882a593Smuzhiyun 			}
1541*4882a593Smuzhiyun 
1542*4882a593Smuzhiyun 			err = 0;
1543*4882a593Smuzhiyun 			if (map->m_next_pgofs)
1544*4882a593Smuzhiyun 				*map->m_next_pgofs =
1545*4882a593Smuzhiyun 					f2fs_get_next_page_offset(&dn, pgofs);
1546*4882a593Smuzhiyun 			if (map->m_next_extent)
1547*4882a593Smuzhiyun 				*map->m_next_extent =
1548*4882a593Smuzhiyun 					f2fs_get_next_page_offset(&dn, pgofs);
1549*4882a593Smuzhiyun 		}
1550*4882a593Smuzhiyun 		goto unlock_out;
1551*4882a593Smuzhiyun 	}
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun 	start_pgofs = pgofs;
1554*4882a593Smuzhiyun 	prealloc = 0;
1555*4882a593Smuzhiyun 	last_ofs_in_node = ofs_in_node = dn.ofs_in_node;
1556*4882a593Smuzhiyun 	end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun next_block:
1559*4882a593Smuzhiyun 	blkaddr = f2fs_data_blkaddr(&dn);
1560*4882a593Smuzhiyun 
1561*4882a593Smuzhiyun 	if (__is_valid_data_blkaddr(blkaddr) &&
1562*4882a593Smuzhiyun 		!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) {
1563*4882a593Smuzhiyun 		err = -EFSCORRUPTED;
1564*4882a593Smuzhiyun 		goto sync_out;
1565*4882a593Smuzhiyun 	}
1566*4882a593Smuzhiyun 
1567*4882a593Smuzhiyun 	if (__is_valid_data_blkaddr(blkaddr)) {
1568*4882a593Smuzhiyun 		/* use out-place-update for driect IO under LFS mode */
1569*4882a593Smuzhiyun 		if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
1570*4882a593Smuzhiyun 							map->m_may_create) {
1571*4882a593Smuzhiyun 			err = __allocate_data_block(&dn, map->m_seg_type);
1572*4882a593Smuzhiyun 			if (err)
1573*4882a593Smuzhiyun 				goto sync_out;
1574*4882a593Smuzhiyun 			blkaddr = dn.data_blkaddr;
1575*4882a593Smuzhiyun 			set_inode_flag(inode, FI_APPEND_WRITE);
1576*4882a593Smuzhiyun 		}
1577*4882a593Smuzhiyun 	} else {
1578*4882a593Smuzhiyun 		if (create) {
1579*4882a593Smuzhiyun 			if (unlikely(f2fs_cp_error(sbi))) {
1580*4882a593Smuzhiyun 				err = -EIO;
1581*4882a593Smuzhiyun 				goto sync_out;
1582*4882a593Smuzhiyun 			}
1583*4882a593Smuzhiyun 			if (flag == F2FS_GET_BLOCK_PRE_AIO) {
1584*4882a593Smuzhiyun 				if (blkaddr == NULL_ADDR) {
1585*4882a593Smuzhiyun 					prealloc++;
1586*4882a593Smuzhiyun 					last_ofs_in_node = dn.ofs_in_node;
1587*4882a593Smuzhiyun 				}
1588*4882a593Smuzhiyun 			} else {
1589*4882a593Smuzhiyun 				WARN_ON(flag != F2FS_GET_BLOCK_PRE_DIO &&
1590*4882a593Smuzhiyun 					flag != F2FS_GET_BLOCK_DIO);
1591*4882a593Smuzhiyun 				err = __allocate_data_block(&dn,
1592*4882a593Smuzhiyun 							map->m_seg_type);
1593*4882a593Smuzhiyun 				if (!err)
1594*4882a593Smuzhiyun 					set_inode_flag(inode, FI_APPEND_WRITE);
1595*4882a593Smuzhiyun 			}
1596*4882a593Smuzhiyun 			if (err)
1597*4882a593Smuzhiyun 				goto sync_out;
1598*4882a593Smuzhiyun 			map->m_flags |= F2FS_MAP_NEW;
1599*4882a593Smuzhiyun 			blkaddr = dn.data_blkaddr;
1600*4882a593Smuzhiyun 		} else {
1601*4882a593Smuzhiyun 			if (flag == F2FS_GET_BLOCK_BMAP) {
1602*4882a593Smuzhiyun 				map->m_pblk = 0;
1603*4882a593Smuzhiyun 				goto sync_out;
1604*4882a593Smuzhiyun 			}
1605*4882a593Smuzhiyun 			if (flag == F2FS_GET_BLOCK_PRECACHE)
1606*4882a593Smuzhiyun 				goto sync_out;
1607*4882a593Smuzhiyun 			if (flag == F2FS_GET_BLOCK_FIEMAP &&
1608*4882a593Smuzhiyun 						blkaddr == NULL_ADDR) {
1609*4882a593Smuzhiyun 				if (map->m_next_pgofs)
1610*4882a593Smuzhiyun 					*map->m_next_pgofs = pgofs + 1;
1611*4882a593Smuzhiyun 				goto sync_out;
1612*4882a593Smuzhiyun 			}
1613*4882a593Smuzhiyun 			if (flag != F2FS_GET_BLOCK_FIEMAP) {
1614*4882a593Smuzhiyun 				/* for defragment case */
1615*4882a593Smuzhiyun 				if (map->m_next_pgofs)
1616*4882a593Smuzhiyun 					*map->m_next_pgofs = pgofs + 1;
1617*4882a593Smuzhiyun 				goto sync_out;
1618*4882a593Smuzhiyun 			}
1619*4882a593Smuzhiyun 		}
1620*4882a593Smuzhiyun 	}
1621*4882a593Smuzhiyun 
1622*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_PRE_AIO)
1623*4882a593Smuzhiyun 		goto skip;
1624*4882a593Smuzhiyun 
1625*4882a593Smuzhiyun 	if (map->m_len == 0) {
1626*4882a593Smuzhiyun 		/* preallocated unwritten block should be mapped for fiemap. */
1627*4882a593Smuzhiyun 		if (blkaddr == NEW_ADDR)
1628*4882a593Smuzhiyun 			map->m_flags |= F2FS_MAP_UNWRITTEN;
1629*4882a593Smuzhiyun 		map->m_flags |= F2FS_MAP_MAPPED;
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 		map->m_pblk = blkaddr;
1632*4882a593Smuzhiyun 		map->m_len = 1;
1633*4882a593Smuzhiyun 	} else if ((map->m_pblk != NEW_ADDR &&
1634*4882a593Smuzhiyun 			blkaddr == (map->m_pblk + ofs)) ||
1635*4882a593Smuzhiyun 			(map->m_pblk == NEW_ADDR && blkaddr == NEW_ADDR) ||
1636*4882a593Smuzhiyun 			flag == F2FS_GET_BLOCK_PRE_DIO) {
1637*4882a593Smuzhiyun 		ofs++;
1638*4882a593Smuzhiyun 		map->m_len++;
1639*4882a593Smuzhiyun 	} else {
1640*4882a593Smuzhiyun 		goto sync_out;
1641*4882a593Smuzhiyun 	}
1642*4882a593Smuzhiyun 
1643*4882a593Smuzhiyun skip:
1644*4882a593Smuzhiyun 	dn.ofs_in_node++;
1645*4882a593Smuzhiyun 	pgofs++;
1646*4882a593Smuzhiyun 
1647*4882a593Smuzhiyun 	/* preallocate blocks in batch for one dnode page */
1648*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_PRE_AIO &&
1649*4882a593Smuzhiyun 			(pgofs == end || dn.ofs_in_node == end_offset)) {
1650*4882a593Smuzhiyun 
1651*4882a593Smuzhiyun 		dn.ofs_in_node = ofs_in_node;
1652*4882a593Smuzhiyun 		err = f2fs_reserve_new_blocks(&dn, prealloc);
1653*4882a593Smuzhiyun 		if (err)
1654*4882a593Smuzhiyun 			goto sync_out;
1655*4882a593Smuzhiyun 
1656*4882a593Smuzhiyun 		map->m_len += dn.ofs_in_node - ofs_in_node;
1657*4882a593Smuzhiyun 		if (prealloc && dn.ofs_in_node != last_ofs_in_node + 1) {
1658*4882a593Smuzhiyun 			err = -ENOSPC;
1659*4882a593Smuzhiyun 			goto sync_out;
1660*4882a593Smuzhiyun 		}
1661*4882a593Smuzhiyun 		dn.ofs_in_node = end_offset;
1662*4882a593Smuzhiyun 	}
1663*4882a593Smuzhiyun 
1664*4882a593Smuzhiyun 	if (pgofs >= end)
1665*4882a593Smuzhiyun 		goto sync_out;
1666*4882a593Smuzhiyun 	else if (dn.ofs_in_node < end_offset)
1667*4882a593Smuzhiyun 		goto next_block;
1668*4882a593Smuzhiyun 
1669*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_PRECACHE) {
1670*4882a593Smuzhiyun 		if (map->m_flags & F2FS_MAP_MAPPED) {
1671*4882a593Smuzhiyun 			unsigned int ofs = start_pgofs - map->m_lblk;
1672*4882a593Smuzhiyun 
1673*4882a593Smuzhiyun 			f2fs_update_read_extent_cache_range(&dn,
1674*4882a593Smuzhiyun 				start_pgofs, map->m_pblk + ofs,
1675*4882a593Smuzhiyun 				map->m_len - ofs);
1676*4882a593Smuzhiyun 		}
1677*4882a593Smuzhiyun 	}
1678*4882a593Smuzhiyun 
1679*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
1680*4882a593Smuzhiyun 
1681*4882a593Smuzhiyun 	if (map->m_may_create) {
1682*4882a593Smuzhiyun 		f2fs_do_map_lock(sbi, flag, false);
1683*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, dn.node_changed);
1684*4882a593Smuzhiyun 	}
1685*4882a593Smuzhiyun 	goto next_dnode;
1686*4882a593Smuzhiyun 
1687*4882a593Smuzhiyun sync_out:
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 	/* for hardware encryption, but to avoid potential issue in future */
1690*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_DIO && map->m_flags & F2FS_MAP_MAPPED)
1691*4882a593Smuzhiyun 		f2fs_wait_on_block_writeback_range(inode,
1692*4882a593Smuzhiyun 						map->m_pblk, map->m_len);
1693*4882a593Smuzhiyun 
1694*4882a593Smuzhiyun 	if (flag == F2FS_GET_BLOCK_PRECACHE) {
1695*4882a593Smuzhiyun 		if (map->m_flags & F2FS_MAP_MAPPED) {
1696*4882a593Smuzhiyun 			unsigned int ofs = start_pgofs - map->m_lblk;
1697*4882a593Smuzhiyun 
1698*4882a593Smuzhiyun 			f2fs_update_read_extent_cache_range(&dn,
1699*4882a593Smuzhiyun 				start_pgofs, map->m_pblk + ofs,
1700*4882a593Smuzhiyun 				map->m_len - ofs);
1701*4882a593Smuzhiyun 		}
1702*4882a593Smuzhiyun 		if (map->m_next_extent)
1703*4882a593Smuzhiyun 			*map->m_next_extent = pgofs + 1;
1704*4882a593Smuzhiyun 	}
1705*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
1706*4882a593Smuzhiyun unlock_out:
1707*4882a593Smuzhiyun 	if (map->m_may_create) {
1708*4882a593Smuzhiyun 		f2fs_do_map_lock(sbi, flag, false);
1709*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, dn.node_changed);
1710*4882a593Smuzhiyun 	}
1711*4882a593Smuzhiyun out:
1712*4882a593Smuzhiyun 	trace_f2fs_map_blocks(inode, map, err);
1713*4882a593Smuzhiyun 	return err;
1714*4882a593Smuzhiyun }
1715*4882a593Smuzhiyun 
f2fs_overwrite_io(struct inode * inode,loff_t pos,size_t len)1716*4882a593Smuzhiyun bool f2fs_overwrite_io(struct inode *inode, loff_t pos, size_t len)
1717*4882a593Smuzhiyun {
1718*4882a593Smuzhiyun 	struct f2fs_map_blocks map;
1719*4882a593Smuzhiyun 	block_t last_lblk;
1720*4882a593Smuzhiyun 	int err;
1721*4882a593Smuzhiyun 
1722*4882a593Smuzhiyun 	if (pos + len > i_size_read(inode))
1723*4882a593Smuzhiyun 		return false;
1724*4882a593Smuzhiyun 
1725*4882a593Smuzhiyun 	map.m_lblk = F2FS_BYTES_TO_BLK(pos);
1726*4882a593Smuzhiyun 	map.m_next_pgofs = NULL;
1727*4882a593Smuzhiyun 	map.m_next_extent = NULL;
1728*4882a593Smuzhiyun 	map.m_seg_type = NO_CHECK_TYPE;
1729*4882a593Smuzhiyun 	map.m_may_create = false;
1730*4882a593Smuzhiyun 	last_lblk = F2FS_BLK_ALIGN(pos + len);
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun 	while (map.m_lblk < last_lblk) {
1733*4882a593Smuzhiyun 		map.m_len = last_lblk - map.m_lblk;
1734*4882a593Smuzhiyun 		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
1735*4882a593Smuzhiyun 		if (err || map.m_len == 0)
1736*4882a593Smuzhiyun 			return false;
1737*4882a593Smuzhiyun 		map.m_lblk += map.m_len;
1738*4882a593Smuzhiyun 	}
1739*4882a593Smuzhiyun 	return true;
1740*4882a593Smuzhiyun }
1741*4882a593Smuzhiyun 
bytes_to_blks(struct inode * inode,u64 bytes)1742*4882a593Smuzhiyun static inline u64 bytes_to_blks(struct inode *inode, u64 bytes)
1743*4882a593Smuzhiyun {
1744*4882a593Smuzhiyun 	return (bytes >> inode->i_blkbits);
1745*4882a593Smuzhiyun }
1746*4882a593Smuzhiyun 
blks_to_bytes(struct inode * inode,u64 blks)1747*4882a593Smuzhiyun static inline u64 blks_to_bytes(struct inode *inode, u64 blks)
1748*4882a593Smuzhiyun {
1749*4882a593Smuzhiyun 	return (blks << inode->i_blkbits);
1750*4882a593Smuzhiyun }
1751*4882a593Smuzhiyun 
__get_data_block(struct inode * inode,sector_t iblock,struct buffer_head * bh,int create,int flag,pgoff_t * next_pgofs,int seg_type,bool may_write)1752*4882a593Smuzhiyun static int __get_data_block(struct inode *inode, sector_t iblock,
1753*4882a593Smuzhiyun 			struct buffer_head *bh, int create, int flag,
1754*4882a593Smuzhiyun 			pgoff_t *next_pgofs, int seg_type, bool may_write)
1755*4882a593Smuzhiyun {
1756*4882a593Smuzhiyun 	struct f2fs_map_blocks map;
1757*4882a593Smuzhiyun 	int err;
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun 	map.m_lblk = iblock;
1760*4882a593Smuzhiyun 	map.m_len = bytes_to_blks(inode, bh->b_size);
1761*4882a593Smuzhiyun 	map.m_next_pgofs = next_pgofs;
1762*4882a593Smuzhiyun 	map.m_next_extent = NULL;
1763*4882a593Smuzhiyun 	map.m_seg_type = seg_type;
1764*4882a593Smuzhiyun 	map.m_may_create = may_write;
1765*4882a593Smuzhiyun 
1766*4882a593Smuzhiyun 	err = f2fs_map_blocks(inode, &map, create, flag);
1767*4882a593Smuzhiyun 	if (!err) {
1768*4882a593Smuzhiyun 		map_bh(bh, inode->i_sb, map.m_pblk);
1769*4882a593Smuzhiyun 		bh->b_state = (bh->b_state & ~F2FS_MAP_FLAGS) | map.m_flags;
1770*4882a593Smuzhiyun 		bh->b_size = blks_to_bytes(inode, map.m_len);
1771*4882a593Smuzhiyun 	}
1772*4882a593Smuzhiyun 	return err;
1773*4882a593Smuzhiyun }
1774*4882a593Smuzhiyun 
get_data_block_dio_write(struct inode * inode,sector_t iblock,struct buffer_head * bh_result,int create)1775*4882a593Smuzhiyun static int get_data_block_dio_write(struct inode *inode, sector_t iblock,
1776*4882a593Smuzhiyun 			struct buffer_head *bh_result, int create)
1777*4882a593Smuzhiyun {
1778*4882a593Smuzhiyun 	return __get_data_block(inode, iblock, bh_result, create,
1779*4882a593Smuzhiyun 				F2FS_GET_BLOCK_DIO, NULL,
1780*4882a593Smuzhiyun 				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
1781*4882a593Smuzhiyun 				true);
1782*4882a593Smuzhiyun }
1783*4882a593Smuzhiyun 
get_data_block_dio(struct inode * inode,sector_t iblock,struct buffer_head * bh_result,int create)1784*4882a593Smuzhiyun static int get_data_block_dio(struct inode *inode, sector_t iblock,
1785*4882a593Smuzhiyun 			struct buffer_head *bh_result, int create)
1786*4882a593Smuzhiyun {
1787*4882a593Smuzhiyun 	return __get_data_block(inode, iblock, bh_result, create,
1788*4882a593Smuzhiyun 				F2FS_GET_BLOCK_DIO, NULL,
1789*4882a593Smuzhiyun 				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
1790*4882a593Smuzhiyun 				false);
1791*4882a593Smuzhiyun }
1792*4882a593Smuzhiyun 
f2fs_xattr_fiemap(struct inode * inode,struct fiemap_extent_info * fieinfo)1793*4882a593Smuzhiyun static int f2fs_xattr_fiemap(struct inode *inode,
1794*4882a593Smuzhiyun 				struct fiemap_extent_info *fieinfo)
1795*4882a593Smuzhiyun {
1796*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1797*4882a593Smuzhiyun 	struct page *page;
1798*4882a593Smuzhiyun 	struct node_info ni;
1799*4882a593Smuzhiyun 	__u64 phys = 0, len;
1800*4882a593Smuzhiyun 	__u32 flags;
1801*4882a593Smuzhiyun 	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
1802*4882a593Smuzhiyun 	int err = 0;
1803*4882a593Smuzhiyun 
1804*4882a593Smuzhiyun 	if (f2fs_has_inline_xattr(inode)) {
1805*4882a593Smuzhiyun 		int offset;
1806*4882a593Smuzhiyun 
1807*4882a593Smuzhiyun 		page = f2fs_grab_cache_page(NODE_MAPPING(sbi),
1808*4882a593Smuzhiyun 						inode->i_ino, false);
1809*4882a593Smuzhiyun 		if (!page)
1810*4882a593Smuzhiyun 			return -ENOMEM;
1811*4882a593Smuzhiyun 
1812*4882a593Smuzhiyun 		err = f2fs_get_node_info(sbi, inode->i_ino, &ni, false);
1813*4882a593Smuzhiyun 		if (err) {
1814*4882a593Smuzhiyun 			f2fs_put_page(page, 1);
1815*4882a593Smuzhiyun 			return err;
1816*4882a593Smuzhiyun 		}
1817*4882a593Smuzhiyun 
1818*4882a593Smuzhiyun 		phys = blks_to_bytes(inode, ni.blk_addr);
1819*4882a593Smuzhiyun 		offset = offsetof(struct f2fs_inode, i_addr) +
1820*4882a593Smuzhiyun 					sizeof(__le32) * (DEF_ADDRS_PER_INODE -
1821*4882a593Smuzhiyun 					get_inline_xattr_addrs(inode));
1822*4882a593Smuzhiyun 
1823*4882a593Smuzhiyun 		phys += offset;
1824*4882a593Smuzhiyun 		len = inline_xattr_size(inode);
1825*4882a593Smuzhiyun 
1826*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1827*4882a593Smuzhiyun 
1828*4882a593Smuzhiyun 		flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED;
1829*4882a593Smuzhiyun 
1830*4882a593Smuzhiyun 		if (!xnid)
1831*4882a593Smuzhiyun 			flags |= FIEMAP_EXTENT_LAST;
1832*4882a593Smuzhiyun 
1833*4882a593Smuzhiyun 		err = fiemap_fill_next_extent(fieinfo, 0, phys, len, flags);
1834*4882a593Smuzhiyun 		trace_f2fs_fiemap(inode, 0, phys, len, flags, err);
1835*4882a593Smuzhiyun 		if (err || err == 1)
1836*4882a593Smuzhiyun 			return err;
1837*4882a593Smuzhiyun 	}
1838*4882a593Smuzhiyun 
1839*4882a593Smuzhiyun 	if (xnid) {
1840*4882a593Smuzhiyun 		page = f2fs_grab_cache_page(NODE_MAPPING(sbi), xnid, false);
1841*4882a593Smuzhiyun 		if (!page)
1842*4882a593Smuzhiyun 			return -ENOMEM;
1843*4882a593Smuzhiyun 
1844*4882a593Smuzhiyun 		err = f2fs_get_node_info(sbi, xnid, &ni, false);
1845*4882a593Smuzhiyun 		if (err) {
1846*4882a593Smuzhiyun 			f2fs_put_page(page, 1);
1847*4882a593Smuzhiyun 			return err;
1848*4882a593Smuzhiyun 		}
1849*4882a593Smuzhiyun 
1850*4882a593Smuzhiyun 		phys = blks_to_bytes(inode, ni.blk_addr);
1851*4882a593Smuzhiyun 		len = inode->i_sb->s_blocksize;
1852*4882a593Smuzhiyun 
1853*4882a593Smuzhiyun 		f2fs_put_page(page, 1);
1854*4882a593Smuzhiyun 
1855*4882a593Smuzhiyun 		flags = FIEMAP_EXTENT_LAST;
1856*4882a593Smuzhiyun 	}
1857*4882a593Smuzhiyun 
1858*4882a593Smuzhiyun 	if (phys) {
1859*4882a593Smuzhiyun 		err = fiemap_fill_next_extent(fieinfo, 0, phys, len, flags);
1860*4882a593Smuzhiyun 		trace_f2fs_fiemap(inode, 0, phys, len, flags, err);
1861*4882a593Smuzhiyun 	}
1862*4882a593Smuzhiyun 
1863*4882a593Smuzhiyun 	return (err < 0 ? err : 0);
1864*4882a593Smuzhiyun }
1865*4882a593Smuzhiyun 
max_inode_blocks(struct inode * inode)1866*4882a593Smuzhiyun static loff_t max_inode_blocks(struct inode *inode)
1867*4882a593Smuzhiyun {
1868*4882a593Smuzhiyun 	loff_t result = ADDRS_PER_INODE(inode);
1869*4882a593Smuzhiyun 	loff_t leaf_count = ADDRS_PER_BLOCK(inode);
1870*4882a593Smuzhiyun 
1871*4882a593Smuzhiyun 	/* two direct node blocks */
1872*4882a593Smuzhiyun 	result += (leaf_count * 2);
1873*4882a593Smuzhiyun 
1874*4882a593Smuzhiyun 	/* two indirect node blocks */
1875*4882a593Smuzhiyun 	leaf_count *= NIDS_PER_BLOCK;
1876*4882a593Smuzhiyun 	result += (leaf_count * 2);
1877*4882a593Smuzhiyun 
1878*4882a593Smuzhiyun 	/* one double indirect node block */
1879*4882a593Smuzhiyun 	leaf_count *= NIDS_PER_BLOCK;
1880*4882a593Smuzhiyun 	result += leaf_count;
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun 	return result;
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun 
f2fs_fiemap(struct inode * inode,struct fiemap_extent_info * fieinfo,u64 start,u64 len)1885*4882a593Smuzhiyun int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
1886*4882a593Smuzhiyun 		u64 start, u64 len)
1887*4882a593Smuzhiyun {
1888*4882a593Smuzhiyun 	struct f2fs_map_blocks map;
1889*4882a593Smuzhiyun 	sector_t start_blk, last_blk;
1890*4882a593Smuzhiyun 	pgoff_t next_pgofs;
1891*4882a593Smuzhiyun 	u64 logical = 0, phys = 0, size = 0;
1892*4882a593Smuzhiyun 	u32 flags = 0;
1893*4882a593Smuzhiyun 	int ret = 0;
1894*4882a593Smuzhiyun 	bool compr_cluster = false, compr_appended;
1895*4882a593Smuzhiyun 	unsigned int cluster_size = F2FS_I(inode)->i_cluster_size;
1896*4882a593Smuzhiyun 	unsigned int count_in_cluster = 0;
1897*4882a593Smuzhiyun 	loff_t maxbytes;
1898*4882a593Smuzhiyun 
1899*4882a593Smuzhiyun 	if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) {
1900*4882a593Smuzhiyun 		ret = f2fs_precache_extents(inode);
1901*4882a593Smuzhiyun 		if (ret)
1902*4882a593Smuzhiyun 			return ret;
1903*4882a593Smuzhiyun 	}
1904*4882a593Smuzhiyun 
1905*4882a593Smuzhiyun 	ret = fiemap_prep(inode, fieinfo, start, &len, FIEMAP_FLAG_XATTR);
1906*4882a593Smuzhiyun 	if (ret)
1907*4882a593Smuzhiyun 		return ret;
1908*4882a593Smuzhiyun 
1909*4882a593Smuzhiyun 	inode_lock(inode);
1910*4882a593Smuzhiyun 
1911*4882a593Smuzhiyun 	maxbytes = max_file_blocks(inode) << F2FS_BLKSIZE_BITS;
1912*4882a593Smuzhiyun 	if (start > maxbytes) {
1913*4882a593Smuzhiyun 		ret = -EFBIG;
1914*4882a593Smuzhiyun 		goto out;
1915*4882a593Smuzhiyun 	}
1916*4882a593Smuzhiyun 
1917*4882a593Smuzhiyun 	if (len > maxbytes || (maxbytes - len) < start)
1918*4882a593Smuzhiyun 		len = maxbytes - start;
1919*4882a593Smuzhiyun 
1920*4882a593Smuzhiyun 	if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
1921*4882a593Smuzhiyun 		ret = f2fs_xattr_fiemap(inode, fieinfo);
1922*4882a593Smuzhiyun 		goto out;
1923*4882a593Smuzhiyun 	}
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
1926*4882a593Smuzhiyun 		ret = f2fs_inline_data_fiemap(inode, fieinfo, start, len);
1927*4882a593Smuzhiyun 		if (ret != -EAGAIN)
1928*4882a593Smuzhiyun 			goto out;
1929*4882a593Smuzhiyun 	}
1930*4882a593Smuzhiyun 
1931*4882a593Smuzhiyun 	if (bytes_to_blks(inode, len) == 0)
1932*4882a593Smuzhiyun 		len = blks_to_bytes(inode, 1);
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun 	start_blk = bytes_to_blks(inode, start);
1935*4882a593Smuzhiyun 	last_blk = bytes_to_blks(inode, start + len - 1);
1936*4882a593Smuzhiyun 
1937*4882a593Smuzhiyun next:
1938*4882a593Smuzhiyun 	memset(&map, 0, sizeof(map));
1939*4882a593Smuzhiyun 	map.m_lblk = start_blk;
1940*4882a593Smuzhiyun 	map.m_len = bytes_to_blks(inode, len);
1941*4882a593Smuzhiyun 	map.m_next_pgofs = &next_pgofs;
1942*4882a593Smuzhiyun 	map.m_seg_type = NO_CHECK_TYPE;
1943*4882a593Smuzhiyun 
1944*4882a593Smuzhiyun 	if (compr_cluster) {
1945*4882a593Smuzhiyun 		map.m_lblk += 1;
1946*4882a593Smuzhiyun 		map.m_len = cluster_size - count_in_cluster;
1947*4882a593Smuzhiyun 	}
1948*4882a593Smuzhiyun 
1949*4882a593Smuzhiyun 	ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
1950*4882a593Smuzhiyun 	if (ret)
1951*4882a593Smuzhiyun 		goto out;
1952*4882a593Smuzhiyun 
1953*4882a593Smuzhiyun 	/* HOLE */
1954*4882a593Smuzhiyun 	if (!compr_cluster && !(map.m_flags & F2FS_MAP_FLAGS)) {
1955*4882a593Smuzhiyun 		start_blk = next_pgofs;
1956*4882a593Smuzhiyun 
1957*4882a593Smuzhiyun 		if (blks_to_bytes(inode, start_blk) < blks_to_bytes(inode,
1958*4882a593Smuzhiyun 						max_inode_blocks(inode)))
1959*4882a593Smuzhiyun 			goto prep_next;
1960*4882a593Smuzhiyun 
1961*4882a593Smuzhiyun 		flags |= FIEMAP_EXTENT_LAST;
1962*4882a593Smuzhiyun 	}
1963*4882a593Smuzhiyun 
1964*4882a593Smuzhiyun 	compr_appended = false;
1965*4882a593Smuzhiyun 	/* In a case of compressed cluster, append this to the last extent */
1966*4882a593Smuzhiyun 	if (compr_cluster && ((map.m_flags & F2FS_MAP_UNWRITTEN) ||
1967*4882a593Smuzhiyun 			!(map.m_flags & F2FS_MAP_FLAGS))) {
1968*4882a593Smuzhiyun 		compr_appended = true;
1969*4882a593Smuzhiyun 		goto skip_fill;
1970*4882a593Smuzhiyun 	}
1971*4882a593Smuzhiyun 
1972*4882a593Smuzhiyun 	if (size) {
1973*4882a593Smuzhiyun 		flags |= FIEMAP_EXTENT_MERGED;
1974*4882a593Smuzhiyun 		if (IS_ENCRYPTED(inode))
1975*4882a593Smuzhiyun 			flags |= FIEMAP_EXTENT_DATA_ENCRYPTED;
1976*4882a593Smuzhiyun 
1977*4882a593Smuzhiyun 		ret = fiemap_fill_next_extent(fieinfo, logical,
1978*4882a593Smuzhiyun 				phys, size, flags);
1979*4882a593Smuzhiyun 		trace_f2fs_fiemap(inode, logical, phys, size, flags, ret);
1980*4882a593Smuzhiyun 		if (ret)
1981*4882a593Smuzhiyun 			goto out;
1982*4882a593Smuzhiyun 		size = 0;
1983*4882a593Smuzhiyun 	}
1984*4882a593Smuzhiyun 
1985*4882a593Smuzhiyun 	if (start_blk > last_blk)
1986*4882a593Smuzhiyun 		goto out;
1987*4882a593Smuzhiyun 
1988*4882a593Smuzhiyun skip_fill:
1989*4882a593Smuzhiyun 	if (map.m_pblk == COMPRESS_ADDR) {
1990*4882a593Smuzhiyun 		compr_cluster = true;
1991*4882a593Smuzhiyun 		count_in_cluster = 1;
1992*4882a593Smuzhiyun 	} else if (compr_appended) {
1993*4882a593Smuzhiyun 		unsigned int appended_blks = cluster_size -
1994*4882a593Smuzhiyun 						count_in_cluster + 1;
1995*4882a593Smuzhiyun 		size += blks_to_bytes(inode, appended_blks);
1996*4882a593Smuzhiyun 		start_blk += appended_blks;
1997*4882a593Smuzhiyun 		compr_cluster = false;
1998*4882a593Smuzhiyun 	} else {
1999*4882a593Smuzhiyun 		logical = blks_to_bytes(inode, start_blk);
2000*4882a593Smuzhiyun 		phys = __is_valid_data_blkaddr(map.m_pblk) ?
2001*4882a593Smuzhiyun 			blks_to_bytes(inode, map.m_pblk) : 0;
2002*4882a593Smuzhiyun 		size = blks_to_bytes(inode, map.m_len);
2003*4882a593Smuzhiyun 		flags = 0;
2004*4882a593Smuzhiyun 
2005*4882a593Smuzhiyun 		if (compr_cluster) {
2006*4882a593Smuzhiyun 			flags = FIEMAP_EXTENT_ENCODED;
2007*4882a593Smuzhiyun 			count_in_cluster += map.m_len;
2008*4882a593Smuzhiyun 			if (count_in_cluster == cluster_size) {
2009*4882a593Smuzhiyun 				compr_cluster = false;
2010*4882a593Smuzhiyun 				size += blks_to_bytes(inode, 1);
2011*4882a593Smuzhiyun 			}
2012*4882a593Smuzhiyun 		} else if (map.m_flags & F2FS_MAP_UNWRITTEN) {
2013*4882a593Smuzhiyun 			flags = FIEMAP_EXTENT_UNWRITTEN;
2014*4882a593Smuzhiyun 		}
2015*4882a593Smuzhiyun 
2016*4882a593Smuzhiyun 		start_blk += bytes_to_blks(inode, size);
2017*4882a593Smuzhiyun 	}
2018*4882a593Smuzhiyun 
2019*4882a593Smuzhiyun prep_next:
2020*4882a593Smuzhiyun 	cond_resched();
2021*4882a593Smuzhiyun 	if (fatal_signal_pending(current))
2022*4882a593Smuzhiyun 		ret = -EINTR;
2023*4882a593Smuzhiyun 	else
2024*4882a593Smuzhiyun 		goto next;
2025*4882a593Smuzhiyun out:
2026*4882a593Smuzhiyun 	if (ret == 1)
2027*4882a593Smuzhiyun 		ret = 0;
2028*4882a593Smuzhiyun 
2029*4882a593Smuzhiyun 	inode_unlock(inode);
2030*4882a593Smuzhiyun 	return ret;
2031*4882a593Smuzhiyun }
2032*4882a593Smuzhiyun 
f2fs_readpage_limit(struct inode * inode)2033*4882a593Smuzhiyun static inline loff_t f2fs_readpage_limit(struct inode *inode)
2034*4882a593Smuzhiyun {
2035*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_FS_VERITY) &&
2036*4882a593Smuzhiyun 	    (IS_VERITY(inode) || f2fs_verity_in_progress(inode)))
2037*4882a593Smuzhiyun 		return inode->i_sb->s_maxbytes;
2038*4882a593Smuzhiyun 
2039*4882a593Smuzhiyun 	return i_size_read(inode);
2040*4882a593Smuzhiyun }
2041*4882a593Smuzhiyun 
f2fs_read_single_page(struct inode * inode,struct page * page,unsigned nr_pages,struct f2fs_map_blocks * map,struct bio ** bio_ret,sector_t * last_block_in_bio,bool is_readahead)2042*4882a593Smuzhiyun static int f2fs_read_single_page(struct inode *inode, struct page *page,
2043*4882a593Smuzhiyun 					unsigned nr_pages,
2044*4882a593Smuzhiyun 					struct f2fs_map_blocks *map,
2045*4882a593Smuzhiyun 					struct bio **bio_ret,
2046*4882a593Smuzhiyun 					sector_t *last_block_in_bio,
2047*4882a593Smuzhiyun 					bool is_readahead)
2048*4882a593Smuzhiyun {
2049*4882a593Smuzhiyun 	struct bio *bio = *bio_ret;
2050*4882a593Smuzhiyun 	const unsigned blocksize = blks_to_bytes(inode, 1);
2051*4882a593Smuzhiyun 	sector_t block_in_file;
2052*4882a593Smuzhiyun 	sector_t last_block;
2053*4882a593Smuzhiyun 	sector_t last_block_in_file;
2054*4882a593Smuzhiyun 	sector_t block_nr;
2055*4882a593Smuzhiyun 	int ret = 0;
2056*4882a593Smuzhiyun 
2057*4882a593Smuzhiyun 	block_in_file = (sector_t)page_index(page);
2058*4882a593Smuzhiyun 	last_block = block_in_file + nr_pages;
2059*4882a593Smuzhiyun 	last_block_in_file = bytes_to_blks(inode,
2060*4882a593Smuzhiyun 			f2fs_readpage_limit(inode) + blocksize - 1);
2061*4882a593Smuzhiyun 	if (last_block > last_block_in_file)
2062*4882a593Smuzhiyun 		last_block = last_block_in_file;
2063*4882a593Smuzhiyun 
2064*4882a593Smuzhiyun 	/* just zeroing out page which is beyond EOF */
2065*4882a593Smuzhiyun 	if (block_in_file >= last_block)
2066*4882a593Smuzhiyun 		goto zero_out;
2067*4882a593Smuzhiyun 	/*
2068*4882a593Smuzhiyun 	 * Map blocks using the previous result first.
2069*4882a593Smuzhiyun 	 */
2070*4882a593Smuzhiyun 	if ((map->m_flags & F2FS_MAP_MAPPED) &&
2071*4882a593Smuzhiyun 			block_in_file > map->m_lblk &&
2072*4882a593Smuzhiyun 			block_in_file < (map->m_lblk + map->m_len))
2073*4882a593Smuzhiyun 		goto got_it;
2074*4882a593Smuzhiyun 
2075*4882a593Smuzhiyun 	/*
2076*4882a593Smuzhiyun 	 * Then do more f2fs_map_blocks() calls until we are
2077*4882a593Smuzhiyun 	 * done with this page.
2078*4882a593Smuzhiyun 	 */
2079*4882a593Smuzhiyun 	map->m_lblk = block_in_file;
2080*4882a593Smuzhiyun 	map->m_len = last_block - block_in_file;
2081*4882a593Smuzhiyun 
2082*4882a593Smuzhiyun 	ret = f2fs_map_blocks(inode, map, 0, F2FS_GET_BLOCK_DEFAULT);
2083*4882a593Smuzhiyun 	if (ret)
2084*4882a593Smuzhiyun 		goto out;
2085*4882a593Smuzhiyun got_it:
2086*4882a593Smuzhiyun 	if ((map->m_flags & F2FS_MAP_MAPPED)) {
2087*4882a593Smuzhiyun 		block_nr = map->m_pblk + block_in_file - map->m_lblk;
2088*4882a593Smuzhiyun 		SetPageMappedToDisk(page);
2089*4882a593Smuzhiyun 
2090*4882a593Smuzhiyun 		if (!PageUptodate(page) && (!PageSwapCache(page) &&
2091*4882a593Smuzhiyun 					!cleancache_get_page(page))) {
2092*4882a593Smuzhiyun 			SetPageUptodate(page);
2093*4882a593Smuzhiyun 			goto confused;
2094*4882a593Smuzhiyun 		}
2095*4882a593Smuzhiyun 
2096*4882a593Smuzhiyun 		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr,
2097*4882a593Smuzhiyun 						DATA_GENERIC_ENHANCE_READ)) {
2098*4882a593Smuzhiyun 			ret = -EFSCORRUPTED;
2099*4882a593Smuzhiyun 			goto out;
2100*4882a593Smuzhiyun 		}
2101*4882a593Smuzhiyun 	} else {
2102*4882a593Smuzhiyun zero_out:
2103*4882a593Smuzhiyun 		zero_user_segment(page, 0, PAGE_SIZE);
2104*4882a593Smuzhiyun 		if (f2fs_need_verity(inode, page->index) &&
2105*4882a593Smuzhiyun 		    !fsverity_verify_page(page)) {
2106*4882a593Smuzhiyun 			ret = -EIO;
2107*4882a593Smuzhiyun 			goto out;
2108*4882a593Smuzhiyun 		}
2109*4882a593Smuzhiyun 		if (!PageUptodate(page))
2110*4882a593Smuzhiyun 			SetPageUptodate(page);
2111*4882a593Smuzhiyun 		unlock_page(page);
2112*4882a593Smuzhiyun 		goto out;
2113*4882a593Smuzhiyun 	}
2114*4882a593Smuzhiyun 
2115*4882a593Smuzhiyun 	/*
2116*4882a593Smuzhiyun 	 * This page will go to BIO.  Do we need to send this
2117*4882a593Smuzhiyun 	 * BIO off first?
2118*4882a593Smuzhiyun 	 */
2119*4882a593Smuzhiyun 	if (bio && (!page_is_mergeable(F2FS_I_SB(inode), bio,
2120*4882a593Smuzhiyun 				       *last_block_in_bio, block_nr) ||
2121*4882a593Smuzhiyun 		    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
2122*4882a593Smuzhiyun submit_and_realloc:
2123*4882a593Smuzhiyun 		__submit_bio(F2FS_I_SB(inode), bio, DATA);
2124*4882a593Smuzhiyun 		bio = NULL;
2125*4882a593Smuzhiyun 	}
2126*4882a593Smuzhiyun 	if (bio == NULL) {
2127*4882a593Smuzhiyun 		bio = f2fs_grab_read_bio(inode, block_nr, nr_pages,
2128*4882a593Smuzhiyun 				is_readahead ? REQ_RAHEAD : 0, page->index,
2129*4882a593Smuzhiyun 				false);
2130*4882a593Smuzhiyun 		if (IS_ERR(bio)) {
2131*4882a593Smuzhiyun 			ret = PTR_ERR(bio);
2132*4882a593Smuzhiyun 			bio = NULL;
2133*4882a593Smuzhiyun 			goto out;
2134*4882a593Smuzhiyun 		}
2135*4882a593Smuzhiyun 	}
2136*4882a593Smuzhiyun 
2137*4882a593Smuzhiyun 	/*
2138*4882a593Smuzhiyun 	 * If the page is under writeback, we need to wait for
2139*4882a593Smuzhiyun 	 * its completion to see the correct decrypted data.
2140*4882a593Smuzhiyun 	 */
2141*4882a593Smuzhiyun 	f2fs_wait_on_block_writeback(inode, block_nr);
2142*4882a593Smuzhiyun 
2143*4882a593Smuzhiyun 	if (bio_add_page(bio, page, blocksize, 0) < blocksize)
2144*4882a593Smuzhiyun 		goto submit_and_realloc;
2145*4882a593Smuzhiyun 
2146*4882a593Smuzhiyun 	inc_page_count(F2FS_I_SB(inode), F2FS_RD_DATA);
2147*4882a593Smuzhiyun 	f2fs_update_iostat(F2FS_I_SB(inode), FS_DATA_READ_IO, F2FS_BLKSIZE);
2148*4882a593Smuzhiyun 	ClearPageError(page);
2149*4882a593Smuzhiyun 	*last_block_in_bio = block_nr;
2150*4882a593Smuzhiyun 	goto out;
2151*4882a593Smuzhiyun confused:
2152*4882a593Smuzhiyun 	if (bio) {
2153*4882a593Smuzhiyun 		__submit_bio(F2FS_I_SB(inode), bio, DATA);
2154*4882a593Smuzhiyun 		bio = NULL;
2155*4882a593Smuzhiyun 	}
2156*4882a593Smuzhiyun 	unlock_page(page);
2157*4882a593Smuzhiyun out:
2158*4882a593Smuzhiyun 	*bio_ret = bio;
2159*4882a593Smuzhiyun 	return ret;
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
f2fs_read_multi_pages(struct compress_ctx * cc,struct bio ** bio_ret,unsigned nr_pages,sector_t * last_block_in_bio,bool is_readahead,bool for_write)2163*4882a593Smuzhiyun int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret,
2164*4882a593Smuzhiyun 				unsigned nr_pages, sector_t *last_block_in_bio,
2165*4882a593Smuzhiyun 				bool is_readahead, bool for_write)
2166*4882a593Smuzhiyun {
2167*4882a593Smuzhiyun 	struct dnode_of_data dn;
2168*4882a593Smuzhiyun 	struct inode *inode = cc->inode;
2169*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2170*4882a593Smuzhiyun 	struct bio *bio = *bio_ret;
2171*4882a593Smuzhiyun 	unsigned int start_idx = cc->cluster_idx << cc->log_cluster_size;
2172*4882a593Smuzhiyun 	sector_t last_block_in_file;
2173*4882a593Smuzhiyun 	const unsigned blocksize = blks_to_bytes(inode, 1);
2174*4882a593Smuzhiyun 	struct decompress_io_ctx *dic = NULL;
2175*4882a593Smuzhiyun 	struct extent_info ei = {};
2176*4882a593Smuzhiyun 	bool from_dnode = true;
2177*4882a593Smuzhiyun 	int i;
2178*4882a593Smuzhiyun 	int ret = 0;
2179*4882a593Smuzhiyun 
2180*4882a593Smuzhiyun 	f2fs_bug_on(sbi, f2fs_cluster_is_empty(cc));
2181*4882a593Smuzhiyun 
2182*4882a593Smuzhiyun 	last_block_in_file = bytes_to_blks(inode,
2183*4882a593Smuzhiyun 			f2fs_readpage_limit(inode) + blocksize - 1);
2184*4882a593Smuzhiyun 
2185*4882a593Smuzhiyun 	/* get rid of pages beyond EOF */
2186*4882a593Smuzhiyun 	for (i = 0; i < cc->cluster_size; i++) {
2187*4882a593Smuzhiyun 		struct page *page = cc->rpages[i];
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun 		if (!page)
2190*4882a593Smuzhiyun 			continue;
2191*4882a593Smuzhiyun 		if ((sector_t)page->index >= last_block_in_file) {
2192*4882a593Smuzhiyun 			zero_user_segment(page, 0, PAGE_SIZE);
2193*4882a593Smuzhiyun 			if (!PageUptodate(page))
2194*4882a593Smuzhiyun 				SetPageUptodate(page);
2195*4882a593Smuzhiyun 		} else if (!PageUptodate(page)) {
2196*4882a593Smuzhiyun 			continue;
2197*4882a593Smuzhiyun 		}
2198*4882a593Smuzhiyun 		unlock_page(page);
2199*4882a593Smuzhiyun 		if (for_write)
2200*4882a593Smuzhiyun 			put_page(page);
2201*4882a593Smuzhiyun 		cc->rpages[i] = NULL;
2202*4882a593Smuzhiyun 		cc->nr_rpages--;
2203*4882a593Smuzhiyun 	}
2204*4882a593Smuzhiyun 
2205*4882a593Smuzhiyun 	/* we are done since all pages are beyond EOF */
2206*4882a593Smuzhiyun 	if (f2fs_cluster_is_empty(cc))
2207*4882a593Smuzhiyun 		goto out;
2208*4882a593Smuzhiyun 
2209*4882a593Smuzhiyun 	if (f2fs_lookup_read_extent_cache(inode, start_idx, &ei))
2210*4882a593Smuzhiyun 		from_dnode = false;
2211*4882a593Smuzhiyun 
2212*4882a593Smuzhiyun 	if (!from_dnode)
2213*4882a593Smuzhiyun 		goto skip_reading_dnode;
2214*4882a593Smuzhiyun 
2215*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, NULL, NULL, 0);
2216*4882a593Smuzhiyun 	ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE);
2217*4882a593Smuzhiyun 	if (ret)
2218*4882a593Smuzhiyun 		goto out;
2219*4882a593Smuzhiyun 
2220*4882a593Smuzhiyun 	f2fs_bug_on(sbi, dn.data_blkaddr != COMPRESS_ADDR);
2221*4882a593Smuzhiyun 
2222*4882a593Smuzhiyun skip_reading_dnode:
2223*4882a593Smuzhiyun 	for (i = 1; i < cc->cluster_size; i++) {
2224*4882a593Smuzhiyun 		block_t blkaddr;
2225*4882a593Smuzhiyun 
2226*4882a593Smuzhiyun 		blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page,
2227*4882a593Smuzhiyun 					dn.ofs_in_node + i) :
2228*4882a593Smuzhiyun 					ei.blk + i - 1;
2229*4882a593Smuzhiyun 
2230*4882a593Smuzhiyun 		if (!__is_valid_data_blkaddr(blkaddr))
2231*4882a593Smuzhiyun 			break;
2232*4882a593Smuzhiyun 
2233*4882a593Smuzhiyun 		if (!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) {
2234*4882a593Smuzhiyun 			ret = -EFAULT;
2235*4882a593Smuzhiyun 			goto out_put_dnode;
2236*4882a593Smuzhiyun 		}
2237*4882a593Smuzhiyun 		cc->nr_cpages++;
2238*4882a593Smuzhiyun 
2239*4882a593Smuzhiyun 		if (!from_dnode && i >= ei.c_len)
2240*4882a593Smuzhiyun 			break;
2241*4882a593Smuzhiyun 	}
2242*4882a593Smuzhiyun 
2243*4882a593Smuzhiyun 	/* nothing to decompress */
2244*4882a593Smuzhiyun 	if (cc->nr_cpages == 0) {
2245*4882a593Smuzhiyun 		ret = 0;
2246*4882a593Smuzhiyun 		goto out_put_dnode;
2247*4882a593Smuzhiyun 	}
2248*4882a593Smuzhiyun 
2249*4882a593Smuzhiyun 	dic = f2fs_alloc_dic(cc);
2250*4882a593Smuzhiyun 	if (IS_ERR(dic)) {
2251*4882a593Smuzhiyun 		ret = PTR_ERR(dic);
2252*4882a593Smuzhiyun 		goto out_put_dnode;
2253*4882a593Smuzhiyun 	}
2254*4882a593Smuzhiyun 
2255*4882a593Smuzhiyun 	for (i = 0; i < cc->nr_cpages; i++) {
2256*4882a593Smuzhiyun 		struct page *page = dic->cpages[i];
2257*4882a593Smuzhiyun 		block_t blkaddr;
2258*4882a593Smuzhiyun 		struct bio_post_read_ctx *ctx;
2259*4882a593Smuzhiyun 
2260*4882a593Smuzhiyun 		blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page,
2261*4882a593Smuzhiyun 					dn.ofs_in_node + i + 1) :
2262*4882a593Smuzhiyun 					ei.blk + i;
2263*4882a593Smuzhiyun 
2264*4882a593Smuzhiyun 		f2fs_wait_on_block_writeback(inode, blkaddr);
2265*4882a593Smuzhiyun 
2266*4882a593Smuzhiyun 		if (f2fs_load_compressed_page(sbi, page, blkaddr)) {
2267*4882a593Smuzhiyun 			if (atomic_dec_and_test(&dic->remaining_pages))
2268*4882a593Smuzhiyun 				f2fs_decompress_cluster(dic, true);
2269*4882a593Smuzhiyun 			continue;
2270*4882a593Smuzhiyun 		}
2271*4882a593Smuzhiyun 
2272*4882a593Smuzhiyun 		if (bio && (!page_is_mergeable(sbi, bio,
2273*4882a593Smuzhiyun 					*last_block_in_bio, blkaddr) ||
2274*4882a593Smuzhiyun 		    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
2275*4882a593Smuzhiyun submit_and_realloc:
2276*4882a593Smuzhiyun 			__submit_bio(sbi, bio, DATA);
2277*4882a593Smuzhiyun 			bio = NULL;
2278*4882a593Smuzhiyun 		}
2279*4882a593Smuzhiyun 
2280*4882a593Smuzhiyun 		if (!bio) {
2281*4882a593Smuzhiyun 			bio = f2fs_grab_read_bio(inode, blkaddr, nr_pages,
2282*4882a593Smuzhiyun 					is_readahead ? REQ_RAHEAD : 0,
2283*4882a593Smuzhiyun 					page->index, for_write);
2284*4882a593Smuzhiyun 			if (IS_ERR(bio)) {
2285*4882a593Smuzhiyun 				ret = PTR_ERR(bio);
2286*4882a593Smuzhiyun 				f2fs_decompress_end_io(dic, ret, true);
2287*4882a593Smuzhiyun 				f2fs_put_dnode(&dn);
2288*4882a593Smuzhiyun 				*bio_ret = NULL;
2289*4882a593Smuzhiyun 				return ret;
2290*4882a593Smuzhiyun 			}
2291*4882a593Smuzhiyun 		}
2292*4882a593Smuzhiyun 
2293*4882a593Smuzhiyun 		if (bio_add_page(bio, page, blocksize, 0) < blocksize)
2294*4882a593Smuzhiyun 			goto submit_and_realloc;
2295*4882a593Smuzhiyun 
2296*4882a593Smuzhiyun 		ctx = bio->bi_private;
2297*4882a593Smuzhiyun 		ctx->enabled_steps |= STEP_DECOMPRESS;
2298*4882a593Smuzhiyun 		refcount_inc(&dic->refcnt);
2299*4882a593Smuzhiyun 
2300*4882a593Smuzhiyun 		inc_page_count(sbi, F2FS_RD_DATA);
2301*4882a593Smuzhiyun 		f2fs_update_iostat(sbi, FS_DATA_READ_IO, F2FS_BLKSIZE);
2302*4882a593Smuzhiyun 		f2fs_update_iostat(sbi, FS_CDATA_READ_IO, F2FS_BLKSIZE);
2303*4882a593Smuzhiyun 		ClearPageError(page);
2304*4882a593Smuzhiyun 		*last_block_in_bio = blkaddr;
2305*4882a593Smuzhiyun 	}
2306*4882a593Smuzhiyun 
2307*4882a593Smuzhiyun 	if (from_dnode)
2308*4882a593Smuzhiyun 		f2fs_put_dnode(&dn);
2309*4882a593Smuzhiyun 
2310*4882a593Smuzhiyun 	*bio_ret = bio;
2311*4882a593Smuzhiyun 	return 0;
2312*4882a593Smuzhiyun 
2313*4882a593Smuzhiyun out_put_dnode:
2314*4882a593Smuzhiyun 	if (from_dnode)
2315*4882a593Smuzhiyun 		f2fs_put_dnode(&dn);
2316*4882a593Smuzhiyun out:
2317*4882a593Smuzhiyun 	for (i = 0; i < cc->cluster_size; i++) {
2318*4882a593Smuzhiyun 		if (cc->rpages[i]) {
2319*4882a593Smuzhiyun 			ClearPageUptodate(cc->rpages[i]);
2320*4882a593Smuzhiyun 			ClearPageError(cc->rpages[i]);
2321*4882a593Smuzhiyun 			unlock_page(cc->rpages[i]);
2322*4882a593Smuzhiyun 		}
2323*4882a593Smuzhiyun 	}
2324*4882a593Smuzhiyun 	*bio_ret = bio;
2325*4882a593Smuzhiyun 	return ret;
2326*4882a593Smuzhiyun }
2327*4882a593Smuzhiyun #endif
2328*4882a593Smuzhiyun 
2329*4882a593Smuzhiyun /*
2330*4882a593Smuzhiyun  * This function was originally taken from fs/mpage.c, and customized for f2fs.
2331*4882a593Smuzhiyun  * Major change was from block_size == page_size in f2fs by default.
2332*4882a593Smuzhiyun  */
f2fs_mpage_readpages(struct inode * inode,struct readahead_control * rac,struct page * page)2333*4882a593Smuzhiyun static int f2fs_mpage_readpages(struct inode *inode,
2334*4882a593Smuzhiyun 		struct readahead_control *rac, struct page *page)
2335*4882a593Smuzhiyun {
2336*4882a593Smuzhiyun 	struct bio *bio = NULL;
2337*4882a593Smuzhiyun 	sector_t last_block_in_bio = 0;
2338*4882a593Smuzhiyun 	struct f2fs_map_blocks map;
2339*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2340*4882a593Smuzhiyun 	struct compress_ctx cc = {
2341*4882a593Smuzhiyun 		.inode = inode,
2342*4882a593Smuzhiyun 		.log_cluster_size = F2FS_I(inode)->i_log_cluster_size,
2343*4882a593Smuzhiyun 		.cluster_size = F2FS_I(inode)->i_cluster_size,
2344*4882a593Smuzhiyun 		.cluster_idx = NULL_CLUSTER,
2345*4882a593Smuzhiyun 		.rpages = NULL,
2346*4882a593Smuzhiyun 		.cpages = NULL,
2347*4882a593Smuzhiyun 		.nr_rpages = 0,
2348*4882a593Smuzhiyun 		.nr_cpages = 0,
2349*4882a593Smuzhiyun 	};
2350*4882a593Smuzhiyun #endif
2351*4882a593Smuzhiyun 	unsigned nr_pages = rac ? readahead_count(rac) : 1;
2352*4882a593Smuzhiyun 	unsigned max_nr_pages = nr_pages;
2353*4882a593Smuzhiyun 	int ret = 0;
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun 	map.m_pblk = 0;
2356*4882a593Smuzhiyun 	map.m_lblk = 0;
2357*4882a593Smuzhiyun 	map.m_len = 0;
2358*4882a593Smuzhiyun 	map.m_flags = 0;
2359*4882a593Smuzhiyun 	map.m_next_pgofs = NULL;
2360*4882a593Smuzhiyun 	map.m_next_extent = NULL;
2361*4882a593Smuzhiyun 	map.m_seg_type = NO_CHECK_TYPE;
2362*4882a593Smuzhiyun 	map.m_may_create = false;
2363*4882a593Smuzhiyun 
2364*4882a593Smuzhiyun 	for (; nr_pages; nr_pages--) {
2365*4882a593Smuzhiyun 		if (rac) {
2366*4882a593Smuzhiyun 			page = readahead_page(rac);
2367*4882a593Smuzhiyun 			prefetchw(&page->flags);
2368*4882a593Smuzhiyun 		}
2369*4882a593Smuzhiyun 
2370*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2371*4882a593Smuzhiyun 		if (f2fs_compressed_file(inode)) {
2372*4882a593Smuzhiyun 			/* there are remained comressed pages, submit them */
2373*4882a593Smuzhiyun 			if (!f2fs_cluster_can_merge_page(&cc, page->index)) {
2374*4882a593Smuzhiyun 				ret = f2fs_read_multi_pages(&cc, &bio,
2375*4882a593Smuzhiyun 							max_nr_pages,
2376*4882a593Smuzhiyun 							&last_block_in_bio,
2377*4882a593Smuzhiyun 							rac != NULL, false);
2378*4882a593Smuzhiyun 				f2fs_destroy_compress_ctx(&cc, false);
2379*4882a593Smuzhiyun 				if (ret)
2380*4882a593Smuzhiyun 					goto set_error_page;
2381*4882a593Smuzhiyun 			}
2382*4882a593Smuzhiyun 			ret = f2fs_is_compressed_cluster(inode, page->index);
2383*4882a593Smuzhiyun 			if (ret < 0)
2384*4882a593Smuzhiyun 				goto set_error_page;
2385*4882a593Smuzhiyun 			else if (!ret)
2386*4882a593Smuzhiyun 				goto read_single_page;
2387*4882a593Smuzhiyun 
2388*4882a593Smuzhiyun 			ret = f2fs_init_compress_ctx(&cc);
2389*4882a593Smuzhiyun 			if (ret)
2390*4882a593Smuzhiyun 				goto set_error_page;
2391*4882a593Smuzhiyun 
2392*4882a593Smuzhiyun 			f2fs_compress_ctx_add_page(&cc, page);
2393*4882a593Smuzhiyun 
2394*4882a593Smuzhiyun 			goto next_page;
2395*4882a593Smuzhiyun 		}
2396*4882a593Smuzhiyun read_single_page:
2397*4882a593Smuzhiyun #endif
2398*4882a593Smuzhiyun 
2399*4882a593Smuzhiyun 		ret = f2fs_read_single_page(inode, page, max_nr_pages, &map,
2400*4882a593Smuzhiyun 					&bio, &last_block_in_bio, rac);
2401*4882a593Smuzhiyun 		if (ret) {
2402*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2403*4882a593Smuzhiyun set_error_page:
2404*4882a593Smuzhiyun #endif
2405*4882a593Smuzhiyun 			SetPageError(page);
2406*4882a593Smuzhiyun 			zero_user_segment(page, 0, PAGE_SIZE);
2407*4882a593Smuzhiyun 			unlock_page(page);
2408*4882a593Smuzhiyun 		}
2409*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2410*4882a593Smuzhiyun next_page:
2411*4882a593Smuzhiyun #endif
2412*4882a593Smuzhiyun 		if (rac)
2413*4882a593Smuzhiyun 			put_page(page);
2414*4882a593Smuzhiyun 
2415*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2416*4882a593Smuzhiyun 		if (f2fs_compressed_file(inode)) {
2417*4882a593Smuzhiyun 			/* last page */
2418*4882a593Smuzhiyun 			if (nr_pages == 1 && !f2fs_cluster_is_empty(&cc)) {
2419*4882a593Smuzhiyun 				ret = f2fs_read_multi_pages(&cc, &bio,
2420*4882a593Smuzhiyun 							max_nr_pages,
2421*4882a593Smuzhiyun 							&last_block_in_bio,
2422*4882a593Smuzhiyun 							rac != NULL, false);
2423*4882a593Smuzhiyun 				f2fs_destroy_compress_ctx(&cc, false);
2424*4882a593Smuzhiyun 			}
2425*4882a593Smuzhiyun 		}
2426*4882a593Smuzhiyun #endif
2427*4882a593Smuzhiyun 	}
2428*4882a593Smuzhiyun 	if (bio)
2429*4882a593Smuzhiyun 		__submit_bio(F2FS_I_SB(inode), bio, DATA);
2430*4882a593Smuzhiyun 	return ret;
2431*4882a593Smuzhiyun }
2432*4882a593Smuzhiyun 
f2fs_read_data_page(struct file * file,struct page * page)2433*4882a593Smuzhiyun static int f2fs_read_data_page(struct file *file, struct page *page)
2434*4882a593Smuzhiyun {
2435*4882a593Smuzhiyun 	struct inode *inode = page_file_mapping(page)->host;
2436*4882a593Smuzhiyun 	int ret = -EAGAIN;
2437*4882a593Smuzhiyun 
2438*4882a593Smuzhiyun 	trace_f2fs_readpage(page, DATA);
2439*4882a593Smuzhiyun 
2440*4882a593Smuzhiyun 	if (!f2fs_is_compress_backend_ready(inode)) {
2441*4882a593Smuzhiyun 		unlock_page(page);
2442*4882a593Smuzhiyun 		return -EOPNOTSUPP;
2443*4882a593Smuzhiyun 	}
2444*4882a593Smuzhiyun 
2445*4882a593Smuzhiyun 	/* If the file has inline data, try to read it directly */
2446*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode))
2447*4882a593Smuzhiyun 		ret = f2fs_read_inline_data(inode, page);
2448*4882a593Smuzhiyun 	if (ret == -EAGAIN)
2449*4882a593Smuzhiyun 		ret = f2fs_mpage_readpages(inode, NULL, page);
2450*4882a593Smuzhiyun 	return ret;
2451*4882a593Smuzhiyun }
2452*4882a593Smuzhiyun 
f2fs_readahead(struct readahead_control * rac)2453*4882a593Smuzhiyun static void f2fs_readahead(struct readahead_control *rac)
2454*4882a593Smuzhiyun {
2455*4882a593Smuzhiyun 	struct inode *inode = rac->mapping->host;
2456*4882a593Smuzhiyun 
2457*4882a593Smuzhiyun 	trace_f2fs_readpages(inode, readahead_index(rac), readahead_count(rac));
2458*4882a593Smuzhiyun 
2459*4882a593Smuzhiyun 	if (!f2fs_is_compress_backend_ready(inode))
2460*4882a593Smuzhiyun 		return;
2461*4882a593Smuzhiyun 
2462*4882a593Smuzhiyun 	/* If the file has inline data, skip readpages */
2463*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode))
2464*4882a593Smuzhiyun 		return;
2465*4882a593Smuzhiyun 
2466*4882a593Smuzhiyun 	f2fs_mpage_readpages(inode, rac, NULL);
2467*4882a593Smuzhiyun }
2468*4882a593Smuzhiyun 
f2fs_encrypt_one_page(struct f2fs_io_info * fio)2469*4882a593Smuzhiyun int f2fs_encrypt_one_page(struct f2fs_io_info *fio)
2470*4882a593Smuzhiyun {
2471*4882a593Smuzhiyun 	struct inode *inode = fio->page->mapping->host;
2472*4882a593Smuzhiyun 	struct page *mpage, *page;
2473*4882a593Smuzhiyun 	gfp_t gfp_flags = GFP_NOFS;
2474*4882a593Smuzhiyun 
2475*4882a593Smuzhiyun 	if (!f2fs_encrypted_file(inode))
2476*4882a593Smuzhiyun 		return 0;
2477*4882a593Smuzhiyun 
2478*4882a593Smuzhiyun 	page = fio->compressed_page ? fio->compressed_page : fio->page;
2479*4882a593Smuzhiyun 
2480*4882a593Smuzhiyun 	/* wait for GCed page writeback via META_MAPPING */
2481*4882a593Smuzhiyun 	f2fs_wait_on_block_writeback(inode, fio->old_blkaddr);
2482*4882a593Smuzhiyun 
2483*4882a593Smuzhiyun 	if (fscrypt_inode_uses_inline_crypto(inode))
2484*4882a593Smuzhiyun 		return 0;
2485*4882a593Smuzhiyun 
2486*4882a593Smuzhiyun retry_encrypt:
2487*4882a593Smuzhiyun 	fio->encrypted_page = fscrypt_encrypt_pagecache_blocks(page,
2488*4882a593Smuzhiyun 					PAGE_SIZE, 0, gfp_flags);
2489*4882a593Smuzhiyun 	if (IS_ERR(fio->encrypted_page)) {
2490*4882a593Smuzhiyun 		/* flush pending IOs and wait for a while in the ENOMEM case */
2491*4882a593Smuzhiyun 		if (PTR_ERR(fio->encrypted_page) == -ENOMEM) {
2492*4882a593Smuzhiyun 			f2fs_flush_merged_writes(fio->sbi);
2493*4882a593Smuzhiyun 			congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT);
2494*4882a593Smuzhiyun 			gfp_flags |= __GFP_NOFAIL;
2495*4882a593Smuzhiyun 			goto retry_encrypt;
2496*4882a593Smuzhiyun 		}
2497*4882a593Smuzhiyun 		return PTR_ERR(fio->encrypted_page);
2498*4882a593Smuzhiyun 	}
2499*4882a593Smuzhiyun 
2500*4882a593Smuzhiyun 	mpage = find_lock_page(META_MAPPING(fio->sbi), fio->old_blkaddr);
2501*4882a593Smuzhiyun 	if (mpage) {
2502*4882a593Smuzhiyun 		if (PageUptodate(mpage))
2503*4882a593Smuzhiyun 			memcpy(page_address(mpage),
2504*4882a593Smuzhiyun 				page_address(fio->encrypted_page), PAGE_SIZE);
2505*4882a593Smuzhiyun 		f2fs_put_page(mpage, 1);
2506*4882a593Smuzhiyun 	}
2507*4882a593Smuzhiyun 	return 0;
2508*4882a593Smuzhiyun }
2509*4882a593Smuzhiyun 
check_inplace_update_policy(struct inode * inode,struct f2fs_io_info * fio)2510*4882a593Smuzhiyun static inline bool check_inplace_update_policy(struct inode *inode,
2511*4882a593Smuzhiyun 				struct f2fs_io_info *fio)
2512*4882a593Smuzhiyun {
2513*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2514*4882a593Smuzhiyun 	unsigned int policy = SM_I(sbi)->ipu_policy;
2515*4882a593Smuzhiyun 
2516*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_HONOR_OPU_WRITE) &&
2517*4882a593Smuzhiyun 			is_inode_flag_set(inode, FI_OPU_WRITE))
2518*4882a593Smuzhiyun 		return false;
2519*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_FORCE))
2520*4882a593Smuzhiyun 		return true;
2521*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_SSR) && f2fs_need_SSR(sbi))
2522*4882a593Smuzhiyun 		return true;
2523*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_UTIL) &&
2524*4882a593Smuzhiyun 			utilization(sbi) > SM_I(sbi)->min_ipu_util)
2525*4882a593Smuzhiyun 		return true;
2526*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_SSR_UTIL) && f2fs_need_SSR(sbi) &&
2527*4882a593Smuzhiyun 			utilization(sbi) > SM_I(sbi)->min_ipu_util)
2528*4882a593Smuzhiyun 		return true;
2529*4882a593Smuzhiyun 
2530*4882a593Smuzhiyun 	/*
2531*4882a593Smuzhiyun 	 * IPU for rewrite async pages
2532*4882a593Smuzhiyun 	 */
2533*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_ASYNC) &&
2534*4882a593Smuzhiyun 			fio && fio->op == REQ_OP_WRITE &&
2535*4882a593Smuzhiyun 			!(fio->op_flags & REQ_SYNC) &&
2536*4882a593Smuzhiyun 			!IS_ENCRYPTED(inode))
2537*4882a593Smuzhiyun 		return true;
2538*4882a593Smuzhiyun 
2539*4882a593Smuzhiyun 	/* this is only set during fdatasync */
2540*4882a593Smuzhiyun 	if (policy & (0x1 << F2FS_IPU_FSYNC) &&
2541*4882a593Smuzhiyun 			is_inode_flag_set(inode, FI_NEED_IPU))
2542*4882a593Smuzhiyun 		return true;
2543*4882a593Smuzhiyun 
2544*4882a593Smuzhiyun 	if (unlikely(fio && is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
2545*4882a593Smuzhiyun 			!f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2546*4882a593Smuzhiyun 		return true;
2547*4882a593Smuzhiyun 
2548*4882a593Smuzhiyun 	return false;
2549*4882a593Smuzhiyun }
2550*4882a593Smuzhiyun 
f2fs_should_update_inplace(struct inode * inode,struct f2fs_io_info * fio)2551*4882a593Smuzhiyun bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
2552*4882a593Smuzhiyun {
2553*4882a593Smuzhiyun 	/* swap file is migrating in aligned write mode */
2554*4882a593Smuzhiyun 	if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
2555*4882a593Smuzhiyun 		return false;
2556*4882a593Smuzhiyun 
2557*4882a593Smuzhiyun 	if (f2fs_is_pinned_file(inode))
2558*4882a593Smuzhiyun 		return true;
2559*4882a593Smuzhiyun 
2560*4882a593Smuzhiyun 	/* if this is cold file, we should overwrite to avoid fragmentation */
2561*4882a593Smuzhiyun 	if (file_is_cold(inode) && !is_inode_flag_set(inode, FI_OPU_WRITE))
2562*4882a593Smuzhiyun 		return true;
2563*4882a593Smuzhiyun 
2564*4882a593Smuzhiyun 	return check_inplace_update_policy(inode, fio);
2565*4882a593Smuzhiyun }
2566*4882a593Smuzhiyun 
f2fs_should_update_outplace(struct inode * inode,struct f2fs_io_info * fio)2567*4882a593Smuzhiyun bool f2fs_should_update_outplace(struct inode *inode, struct f2fs_io_info *fio)
2568*4882a593Smuzhiyun {
2569*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2570*4882a593Smuzhiyun 
2571*4882a593Smuzhiyun 	/* The below cases were checked when setting it. */
2572*4882a593Smuzhiyun 	if (f2fs_is_pinned_file(inode))
2573*4882a593Smuzhiyun 		return false;
2574*4882a593Smuzhiyun 	if (fio && is_sbi_flag_set(sbi, SBI_NEED_FSCK))
2575*4882a593Smuzhiyun 		return true;
2576*4882a593Smuzhiyun 	if (f2fs_lfs_mode(sbi))
2577*4882a593Smuzhiyun 		return true;
2578*4882a593Smuzhiyun 	if (S_ISDIR(inode->i_mode))
2579*4882a593Smuzhiyun 		return true;
2580*4882a593Smuzhiyun 	if (IS_NOQUOTA(inode))
2581*4882a593Smuzhiyun 		return true;
2582*4882a593Smuzhiyun 	if (f2fs_is_atomic_file(inode))
2583*4882a593Smuzhiyun 		return true;
2584*4882a593Smuzhiyun 
2585*4882a593Smuzhiyun 	/* swap file is migrating in aligned write mode */
2586*4882a593Smuzhiyun 	if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
2587*4882a593Smuzhiyun 		return true;
2588*4882a593Smuzhiyun 
2589*4882a593Smuzhiyun 	if (is_inode_flag_set(inode, FI_OPU_WRITE))
2590*4882a593Smuzhiyun 		return true;
2591*4882a593Smuzhiyun 
2592*4882a593Smuzhiyun 	if (fio) {
2593*4882a593Smuzhiyun 		if (page_private_gcing(fio->page))
2594*4882a593Smuzhiyun 			return true;
2595*4882a593Smuzhiyun 		if (page_private_dummy(fio->page))
2596*4882a593Smuzhiyun 			return true;
2597*4882a593Smuzhiyun 		if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
2598*4882a593Smuzhiyun 			f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2599*4882a593Smuzhiyun 			return true;
2600*4882a593Smuzhiyun 	}
2601*4882a593Smuzhiyun 	return false;
2602*4882a593Smuzhiyun }
2603*4882a593Smuzhiyun 
need_inplace_update(struct f2fs_io_info * fio)2604*4882a593Smuzhiyun static inline bool need_inplace_update(struct f2fs_io_info *fio)
2605*4882a593Smuzhiyun {
2606*4882a593Smuzhiyun 	struct inode *inode = fio->page->mapping->host;
2607*4882a593Smuzhiyun 
2608*4882a593Smuzhiyun 	if (f2fs_should_update_outplace(inode, fio))
2609*4882a593Smuzhiyun 		return false;
2610*4882a593Smuzhiyun 
2611*4882a593Smuzhiyun 	return f2fs_should_update_inplace(inode, fio);
2612*4882a593Smuzhiyun }
2613*4882a593Smuzhiyun 
f2fs_do_write_data_page(struct f2fs_io_info * fio)2614*4882a593Smuzhiyun int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2615*4882a593Smuzhiyun {
2616*4882a593Smuzhiyun 	struct page *page = fio->page;
2617*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
2618*4882a593Smuzhiyun 	struct dnode_of_data dn;
2619*4882a593Smuzhiyun 	struct extent_info ei = {0, };
2620*4882a593Smuzhiyun 	struct node_info ni;
2621*4882a593Smuzhiyun 	bool ipu_force = false;
2622*4882a593Smuzhiyun 	int err = 0;
2623*4882a593Smuzhiyun 
2624*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, NULL, NULL, 0);
2625*4882a593Smuzhiyun 	if (need_inplace_update(fio) &&
2626*4882a593Smuzhiyun 	    f2fs_lookup_read_extent_cache(inode, page->index, &ei)) {
2627*4882a593Smuzhiyun 		fio->old_blkaddr = ei.blk + page->index - ei.fofs;
2628*4882a593Smuzhiyun 
2629*4882a593Smuzhiyun 		if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
2630*4882a593Smuzhiyun 						DATA_GENERIC_ENHANCE))
2631*4882a593Smuzhiyun 			return -EFSCORRUPTED;
2632*4882a593Smuzhiyun 
2633*4882a593Smuzhiyun 		ipu_force = true;
2634*4882a593Smuzhiyun 		fio->need_lock = LOCK_DONE;
2635*4882a593Smuzhiyun 		goto got_it;
2636*4882a593Smuzhiyun 	}
2637*4882a593Smuzhiyun 
2638*4882a593Smuzhiyun 	/* Deadlock due to between page->lock and f2fs_lock_op */
2639*4882a593Smuzhiyun 	if (fio->need_lock == LOCK_REQ && !f2fs_trylock_op(fio->sbi))
2640*4882a593Smuzhiyun 		return -EAGAIN;
2641*4882a593Smuzhiyun 
2642*4882a593Smuzhiyun 	err = f2fs_get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
2643*4882a593Smuzhiyun 	if (err)
2644*4882a593Smuzhiyun 		goto out;
2645*4882a593Smuzhiyun 
2646*4882a593Smuzhiyun 	fio->old_blkaddr = dn.data_blkaddr;
2647*4882a593Smuzhiyun 
2648*4882a593Smuzhiyun 	/* This page is already truncated */
2649*4882a593Smuzhiyun 	if (fio->old_blkaddr == NULL_ADDR) {
2650*4882a593Smuzhiyun 		ClearPageUptodate(page);
2651*4882a593Smuzhiyun 		clear_page_private_gcing(page);
2652*4882a593Smuzhiyun 		goto out_writepage;
2653*4882a593Smuzhiyun 	}
2654*4882a593Smuzhiyun got_it:
2655*4882a593Smuzhiyun 	if (__is_valid_data_blkaddr(fio->old_blkaddr) &&
2656*4882a593Smuzhiyun 		!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
2657*4882a593Smuzhiyun 						DATA_GENERIC_ENHANCE)) {
2658*4882a593Smuzhiyun 		err = -EFSCORRUPTED;
2659*4882a593Smuzhiyun 		goto out_writepage;
2660*4882a593Smuzhiyun 	}
2661*4882a593Smuzhiyun 	/*
2662*4882a593Smuzhiyun 	 * If current allocation needs SSR,
2663*4882a593Smuzhiyun 	 * it had better in-place writes for updated data.
2664*4882a593Smuzhiyun 	 */
2665*4882a593Smuzhiyun 	if (ipu_force ||
2666*4882a593Smuzhiyun 		(__is_valid_data_blkaddr(fio->old_blkaddr) &&
2667*4882a593Smuzhiyun 					need_inplace_update(fio))) {
2668*4882a593Smuzhiyun 		err = f2fs_encrypt_one_page(fio);
2669*4882a593Smuzhiyun 		if (err)
2670*4882a593Smuzhiyun 			goto out_writepage;
2671*4882a593Smuzhiyun 
2672*4882a593Smuzhiyun 		set_page_writeback(page);
2673*4882a593Smuzhiyun 		ClearPageError(page);
2674*4882a593Smuzhiyun 		f2fs_put_dnode(&dn);
2675*4882a593Smuzhiyun 		if (fio->need_lock == LOCK_REQ)
2676*4882a593Smuzhiyun 			f2fs_unlock_op(fio->sbi);
2677*4882a593Smuzhiyun 		err = f2fs_inplace_write_data(fio);
2678*4882a593Smuzhiyun 		if (err) {
2679*4882a593Smuzhiyun 			if (fscrypt_inode_uses_fs_layer_crypto(inode))
2680*4882a593Smuzhiyun 				fscrypt_finalize_bounce_page(&fio->encrypted_page);
2681*4882a593Smuzhiyun 			if (PageWriteback(page))
2682*4882a593Smuzhiyun 				end_page_writeback(page);
2683*4882a593Smuzhiyun 		} else {
2684*4882a593Smuzhiyun 			set_inode_flag(inode, FI_UPDATE_WRITE);
2685*4882a593Smuzhiyun 		}
2686*4882a593Smuzhiyun 		trace_f2fs_do_write_data_page(fio->page, IPU);
2687*4882a593Smuzhiyun 		return err;
2688*4882a593Smuzhiyun 	}
2689*4882a593Smuzhiyun 
2690*4882a593Smuzhiyun 	if (fio->need_lock == LOCK_RETRY) {
2691*4882a593Smuzhiyun 		if (!f2fs_trylock_op(fio->sbi)) {
2692*4882a593Smuzhiyun 			err = -EAGAIN;
2693*4882a593Smuzhiyun 			goto out_writepage;
2694*4882a593Smuzhiyun 		}
2695*4882a593Smuzhiyun 		fio->need_lock = LOCK_REQ;
2696*4882a593Smuzhiyun 	}
2697*4882a593Smuzhiyun 
2698*4882a593Smuzhiyun 	err = f2fs_get_node_info(fio->sbi, dn.nid, &ni, false);
2699*4882a593Smuzhiyun 	if (err)
2700*4882a593Smuzhiyun 		goto out_writepage;
2701*4882a593Smuzhiyun 
2702*4882a593Smuzhiyun 	fio->version = ni.version;
2703*4882a593Smuzhiyun 
2704*4882a593Smuzhiyun 	err = f2fs_encrypt_one_page(fio);
2705*4882a593Smuzhiyun 	if (err)
2706*4882a593Smuzhiyun 		goto out_writepage;
2707*4882a593Smuzhiyun 
2708*4882a593Smuzhiyun 	set_page_writeback(page);
2709*4882a593Smuzhiyun 	ClearPageError(page);
2710*4882a593Smuzhiyun 
2711*4882a593Smuzhiyun 	if (fio->compr_blocks && fio->old_blkaddr == COMPRESS_ADDR)
2712*4882a593Smuzhiyun 		f2fs_i_compr_blocks_update(inode, fio->compr_blocks - 1, false);
2713*4882a593Smuzhiyun 
2714*4882a593Smuzhiyun 	/* LFS mode write path */
2715*4882a593Smuzhiyun 	f2fs_outplace_write_data(&dn, fio);
2716*4882a593Smuzhiyun 	trace_f2fs_do_write_data_page(page, OPU);
2717*4882a593Smuzhiyun 	set_inode_flag(inode, FI_APPEND_WRITE);
2718*4882a593Smuzhiyun 	if (page->index == 0)
2719*4882a593Smuzhiyun 		set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
2720*4882a593Smuzhiyun out_writepage:
2721*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
2722*4882a593Smuzhiyun out:
2723*4882a593Smuzhiyun 	if (fio->need_lock == LOCK_REQ)
2724*4882a593Smuzhiyun 		f2fs_unlock_op(fio->sbi);
2725*4882a593Smuzhiyun 	return err;
2726*4882a593Smuzhiyun }
2727*4882a593Smuzhiyun 
f2fs_write_single_data_page(struct page * page,int * submitted,struct bio ** bio,sector_t * last_block,struct writeback_control * wbc,enum iostat_type io_type,int compr_blocks,bool allow_balance)2728*4882a593Smuzhiyun int f2fs_write_single_data_page(struct page *page, int *submitted,
2729*4882a593Smuzhiyun 				struct bio **bio,
2730*4882a593Smuzhiyun 				sector_t *last_block,
2731*4882a593Smuzhiyun 				struct writeback_control *wbc,
2732*4882a593Smuzhiyun 				enum iostat_type io_type,
2733*4882a593Smuzhiyun 				int compr_blocks,
2734*4882a593Smuzhiyun 				bool allow_balance)
2735*4882a593Smuzhiyun {
2736*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
2737*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2738*4882a593Smuzhiyun 	loff_t i_size = i_size_read(inode);
2739*4882a593Smuzhiyun 	const pgoff_t end_index = ((unsigned long long)i_size)
2740*4882a593Smuzhiyun 							>> PAGE_SHIFT;
2741*4882a593Smuzhiyun 	loff_t psize = (loff_t)(page->index + 1) << PAGE_SHIFT;
2742*4882a593Smuzhiyun 	unsigned offset = 0;
2743*4882a593Smuzhiyun 	bool need_balance_fs = false;
2744*4882a593Smuzhiyun 	int err = 0;
2745*4882a593Smuzhiyun 	struct f2fs_io_info fio = {
2746*4882a593Smuzhiyun 		.sbi = sbi,
2747*4882a593Smuzhiyun 		.ino = inode->i_ino,
2748*4882a593Smuzhiyun 		.type = DATA,
2749*4882a593Smuzhiyun 		.op = REQ_OP_WRITE,
2750*4882a593Smuzhiyun 		.op_flags = wbc_to_write_flags(wbc),
2751*4882a593Smuzhiyun 		.old_blkaddr = NULL_ADDR,
2752*4882a593Smuzhiyun 		.page = page,
2753*4882a593Smuzhiyun 		.encrypted_page = NULL,
2754*4882a593Smuzhiyun 		.submitted = false,
2755*4882a593Smuzhiyun 		.compr_blocks = compr_blocks,
2756*4882a593Smuzhiyun 		.need_lock = LOCK_RETRY,
2757*4882a593Smuzhiyun 		.post_read = f2fs_post_read_required(inode),
2758*4882a593Smuzhiyun 		.io_type = io_type,
2759*4882a593Smuzhiyun 		.io_wbc = wbc,
2760*4882a593Smuzhiyun 		.bio = bio,
2761*4882a593Smuzhiyun 		.last_block = last_block,
2762*4882a593Smuzhiyun 	};
2763*4882a593Smuzhiyun 
2764*4882a593Smuzhiyun 	trace_f2fs_writepage(page, DATA);
2765*4882a593Smuzhiyun 
2766*4882a593Smuzhiyun 	/* we should bypass data pages to proceed the kworkder jobs */
2767*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi))) {
2768*4882a593Smuzhiyun 		mapping_set_error(page->mapping, -EIO);
2769*4882a593Smuzhiyun 		/*
2770*4882a593Smuzhiyun 		 * don't drop any dirty dentry pages for keeping lastest
2771*4882a593Smuzhiyun 		 * directory structure.
2772*4882a593Smuzhiyun 		 */
2773*4882a593Smuzhiyun 		if (S_ISDIR(inode->i_mode))
2774*4882a593Smuzhiyun 			goto redirty_out;
2775*4882a593Smuzhiyun 		goto out;
2776*4882a593Smuzhiyun 	}
2777*4882a593Smuzhiyun 
2778*4882a593Smuzhiyun 	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
2779*4882a593Smuzhiyun 		goto redirty_out;
2780*4882a593Smuzhiyun 
2781*4882a593Smuzhiyun 	if (page->index < end_index ||
2782*4882a593Smuzhiyun 			f2fs_verity_in_progress(inode) ||
2783*4882a593Smuzhiyun 			compr_blocks)
2784*4882a593Smuzhiyun 		goto write;
2785*4882a593Smuzhiyun 
2786*4882a593Smuzhiyun 	/*
2787*4882a593Smuzhiyun 	 * If the offset is out-of-range of file size,
2788*4882a593Smuzhiyun 	 * this page does not have to be written to disk.
2789*4882a593Smuzhiyun 	 */
2790*4882a593Smuzhiyun 	offset = i_size & (PAGE_SIZE - 1);
2791*4882a593Smuzhiyun 	if ((page->index >= end_index + 1) || !offset)
2792*4882a593Smuzhiyun 		goto out;
2793*4882a593Smuzhiyun 
2794*4882a593Smuzhiyun 	zero_user_segment(page, offset, PAGE_SIZE);
2795*4882a593Smuzhiyun write:
2796*4882a593Smuzhiyun 	if (f2fs_is_drop_cache(inode))
2797*4882a593Smuzhiyun 		goto out;
2798*4882a593Smuzhiyun 	/* we should not write 0'th page having journal header */
2799*4882a593Smuzhiyun 	if (f2fs_is_volatile_file(inode) && (!page->index ||
2800*4882a593Smuzhiyun 			(!wbc->for_reclaim &&
2801*4882a593Smuzhiyun 			f2fs_available_free_memory(sbi, BASE_CHECK))))
2802*4882a593Smuzhiyun 		goto redirty_out;
2803*4882a593Smuzhiyun 
2804*4882a593Smuzhiyun 	/* Dentry/quota blocks are controlled by checkpoint */
2805*4882a593Smuzhiyun 	if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
2806*4882a593Smuzhiyun 		/*
2807*4882a593Smuzhiyun 		 * We need to wait for node_write to avoid block allocation during
2808*4882a593Smuzhiyun 		 * checkpoint. This can only happen to quota writes which can cause
2809*4882a593Smuzhiyun 		 * the below discard race condition.
2810*4882a593Smuzhiyun 		 */
2811*4882a593Smuzhiyun 		if (IS_NOQUOTA(inode))
2812*4882a593Smuzhiyun 			f2fs_down_read(&sbi->node_write);
2813*4882a593Smuzhiyun 
2814*4882a593Smuzhiyun 		fio.need_lock = LOCK_DONE;
2815*4882a593Smuzhiyun 		err = f2fs_do_write_data_page(&fio);
2816*4882a593Smuzhiyun 
2817*4882a593Smuzhiyun 		if (IS_NOQUOTA(inode))
2818*4882a593Smuzhiyun 			f2fs_up_read(&sbi->node_write);
2819*4882a593Smuzhiyun 
2820*4882a593Smuzhiyun 		goto done;
2821*4882a593Smuzhiyun 	}
2822*4882a593Smuzhiyun 
2823*4882a593Smuzhiyun 	if (!wbc->for_reclaim)
2824*4882a593Smuzhiyun 		need_balance_fs = true;
2825*4882a593Smuzhiyun 	else if (has_not_enough_free_secs(sbi, 0, 0))
2826*4882a593Smuzhiyun 		goto redirty_out;
2827*4882a593Smuzhiyun 	else
2828*4882a593Smuzhiyun 		set_inode_flag(inode, FI_HOT_DATA);
2829*4882a593Smuzhiyun 
2830*4882a593Smuzhiyun 	err = -EAGAIN;
2831*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode)) {
2832*4882a593Smuzhiyun 		err = f2fs_write_inline_data(inode, page);
2833*4882a593Smuzhiyun 		if (!err)
2834*4882a593Smuzhiyun 			goto out;
2835*4882a593Smuzhiyun 	}
2836*4882a593Smuzhiyun 
2837*4882a593Smuzhiyun 	if (err == -EAGAIN) {
2838*4882a593Smuzhiyun 		err = f2fs_do_write_data_page(&fio);
2839*4882a593Smuzhiyun 		if (err == -EAGAIN) {
2840*4882a593Smuzhiyun 			fio.need_lock = LOCK_REQ;
2841*4882a593Smuzhiyun 			err = f2fs_do_write_data_page(&fio);
2842*4882a593Smuzhiyun 		}
2843*4882a593Smuzhiyun 	}
2844*4882a593Smuzhiyun 
2845*4882a593Smuzhiyun 	if (err) {
2846*4882a593Smuzhiyun 		file_set_keep_isize(inode);
2847*4882a593Smuzhiyun 	} else {
2848*4882a593Smuzhiyun 		spin_lock(&F2FS_I(inode)->i_size_lock);
2849*4882a593Smuzhiyun 		if (F2FS_I(inode)->last_disk_size < psize)
2850*4882a593Smuzhiyun 			F2FS_I(inode)->last_disk_size = psize;
2851*4882a593Smuzhiyun 		spin_unlock(&F2FS_I(inode)->i_size_lock);
2852*4882a593Smuzhiyun 	}
2853*4882a593Smuzhiyun 
2854*4882a593Smuzhiyun done:
2855*4882a593Smuzhiyun 	if (err && err != -ENOENT)
2856*4882a593Smuzhiyun 		goto redirty_out;
2857*4882a593Smuzhiyun 
2858*4882a593Smuzhiyun out:
2859*4882a593Smuzhiyun 	inode_dec_dirty_pages(inode);
2860*4882a593Smuzhiyun 	if (err) {
2861*4882a593Smuzhiyun 		ClearPageUptodate(page);
2862*4882a593Smuzhiyun 		clear_page_private_gcing(page);
2863*4882a593Smuzhiyun 	}
2864*4882a593Smuzhiyun 
2865*4882a593Smuzhiyun 	if (wbc->for_reclaim) {
2866*4882a593Smuzhiyun 		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, DATA);
2867*4882a593Smuzhiyun 		clear_inode_flag(inode, FI_HOT_DATA);
2868*4882a593Smuzhiyun 		f2fs_remove_dirty_inode(inode);
2869*4882a593Smuzhiyun 		submitted = NULL;
2870*4882a593Smuzhiyun 	}
2871*4882a593Smuzhiyun 	unlock_page(page);
2872*4882a593Smuzhiyun 	if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) &&
2873*4882a593Smuzhiyun 			!F2FS_I(inode)->wb_task && allow_balance)
2874*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, need_balance_fs);
2875*4882a593Smuzhiyun 
2876*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(sbi))) {
2877*4882a593Smuzhiyun 		f2fs_submit_merged_write(sbi, DATA);
2878*4882a593Smuzhiyun 		f2fs_submit_merged_ipu_write(sbi, bio, NULL);
2879*4882a593Smuzhiyun 		submitted = NULL;
2880*4882a593Smuzhiyun 	}
2881*4882a593Smuzhiyun 
2882*4882a593Smuzhiyun 	if (submitted)
2883*4882a593Smuzhiyun 		*submitted = fio.submitted ? 1 : 0;
2884*4882a593Smuzhiyun 
2885*4882a593Smuzhiyun 	return 0;
2886*4882a593Smuzhiyun 
2887*4882a593Smuzhiyun redirty_out:
2888*4882a593Smuzhiyun 	redirty_page_for_writepage(wbc, page);
2889*4882a593Smuzhiyun 	/*
2890*4882a593Smuzhiyun 	 * pageout() in MM traslates EAGAIN, so calls handle_write_error()
2891*4882a593Smuzhiyun 	 * -> mapping_set_error() -> set_bit(AS_EIO, ...).
2892*4882a593Smuzhiyun 	 * file_write_and_wait_range() will see EIO error, which is critical
2893*4882a593Smuzhiyun 	 * to return value of fsync() followed by atomic_write failure to user.
2894*4882a593Smuzhiyun 	 */
2895*4882a593Smuzhiyun 	if (!err || wbc->for_reclaim)
2896*4882a593Smuzhiyun 		return AOP_WRITEPAGE_ACTIVATE;
2897*4882a593Smuzhiyun 	unlock_page(page);
2898*4882a593Smuzhiyun 	return err;
2899*4882a593Smuzhiyun }
2900*4882a593Smuzhiyun 
f2fs_write_data_page(struct page * page,struct writeback_control * wbc)2901*4882a593Smuzhiyun static int f2fs_write_data_page(struct page *page,
2902*4882a593Smuzhiyun 					struct writeback_control *wbc)
2903*4882a593Smuzhiyun {
2904*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2905*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
2906*4882a593Smuzhiyun 
2907*4882a593Smuzhiyun 	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
2908*4882a593Smuzhiyun 		goto out;
2909*4882a593Smuzhiyun 
2910*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode)) {
2911*4882a593Smuzhiyun 		if (f2fs_is_compressed_cluster(inode, page->index)) {
2912*4882a593Smuzhiyun 			redirty_page_for_writepage(wbc, page);
2913*4882a593Smuzhiyun 			return AOP_WRITEPAGE_ACTIVATE;
2914*4882a593Smuzhiyun 		}
2915*4882a593Smuzhiyun 	}
2916*4882a593Smuzhiyun out:
2917*4882a593Smuzhiyun #endif
2918*4882a593Smuzhiyun 
2919*4882a593Smuzhiyun 	return f2fs_write_single_data_page(page, NULL, NULL, NULL,
2920*4882a593Smuzhiyun 						wbc, FS_DATA_IO, 0, true);
2921*4882a593Smuzhiyun }
2922*4882a593Smuzhiyun 
2923*4882a593Smuzhiyun /*
2924*4882a593Smuzhiyun  * This function was copied from write_cche_pages from mm/page-writeback.c.
2925*4882a593Smuzhiyun  * The major change is making write step of cold data page separately from
2926*4882a593Smuzhiyun  * warm/hot data page.
2927*4882a593Smuzhiyun  */
f2fs_write_cache_pages(struct address_space * mapping,struct writeback_control * wbc,enum iostat_type io_type)2928*4882a593Smuzhiyun static int f2fs_write_cache_pages(struct address_space *mapping,
2929*4882a593Smuzhiyun 					struct writeback_control *wbc,
2930*4882a593Smuzhiyun 					enum iostat_type io_type)
2931*4882a593Smuzhiyun {
2932*4882a593Smuzhiyun 	int ret = 0;
2933*4882a593Smuzhiyun 	int done = 0, retry = 0;
2934*4882a593Smuzhiyun 	struct pagevec pvec;
2935*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
2936*4882a593Smuzhiyun 	struct bio *bio = NULL;
2937*4882a593Smuzhiyun 	sector_t last_block;
2938*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
2939*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
2940*4882a593Smuzhiyun 	struct compress_ctx cc = {
2941*4882a593Smuzhiyun 		.inode = inode,
2942*4882a593Smuzhiyun 		.log_cluster_size = F2FS_I(inode)->i_log_cluster_size,
2943*4882a593Smuzhiyun 		.cluster_size = F2FS_I(inode)->i_cluster_size,
2944*4882a593Smuzhiyun 		.cluster_idx = NULL_CLUSTER,
2945*4882a593Smuzhiyun 		.rpages = NULL,
2946*4882a593Smuzhiyun 		.nr_rpages = 0,
2947*4882a593Smuzhiyun 		.cpages = NULL,
2948*4882a593Smuzhiyun 		.rbuf = NULL,
2949*4882a593Smuzhiyun 		.cbuf = NULL,
2950*4882a593Smuzhiyun 		.rlen = PAGE_SIZE * F2FS_I(inode)->i_cluster_size,
2951*4882a593Smuzhiyun 		.private = NULL,
2952*4882a593Smuzhiyun 	};
2953*4882a593Smuzhiyun #endif
2954*4882a593Smuzhiyun 	int nr_pages;
2955*4882a593Smuzhiyun 	pgoff_t index;
2956*4882a593Smuzhiyun 	pgoff_t end;		/* Inclusive */
2957*4882a593Smuzhiyun 	pgoff_t done_index;
2958*4882a593Smuzhiyun 	int range_whole = 0;
2959*4882a593Smuzhiyun 	xa_mark_t tag;
2960*4882a593Smuzhiyun 	int nwritten = 0;
2961*4882a593Smuzhiyun 	int submitted = 0;
2962*4882a593Smuzhiyun 	int i;
2963*4882a593Smuzhiyun 
2964*4882a593Smuzhiyun 	pagevec_init(&pvec);
2965*4882a593Smuzhiyun 
2966*4882a593Smuzhiyun 	if (get_dirty_pages(mapping->host) <=
2967*4882a593Smuzhiyun 				SM_I(F2FS_M_SB(mapping))->min_hot_blocks)
2968*4882a593Smuzhiyun 		set_inode_flag(mapping->host, FI_HOT_DATA);
2969*4882a593Smuzhiyun 	else
2970*4882a593Smuzhiyun 		clear_inode_flag(mapping->host, FI_HOT_DATA);
2971*4882a593Smuzhiyun 
2972*4882a593Smuzhiyun 	if (wbc->range_cyclic) {
2973*4882a593Smuzhiyun 		index = mapping->writeback_index; /* prev offset */
2974*4882a593Smuzhiyun 		end = -1;
2975*4882a593Smuzhiyun 	} else {
2976*4882a593Smuzhiyun 		index = wbc->range_start >> PAGE_SHIFT;
2977*4882a593Smuzhiyun 		end = wbc->range_end >> PAGE_SHIFT;
2978*4882a593Smuzhiyun 		if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
2979*4882a593Smuzhiyun 			range_whole = 1;
2980*4882a593Smuzhiyun 	}
2981*4882a593Smuzhiyun 	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
2982*4882a593Smuzhiyun 		tag = PAGECACHE_TAG_TOWRITE;
2983*4882a593Smuzhiyun 	else
2984*4882a593Smuzhiyun 		tag = PAGECACHE_TAG_DIRTY;
2985*4882a593Smuzhiyun retry:
2986*4882a593Smuzhiyun 	retry = 0;
2987*4882a593Smuzhiyun 	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
2988*4882a593Smuzhiyun 		tag_pages_for_writeback(mapping, index, end);
2989*4882a593Smuzhiyun 	done_index = index;
2990*4882a593Smuzhiyun 	while (!done && !retry && (index <= end)) {
2991*4882a593Smuzhiyun 		nr_pages = pagevec_lookup_range_tag(&pvec, mapping, &index, end,
2992*4882a593Smuzhiyun 				tag);
2993*4882a593Smuzhiyun 		if (nr_pages == 0)
2994*4882a593Smuzhiyun 			break;
2995*4882a593Smuzhiyun 
2996*4882a593Smuzhiyun 		for (i = 0; i < nr_pages; i++) {
2997*4882a593Smuzhiyun 			struct page *page = pvec.pages[i];
2998*4882a593Smuzhiyun 			bool need_readd;
2999*4882a593Smuzhiyun readd:
3000*4882a593Smuzhiyun 			need_readd = false;
3001*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3002*4882a593Smuzhiyun 			if (f2fs_compressed_file(inode)) {
3003*4882a593Smuzhiyun 				ret = f2fs_init_compress_ctx(&cc);
3004*4882a593Smuzhiyun 				if (ret) {
3005*4882a593Smuzhiyun 					done = 1;
3006*4882a593Smuzhiyun 					break;
3007*4882a593Smuzhiyun 				}
3008*4882a593Smuzhiyun 
3009*4882a593Smuzhiyun 				if (!f2fs_cluster_can_merge_page(&cc,
3010*4882a593Smuzhiyun 								page->index)) {
3011*4882a593Smuzhiyun 					ret = f2fs_write_multi_pages(&cc,
3012*4882a593Smuzhiyun 						&submitted, wbc, io_type);
3013*4882a593Smuzhiyun 					if (!ret)
3014*4882a593Smuzhiyun 						need_readd = true;
3015*4882a593Smuzhiyun 					goto result;
3016*4882a593Smuzhiyun 				}
3017*4882a593Smuzhiyun 
3018*4882a593Smuzhiyun 				if (unlikely(f2fs_cp_error(sbi)))
3019*4882a593Smuzhiyun 					goto lock_page;
3020*4882a593Smuzhiyun 
3021*4882a593Smuzhiyun 				if (f2fs_cluster_is_empty(&cc)) {
3022*4882a593Smuzhiyun 					void *fsdata = NULL;
3023*4882a593Smuzhiyun 					struct page *pagep;
3024*4882a593Smuzhiyun 					int ret2;
3025*4882a593Smuzhiyun 
3026*4882a593Smuzhiyun 					ret2 = f2fs_prepare_compress_overwrite(
3027*4882a593Smuzhiyun 							inode, &pagep,
3028*4882a593Smuzhiyun 							page->index, &fsdata);
3029*4882a593Smuzhiyun 					if (ret2 < 0) {
3030*4882a593Smuzhiyun 						ret = ret2;
3031*4882a593Smuzhiyun 						done = 1;
3032*4882a593Smuzhiyun 						break;
3033*4882a593Smuzhiyun 					} else if (ret2 &&
3034*4882a593Smuzhiyun 						!f2fs_compress_write_end(inode,
3035*4882a593Smuzhiyun 								fsdata, page->index,
3036*4882a593Smuzhiyun 								1)) {
3037*4882a593Smuzhiyun 						retry = 1;
3038*4882a593Smuzhiyun 						break;
3039*4882a593Smuzhiyun 					}
3040*4882a593Smuzhiyun 				} else {
3041*4882a593Smuzhiyun 					goto lock_page;
3042*4882a593Smuzhiyun 				}
3043*4882a593Smuzhiyun 			}
3044*4882a593Smuzhiyun #endif
3045*4882a593Smuzhiyun 			/* give a priority to WB_SYNC threads */
3046*4882a593Smuzhiyun 			if (atomic_read(&sbi->wb_sync_req[DATA]) &&
3047*4882a593Smuzhiyun 					wbc->sync_mode == WB_SYNC_NONE) {
3048*4882a593Smuzhiyun 				done = 1;
3049*4882a593Smuzhiyun 				break;
3050*4882a593Smuzhiyun 			}
3051*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3052*4882a593Smuzhiyun lock_page:
3053*4882a593Smuzhiyun #endif
3054*4882a593Smuzhiyun 			done_index = page->index;
3055*4882a593Smuzhiyun retry_write:
3056*4882a593Smuzhiyun 			lock_page(page);
3057*4882a593Smuzhiyun 
3058*4882a593Smuzhiyun 			if (unlikely(page->mapping != mapping)) {
3059*4882a593Smuzhiyun continue_unlock:
3060*4882a593Smuzhiyun 				unlock_page(page);
3061*4882a593Smuzhiyun 				continue;
3062*4882a593Smuzhiyun 			}
3063*4882a593Smuzhiyun 
3064*4882a593Smuzhiyun 			if (!PageDirty(page)) {
3065*4882a593Smuzhiyun 				/* someone wrote it for us */
3066*4882a593Smuzhiyun 				goto continue_unlock;
3067*4882a593Smuzhiyun 			}
3068*4882a593Smuzhiyun 
3069*4882a593Smuzhiyun 			if (PageWriteback(page)) {
3070*4882a593Smuzhiyun 				if (wbc->sync_mode != WB_SYNC_NONE)
3071*4882a593Smuzhiyun 					f2fs_wait_on_page_writeback(page,
3072*4882a593Smuzhiyun 							DATA, true, true);
3073*4882a593Smuzhiyun 				else
3074*4882a593Smuzhiyun 					goto continue_unlock;
3075*4882a593Smuzhiyun 			}
3076*4882a593Smuzhiyun 
3077*4882a593Smuzhiyun 			if (!clear_page_dirty_for_io(page))
3078*4882a593Smuzhiyun 				goto continue_unlock;
3079*4882a593Smuzhiyun 
3080*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3081*4882a593Smuzhiyun 			if (f2fs_compressed_file(inode)) {
3082*4882a593Smuzhiyun 				get_page(page);
3083*4882a593Smuzhiyun 				f2fs_compress_ctx_add_page(&cc, page);
3084*4882a593Smuzhiyun 				continue;
3085*4882a593Smuzhiyun 			}
3086*4882a593Smuzhiyun #endif
3087*4882a593Smuzhiyun 			ret = f2fs_write_single_data_page(page, &submitted,
3088*4882a593Smuzhiyun 					&bio, &last_block, wbc, io_type,
3089*4882a593Smuzhiyun 					0, true);
3090*4882a593Smuzhiyun 			if (ret == AOP_WRITEPAGE_ACTIVATE)
3091*4882a593Smuzhiyun 				unlock_page(page);
3092*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3093*4882a593Smuzhiyun result:
3094*4882a593Smuzhiyun #endif
3095*4882a593Smuzhiyun 			nwritten += submitted;
3096*4882a593Smuzhiyun 			wbc->nr_to_write -= submitted;
3097*4882a593Smuzhiyun 
3098*4882a593Smuzhiyun 			if (unlikely(ret)) {
3099*4882a593Smuzhiyun 				/*
3100*4882a593Smuzhiyun 				 * keep nr_to_write, since vfs uses this to
3101*4882a593Smuzhiyun 				 * get # of written pages.
3102*4882a593Smuzhiyun 				 */
3103*4882a593Smuzhiyun 				if (ret == AOP_WRITEPAGE_ACTIVATE) {
3104*4882a593Smuzhiyun 					ret = 0;
3105*4882a593Smuzhiyun 					goto next;
3106*4882a593Smuzhiyun 				} else if (ret == -EAGAIN) {
3107*4882a593Smuzhiyun 					ret = 0;
3108*4882a593Smuzhiyun 					if (wbc->sync_mode == WB_SYNC_ALL) {
3109*4882a593Smuzhiyun 						cond_resched();
3110*4882a593Smuzhiyun 						congestion_wait(BLK_RW_ASYNC,
3111*4882a593Smuzhiyun 							DEFAULT_IO_TIMEOUT);
3112*4882a593Smuzhiyun 						goto retry_write;
3113*4882a593Smuzhiyun 					}
3114*4882a593Smuzhiyun 					goto next;
3115*4882a593Smuzhiyun 				}
3116*4882a593Smuzhiyun 				done_index = page->index + 1;
3117*4882a593Smuzhiyun 				done = 1;
3118*4882a593Smuzhiyun 				break;
3119*4882a593Smuzhiyun 			}
3120*4882a593Smuzhiyun 
3121*4882a593Smuzhiyun 			if (wbc->nr_to_write <= 0 &&
3122*4882a593Smuzhiyun 					wbc->sync_mode == WB_SYNC_NONE) {
3123*4882a593Smuzhiyun 				done = 1;
3124*4882a593Smuzhiyun 				break;
3125*4882a593Smuzhiyun 			}
3126*4882a593Smuzhiyun next:
3127*4882a593Smuzhiyun 			if (need_readd)
3128*4882a593Smuzhiyun 				goto readd;
3129*4882a593Smuzhiyun 		}
3130*4882a593Smuzhiyun 		pagevec_release(&pvec);
3131*4882a593Smuzhiyun 		cond_resched();
3132*4882a593Smuzhiyun 	}
3133*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3134*4882a593Smuzhiyun 	/* flush remained pages in compress cluster */
3135*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode) && !f2fs_cluster_is_empty(&cc)) {
3136*4882a593Smuzhiyun 		ret = f2fs_write_multi_pages(&cc, &submitted, wbc, io_type);
3137*4882a593Smuzhiyun 		nwritten += submitted;
3138*4882a593Smuzhiyun 		wbc->nr_to_write -= submitted;
3139*4882a593Smuzhiyun 		if (ret) {
3140*4882a593Smuzhiyun 			done = 1;
3141*4882a593Smuzhiyun 			retry = 0;
3142*4882a593Smuzhiyun 		}
3143*4882a593Smuzhiyun 	}
3144*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode))
3145*4882a593Smuzhiyun 		f2fs_destroy_compress_ctx(&cc, false);
3146*4882a593Smuzhiyun #endif
3147*4882a593Smuzhiyun 	if (retry) {
3148*4882a593Smuzhiyun 		index = 0;
3149*4882a593Smuzhiyun 		end = -1;
3150*4882a593Smuzhiyun 		goto retry;
3151*4882a593Smuzhiyun 	}
3152*4882a593Smuzhiyun 	if (wbc->range_cyclic && !done)
3153*4882a593Smuzhiyun 		done_index = 0;
3154*4882a593Smuzhiyun 	if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
3155*4882a593Smuzhiyun 		mapping->writeback_index = done_index;
3156*4882a593Smuzhiyun 
3157*4882a593Smuzhiyun 	if (nwritten)
3158*4882a593Smuzhiyun 		f2fs_submit_merged_write_cond(F2FS_M_SB(mapping), mapping->host,
3159*4882a593Smuzhiyun 								NULL, 0, DATA);
3160*4882a593Smuzhiyun 	/* submit cached bio of IPU write */
3161*4882a593Smuzhiyun 	if (bio)
3162*4882a593Smuzhiyun 		f2fs_submit_merged_ipu_write(sbi, &bio, NULL);
3163*4882a593Smuzhiyun 
3164*4882a593Smuzhiyun 	return ret;
3165*4882a593Smuzhiyun }
3166*4882a593Smuzhiyun 
__should_serialize_io(struct inode * inode,struct writeback_control * wbc)3167*4882a593Smuzhiyun static inline bool __should_serialize_io(struct inode *inode,
3168*4882a593Smuzhiyun 					struct writeback_control *wbc)
3169*4882a593Smuzhiyun {
3170*4882a593Smuzhiyun 	/* to avoid deadlock in path of data flush */
3171*4882a593Smuzhiyun 	if (F2FS_I(inode)->wb_task)
3172*4882a593Smuzhiyun 		return false;
3173*4882a593Smuzhiyun 
3174*4882a593Smuzhiyun 	if (!S_ISREG(inode->i_mode))
3175*4882a593Smuzhiyun 		return false;
3176*4882a593Smuzhiyun 	if (IS_NOQUOTA(inode))
3177*4882a593Smuzhiyun 		return false;
3178*4882a593Smuzhiyun 
3179*4882a593Smuzhiyun 	if (f2fs_need_compress_data(inode))
3180*4882a593Smuzhiyun 		return true;
3181*4882a593Smuzhiyun 	if (wbc->sync_mode != WB_SYNC_ALL)
3182*4882a593Smuzhiyun 		return true;
3183*4882a593Smuzhiyun 	if (get_dirty_pages(inode) >= SM_I(F2FS_I_SB(inode))->min_seq_blocks)
3184*4882a593Smuzhiyun 		return true;
3185*4882a593Smuzhiyun 	return false;
3186*4882a593Smuzhiyun }
3187*4882a593Smuzhiyun 
__f2fs_write_data_pages(struct address_space * mapping,struct writeback_control * wbc,enum iostat_type io_type)3188*4882a593Smuzhiyun static int __f2fs_write_data_pages(struct address_space *mapping,
3189*4882a593Smuzhiyun 						struct writeback_control *wbc,
3190*4882a593Smuzhiyun 						enum iostat_type io_type)
3191*4882a593Smuzhiyun {
3192*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3193*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3194*4882a593Smuzhiyun 	struct blk_plug plug;
3195*4882a593Smuzhiyun 	int ret;
3196*4882a593Smuzhiyun 	bool locked = false;
3197*4882a593Smuzhiyun 
3198*4882a593Smuzhiyun 	/* deal with chardevs and other special file */
3199*4882a593Smuzhiyun 	if (!mapping->a_ops->writepage)
3200*4882a593Smuzhiyun 		return 0;
3201*4882a593Smuzhiyun 
3202*4882a593Smuzhiyun 	/* skip writing if there is no dirty page in this inode */
3203*4882a593Smuzhiyun 	if (!get_dirty_pages(inode) && wbc->sync_mode == WB_SYNC_NONE)
3204*4882a593Smuzhiyun 		return 0;
3205*4882a593Smuzhiyun 
3206*4882a593Smuzhiyun 	/* during POR, we don't need to trigger writepage at all. */
3207*4882a593Smuzhiyun 	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
3208*4882a593Smuzhiyun 		goto skip_write;
3209*4882a593Smuzhiyun 
3210*4882a593Smuzhiyun 	if ((S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) &&
3211*4882a593Smuzhiyun 			wbc->sync_mode == WB_SYNC_NONE &&
3212*4882a593Smuzhiyun 			get_dirty_pages(inode) < nr_pages_to_skip(sbi, DATA) &&
3213*4882a593Smuzhiyun 			f2fs_available_free_memory(sbi, DIRTY_DENTS))
3214*4882a593Smuzhiyun 		goto skip_write;
3215*4882a593Smuzhiyun 
3216*4882a593Smuzhiyun 	/* skip writing in file defragment preparing stage */
3217*4882a593Smuzhiyun 	if (is_inode_flag_set(inode, FI_SKIP_WRITES))
3218*4882a593Smuzhiyun 		goto skip_write;
3219*4882a593Smuzhiyun 
3220*4882a593Smuzhiyun 	trace_f2fs_writepages(mapping->host, wbc, DATA);
3221*4882a593Smuzhiyun 
3222*4882a593Smuzhiyun 	/* to avoid spliting IOs due to mixed WB_SYNC_ALL and WB_SYNC_NONE */
3223*4882a593Smuzhiyun 	if (wbc->sync_mode == WB_SYNC_ALL)
3224*4882a593Smuzhiyun 		atomic_inc(&sbi->wb_sync_req[DATA]);
3225*4882a593Smuzhiyun 	else if (atomic_read(&sbi->wb_sync_req[DATA])) {
3226*4882a593Smuzhiyun 		/* to avoid potential deadlock */
3227*4882a593Smuzhiyun 		if (current->plug)
3228*4882a593Smuzhiyun 			blk_finish_plug(current->plug);
3229*4882a593Smuzhiyun 		goto skip_write;
3230*4882a593Smuzhiyun 	}
3231*4882a593Smuzhiyun 
3232*4882a593Smuzhiyun 	if (__should_serialize_io(inode, wbc)) {
3233*4882a593Smuzhiyun 		mutex_lock(&sbi->writepages);
3234*4882a593Smuzhiyun 		locked = true;
3235*4882a593Smuzhiyun 	}
3236*4882a593Smuzhiyun 
3237*4882a593Smuzhiyun 	blk_start_plug(&plug);
3238*4882a593Smuzhiyun 	ret = f2fs_write_cache_pages(mapping, wbc, io_type);
3239*4882a593Smuzhiyun 	blk_finish_plug(&plug);
3240*4882a593Smuzhiyun 
3241*4882a593Smuzhiyun 	if (locked)
3242*4882a593Smuzhiyun 		mutex_unlock(&sbi->writepages);
3243*4882a593Smuzhiyun 
3244*4882a593Smuzhiyun 	if (wbc->sync_mode == WB_SYNC_ALL)
3245*4882a593Smuzhiyun 		atomic_dec(&sbi->wb_sync_req[DATA]);
3246*4882a593Smuzhiyun 	/*
3247*4882a593Smuzhiyun 	 * if some pages were truncated, we cannot guarantee its mapping->host
3248*4882a593Smuzhiyun 	 * to detect pending bios.
3249*4882a593Smuzhiyun 	 */
3250*4882a593Smuzhiyun 
3251*4882a593Smuzhiyun 	f2fs_remove_dirty_inode(inode);
3252*4882a593Smuzhiyun 	return ret;
3253*4882a593Smuzhiyun 
3254*4882a593Smuzhiyun skip_write:
3255*4882a593Smuzhiyun 	wbc->pages_skipped += get_dirty_pages(inode);
3256*4882a593Smuzhiyun 	trace_f2fs_writepages(mapping->host, wbc, DATA);
3257*4882a593Smuzhiyun 	return 0;
3258*4882a593Smuzhiyun }
3259*4882a593Smuzhiyun 
f2fs_write_data_pages(struct address_space * mapping,struct writeback_control * wbc)3260*4882a593Smuzhiyun static int f2fs_write_data_pages(struct address_space *mapping,
3261*4882a593Smuzhiyun 			    struct writeback_control *wbc)
3262*4882a593Smuzhiyun {
3263*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3264*4882a593Smuzhiyun 
3265*4882a593Smuzhiyun 	return __f2fs_write_data_pages(mapping, wbc,
3266*4882a593Smuzhiyun 			F2FS_I(inode)->cp_task == current ?
3267*4882a593Smuzhiyun 			FS_CP_DATA_IO : FS_DATA_IO);
3268*4882a593Smuzhiyun }
3269*4882a593Smuzhiyun 
f2fs_write_failed(struct address_space * mapping,loff_t to)3270*4882a593Smuzhiyun static void f2fs_write_failed(struct address_space *mapping, loff_t to)
3271*4882a593Smuzhiyun {
3272*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3273*4882a593Smuzhiyun 	loff_t i_size = i_size_read(inode);
3274*4882a593Smuzhiyun 
3275*4882a593Smuzhiyun 	if (IS_NOQUOTA(inode))
3276*4882a593Smuzhiyun 		return;
3277*4882a593Smuzhiyun 
3278*4882a593Smuzhiyun 	/* In the fs-verity case, f2fs_end_enable_verity() does the truncate */
3279*4882a593Smuzhiyun 	if (to > i_size && !f2fs_verity_in_progress(inode)) {
3280*4882a593Smuzhiyun 		f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3281*4882a593Smuzhiyun 		f2fs_down_write(&F2FS_I(inode)->i_mmap_sem);
3282*4882a593Smuzhiyun 
3283*4882a593Smuzhiyun 		truncate_pagecache(inode, i_size);
3284*4882a593Smuzhiyun 		f2fs_truncate_blocks(inode, i_size, true);
3285*4882a593Smuzhiyun 
3286*4882a593Smuzhiyun 		f2fs_up_write(&F2FS_I(inode)->i_mmap_sem);
3287*4882a593Smuzhiyun 		f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3288*4882a593Smuzhiyun 	}
3289*4882a593Smuzhiyun }
3290*4882a593Smuzhiyun 
prepare_write_begin(struct f2fs_sb_info * sbi,struct page * page,loff_t pos,unsigned len,block_t * blk_addr,bool * node_changed)3291*4882a593Smuzhiyun static int prepare_write_begin(struct f2fs_sb_info *sbi,
3292*4882a593Smuzhiyun 			struct page *page, loff_t pos, unsigned len,
3293*4882a593Smuzhiyun 			block_t *blk_addr, bool *node_changed)
3294*4882a593Smuzhiyun {
3295*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
3296*4882a593Smuzhiyun 	pgoff_t index = page->index;
3297*4882a593Smuzhiyun 	struct dnode_of_data dn;
3298*4882a593Smuzhiyun 	struct page *ipage;
3299*4882a593Smuzhiyun 	bool locked = false;
3300*4882a593Smuzhiyun 	struct extent_info ei = {0, };
3301*4882a593Smuzhiyun 	int err = 0;
3302*4882a593Smuzhiyun 	int flag;
3303*4882a593Smuzhiyun 
3304*4882a593Smuzhiyun 	/*
3305*4882a593Smuzhiyun 	 * we already allocated all the blocks, so we don't need to get
3306*4882a593Smuzhiyun 	 * the block addresses when there is no need to fill the page.
3307*4882a593Smuzhiyun 	 */
3308*4882a593Smuzhiyun 	if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE &&
3309*4882a593Smuzhiyun 	    !is_inode_flag_set(inode, FI_NO_PREALLOC) &&
3310*4882a593Smuzhiyun 	    !f2fs_verity_in_progress(inode))
3311*4882a593Smuzhiyun 		return 0;
3312*4882a593Smuzhiyun 
3313*4882a593Smuzhiyun 	/* f2fs_lock_op avoids race between write CP and convert_inline_page */
3314*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode) && pos + len > MAX_INLINE_DATA(inode))
3315*4882a593Smuzhiyun 		flag = F2FS_GET_BLOCK_DEFAULT;
3316*4882a593Smuzhiyun 	else
3317*4882a593Smuzhiyun 		flag = F2FS_GET_BLOCK_PRE_AIO;
3318*4882a593Smuzhiyun 
3319*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode) ||
3320*4882a593Smuzhiyun 			(pos & PAGE_MASK) >= i_size_read(inode)) {
3321*4882a593Smuzhiyun 		f2fs_do_map_lock(sbi, flag, true);
3322*4882a593Smuzhiyun 		locked = true;
3323*4882a593Smuzhiyun 	}
3324*4882a593Smuzhiyun 
3325*4882a593Smuzhiyun restart:
3326*4882a593Smuzhiyun 	/* check inline_data */
3327*4882a593Smuzhiyun 	ipage = f2fs_get_node_page(sbi, inode->i_ino);
3328*4882a593Smuzhiyun 	if (IS_ERR(ipage)) {
3329*4882a593Smuzhiyun 		err = PTR_ERR(ipage);
3330*4882a593Smuzhiyun 		goto unlock_out;
3331*4882a593Smuzhiyun 	}
3332*4882a593Smuzhiyun 
3333*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, ipage, ipage, 0);
3334*4882a593Smuzhiyun 
3335*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode)) {
3336*4882a593Smuzhiyun 		if (pos + len <= MAX_INLINE_DATA(inode)) {
3337*4882a593Smuzhiyun 			f2fs_do_read_inline_data(page, ipage);
3338*4882a593Smuzhiyun 			set_inode_flag(inode, FI_DATA_EXIST);
3339*4882a593Smuzhiyun 			if (inode->i_nlink)
3340*4882a593Smuzhiyun 				set_page_private_inline(ipage);
3341*4882a593Smuzhiyun 		} else {
3342*4882a593Smuzhiyun 			err = f2fs_convert_inline_page(&dn, page);
3343*4882a593Smuzhiyun 			if (err)
3344*4882a593Smuzhiyun 				goto out;
3345*4882a593Smuzhiyun 			if (dn.data_blkaddr == NULL_ADDR)
3346*4882a593Smuzhiyun 				err = f2fs_get_block(&dn, index);
3347*4882a593Smuzhiyun 		}
3348*4882a593Smuzhiyun 	} else if (locked) {
3349*4882a593Smuzhiyun 		err = f2fs_get_block(&dn, index);
3350*4882a593Smuzhiyun 	} else {
3351*4882a593Smuzhiyun 		if (f2fs_lookup_read_extent_cache(inode, index, &ei)) {
3352*4882a593Smuzhiyun 			dn.data_blkaddr = ei.blk + index - ei.fofs;
3353*4882a593Smuzhiyun 		} else {
3354*4882a593Smuzhiyun 			/* hole case */
3355*4882a593Smuzhiyun 			err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
3356*4882a593Smuzhiyun 			if (err || dn.data_blkaddr == NULL_ADDR) {
3357*4882a593Smuzhiyun 				f2fs_put_dnode(&dn);
3358*4882a593Smuzhiyun 				f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO,
3359*4882a593Smuzhiyun 								true);
3360*4882a593Smuzhiyun 				WARN_ON(flag != F2FS_GET_BLOCK_PRE_AIO);
3361*4882a593Smuzhiyun 				locked = true;
3362*4882a593Smuzhiyun 				goto restart;
3363*4882a593Smuzhiyun 			}
3364*4882a593Smuzhiyun 		}
3365*4882a593Smuzhiyun 	}
3366*4882a593Smuzhiyun 
3367*4882a593Smuzhiyun 	/* convert_inline_page can make node_changed */
3368*4882a593Smuzhiyun 	*blk_addr = dn.data_blkaddr;
3369*4882a593Smuzhiyun 	*node_changed = dn.node_changed;
3370*4882a593Smuzhiyun out:
3371*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
3372*4882a593Smuzhiyun unlock_out:
3373*4882a593Smuzhiyun 	if (locked)
3374*4882a593Smuzhiyun 		f2fs_do_map_lock(sbi, flag, false);
3375*4882a593Smuzhiyun 	return err;
3376*4882a593Smuzhiyun }
3377*4882a593Smuzhiyun 
f2fs_write_begin(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned flags,struct page ** pagep,void ** fsdata)3378*4882a593Smuzhiyun static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3379*4882a593Smuzhiyun 		loff_t pos, unsigned len, unsigned flags,
3380*4882a593Smuzhiyun 		struct page **pagep, void **fsdata)
3381*4882a593Smuzhiyun {
3382*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3383*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3384*4882a593Smuzhiyun 	struct page *page = NULL;
3385*4882a593Smuzhiyun 	pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT;
3386*4882a593Smuzhiyun 	bool need_balance = false, drop_atomic = false;
3387*4882a593Smuzhiyun 	block_t blkaddr = NULL_ADDR;
3388*4882a593Smuzhiyun 	int err = 0;
3389*4882a593Smuzhiyun 
3390*4882a593Smuzhiyun 	/*
3391*4882a593Smuzhiyun 	 * Should avoid quota operations which can make deadlock:
3392*4882a593Smuzhiyun 	 * kswapd -> f2fs_evict_inode -> dquot_drop ->
3393*4882a593Smuzhiyun 	 *   f2fs_dquot_commit -> f2fs_write_begin ->
3394*4882a593Smuzhiyun 	 *   d_obtain_alias -> __d_alloc -> kmem_cache_alloc(GFP_KERNEL)
3395*4882a593Smuzhiyun 	 */
3396*4882a593Smuzhiyun 	if (trace_android_fs_datawrite_start_enabled() && !IS_NOQUOTA(inode)) {
3397*4882a593Smuzhiyun 		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
3398*4882a593Smuzhiyun 
3399*4882a593Smuzhiyun 		path = android_fstrace_get_pathname(pathbuf,
3400*4882a593Smuzhiyun 						    MAX_TRACE_PATHBUF_LEN,
3401*4882a593Smuzhiyun 						    inode);
3402*4882a593Smuzhiyun 		trace_android_fs_datawrite_start(inode, pos, len,
3403*4882a593Smuzhiyun 						 current->pid, path,
3404*4882a593Smuzhiyun 						 current->comm);
3405*4882a593Smuzhiyun 	}
3406*4882a593Smuzhiyun 	trace_f2fs_write_begin(inode, pos, len, flags);
3407*4882a593Smuzhiyun 
3408*4882a593Smuzhiyun 	if (!f2fs_is_checkpoint_ready(sbi)) {
3409*4882a593Smuzhiyun 		err = -ENOSPC;
3410*4882a593Smuzhiyun 		goto fail;
3411*4882a593Smuzhiyun 	}
3412*4882a593Smuzhiyun 
3413*4882a593Smuzhiyun 	if ((f2fs_is_atomic_file(inode) &&
3414*4882a593Smuzhiyun 			!f2fs_available_free_memory(sbi, INMEM_PAGES)) ||
3415*4882a593Smuzhiyun 			is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST)) {
3416*4882a593Smuzhiyun 		err = -ENOMEM;
3417*4882a593Smuzhiyun 		drop_atomic = true;
3418*4882a593Smuzhiyun 		goto fail;
3419*4882a593Smuzhiyun 	}
3420*4882a593Smuzhiyun 
3421*4882a593Smuzhiyun 	/*
3422*4882a593Smuzhiyun 	 * We should check this at this moment to avoid deadlock on inode page
3423*4882a593Smuzhiyun 	 * and #0 page. The locking rule for inline_data conversion should be:
3424*4882a593Smuzhiyun 	 * lock_page(page #0) -> lock_page(inode_page)
3425*4882a593Smuzhiyun 	 */
3426*4882a593Smuzhiyun 	if (index != 0) {
3427*4882a593Smuzhiyun 		err = f2fs_convert_inline_inode(inode);
3428*4882a593Smuzhiyun 		if (err)
3429*4882a593Smuzhiyun 			goto fail;
3430*4882a593Smuzhiyun 	}
3431*4882a593Smuzhiyun 
3432*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3433*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode)) {
3434*4882a593Smuzhiyun 		int ret;
3435*4882a593Smuzhiyun 
3436*4882a593Smuzhiyun 		*fsdata = NULL;
3437*4882a593Smuzhiyun 
3438*4882a593Smuzhiyun 		if (len == PAGE_SIZE && !(f2fs_is_atomic_file(inode)))
3439*4882a593Smuzhiyun 			goto repeat;
3440*4882a593Smuzhiyun 
3441*4882a593Smuzhiyun 		ret = f2fs_prepare_compress_overwrite(inode, pagep,
3442*4882a593Smuzhiyun 							index, fsdata);
3443*4882a593Smuzhiyun 		if (ret < 0) {
3444*4882a593Smuzhiyun 			err = ret;
3445*4882a593Smuzhiyun 			goto fail;
3446*4882a593Smuzhiyun 		} else if (ret) {
3447*4882a593Smuzhiyun 			return 0;
3448*4882a593Smuzhiyun 		}
3449*4882a593Smuzhiyun 	}
3450*4882a593Smuzhiyun #endif
3451*4882a593Smuzhiyun 
3452*4882a593Smuzhiyun repeat:
3453*4882a593Smuzhiyun 	/*
3454*4882a593Smuzhiyun 	 * Do not use grab_cache_page_write_begin() to avoid deadlock due to
3455*4882a593Smuzhiyun 	 * wait_for_stable_page. Will wait that below with our IO control.
3456*4882a593Smuzhiyun 	 */
3457*4882a593Smuzhiyun 	page = f2fs_pagecache_get_page(mapping, index,
3458*4882a593Smuzhiyun 				FGP_LOCK | FGP_WRITE | FGP_CREAT, GFP_NOFS);
3459*4882a593Smuzhiyun 	if (!page) {
3460*4882a593Smuzhiyun 		err = -ENOMEM;
3461*4882a593Smuzhiyun 		goto fail;
3462*4882a593Smuzhiyun 	}
3463*4882a593Smuzhiyun 
3464*4882a593Smuzhiyun 	/* TODO: cluster can be compressed due to race with .writepage */
3465*4882a593Smuzhiyun 
3466*4882a593Smuzhiyun 	*pagep = page;
3467*4882a593Smuzhiyun 
3468*4882a593Smuzhiyun 	err = prepare_write_begin(sbi, page, pos, len,
3469*4882a593Smuzhiyun 					&blkaddr, &need_balance);
3470*4882a593Smuzhiyun 	if (err)
3471*4882a593Smuzhiyun 		goto fail;
3472*4882a593Smuzhiyun 
3473*4882a593Smuzhiyun 	if (need_balance && !IS_NOQUOTA(inode) &&
3474*4882a593Smuzhiyun 			has_not_enough_free_secs(sbi, 0, 0)) {
3475*4882a593Smuzhiyun 		unlock_page(page);
3476*4882a593Smuzhiyun 		f2fs_balance_fs(sbi, true);
3477*4882a593Smuzhiyun 		lock_page(page);
3478*4882a593Smuzhiyun 		if (page->mapping != mapping) {
3479*4882a593Smuzhiyun 			/* The page got truncated from under us */
3480*4882a593Smuzhiyun 			f2fs_put_page(page, 1);
3481*4882a593Smuzhiyun 			goto repeat;
3482*4882a593Smuzhiyun 		}
3483*4882a593Smuzhiyun 	}
3484*4882a593Smuzhiyun 
3485*4882a593Smuzhiyun 	f2fs_wait_on_page_writeback(page, DATA, false, true);
3486*4882a593Smuzhiyun 
3487*4882a593Smuzhiyun 	if (len == PAGE_SIZE || PageUptodate(page))
3488*4882a593Smuzhiyun 		return 0;
3489*4882a593Smuzhiyun 
3490*4882a593Smuzhiyun 	if (!(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode) &&
3491*4882a593Smuzhiyun 	    !f2fs_verity_in_progress(inode)) {
3492*4882a593Smuzhiyun 		zero_user_segment(page, len, PAGE_SIZE);
3493*4882a593Smuzhiyun 		return 0;
3494*4882a593Smuzhiyun 	}
3495*4882a593Smuzhiyun 
3496*4882a593Smuzhiyun 	if (blkaddr == NEW_ADDR) {
3497*4882a593Smuzhiyun 		zero_user_segment(page, 0, PAGE_SIZE);
3498*4882a593Smuzhiyun 		SetPageUptodate(page);
3499*4882a593Smuzhiyun 	} else {
3500*4882a593Smuzhiyun 		if (!f2fs_is_valid_blkaddr(sbi, blkaddr,
3501*4882a593Smuzhiyun 				DATA_GENERIC_ENHANCE_READ)) {
3502*4882a593Smuzhiyun 			err = -EFSCORRUPTED;
3503*4882a593Smuzhiyun 			goto fail;
3504*4882a593Smuzhiyun 		}
3505*4882a593Smuzhiyun 		err = f2fs_submit_page_read(inode, page, blkaddr, 0, true);
3506*4882a593Smuzhiyun 		if (err)
3507*4882a593Smuzhiyun 			goto fail;
3508*4882a593Smuzhiyun 
3509*4882a593Smuzhiyun 		lock_page(page);
3510*4882a593Smuzhiyun 		if (unlikely(page->mapping != mapping)) {
3511*4882a593Smuzhiyun 			f2fs_put_page(page, 1);
3512*4882a593Smuzhiyun 			goto repeat;
3513*4882a593Smuzhiyun 		}
3514*4882a593Smuzhiyun 		if (unlikely(!PageUptodate(page))) {
3515*4882a593Smuzhiyun 			err = -EIO;
3516*4882a593Smuzhiyun 			goto fail;
3517*4882a593Smuzhiyun 		}
3518*4882a593Smuzhiyun 	}
3519*4882a593Smuzhiyun 	return 0;
3520*4882a593Smuzhiyun 
3521*4882a593Smuzhiyun fail:
3522*4882a593Smuzhiyun 	f2fs_put_page(page, 1);
3523*4882a593Smuzhiyun 	f2fs_write_failed(mapping, pos + len);
3524*4882a593Smuzhiyun 	if (drop_atomic)
3525*4882a593Smuzhiyun 		f2fs_drop_inmem_pages_all(sbi, false);
3526*4882a593Smuzhiyun 	return err;
3527*4882a593Smuzhiyun }
3528*4882a593Smuzhiyun 
f2fs_write_end(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned copied,struct page * page,void * fsdata)3529*4882a593Smuzhiyun static int f2fs_write_end(struct file *file,
3530*4882a593Smuzhiyun 			struct address_space *mapping,
3531*4882a593Smuzhiyun 			loff_t pos, unsigned len, unsigned copied,
3532*4882a593Smuzhiyun 			struct page *page, void *fsdata)
3533*4882a593Smuzhiyun {
3534*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
3535*4882a593Smuzhiyun 
3536*4882a593Smuzhiyun 	trace_android_fs_datawrite_end(inode, pos, len);
3537*4882a593Smuzhiyun 	trace_f2fs_write_end(inode, pos, len, copied);
3538*4882a593Smuzhiyun 
3539*4882a593Smuzhiyun 	/*
3540*4882a593Smuzhiyun 	 * This should be come from len == PAGE_SIZE, and we expect copied
3541*4882a593Smuzhiyun 	 * should be PAGE_SIZE. Otherwise, we treat it with zero copied and
3542*4882a593Smuzhiyun 	 * let generic_perform_write() try to copy data again through copied=0.
3543*4882a593Smuzhiyun 	 */
3544*4882a593Smuzhiyun 	if (!PageUptodate(page)) {
3545*4882a593Smuzhiyun 		if (unlikely(copied != len))
3546*4882a593Smuzhiyun 			copied = 0;
3547*4882a593Smuzhiyun 		else
3548*4882a593Smuzhiyun 			SetPageUptodate(page);
3549*4882a593Smuzhiyun 	}
3550*4882a593Smuzhiyun 
3551*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3552*4882a593Smuzhiyun 	/* overwrite compressed file */
3553*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode) && fsdata) {
3554*4882a593Smuzhiyun 		f2fs_compress_write_end(inode, fsdata, page->index, copied);
3555*4882a593Smuzhiyun 		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
3556*4882a593Smuzhiyun 
3557*4882a593Smuzhiyun 		if (pos + copied > i_size_read(inode) &&
3558*4882a593Smuzhiyun 				!f2fs_verity_in_progress(inode))
3559*4882a593Smuzhiyun 			f2fs_i_size_write(inode, pos + copied);
3560*4882a593Smuzhiyun 		return copied;
3561*4882a593Smuzhiyun 	}
3562*4882a593Smuzhiyun #endif
3563*4882a593Smuzhiyun 
3564*4882a593Smuzhiyun 	if (!copied)
3565*4882a593Smuzhiyun 		goto unlock_out;
3566*4882a593Smuzhiyun 
3567*4882a593Smuzhiyun 	set_page_dirty(page);
3568*4882a593Smuzhiyun 
3569*4882a593Smuzhiyun 	if (pos + copied > i_size_read(inode) &&
3570*4882a593Smuzhiyun 	    !f2fs_verity_in_progress(inode))
3571*4882a593Smuzhiyun 		f2fs_i_size_write(inode, pos + copied);
3572*4882a593Smuzhiyun unlock_out:
3573*4882a593Smuzhiyun 	f2fs_put_page(page, 1);
3574*4882a593Smuzhiyun 	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
3575*4882a593Smuzhiyun 	return copied;
3576*4882a593Smuzhiyun }
3577*4882a593Smuzhiyun 
check_direct_IO(struct inode * inode,struct iov_iter * iter,loff_t offset)3578*4882a593Smuzhiyun static int check_direct_IO(struct inode *inode, struct iov_iter *iter,
3579*4882a593Smuzhiyun 			   loff_t offset)
3580*4882a593Smuzhiyun {
3581*4882a593Smuzhiyun 	unsigned i_blkbits = READ_ONCE(inode->i_blkbits);
3582*4882a593Smuzhiyun 	unsigned blkbits = i_blkbits;
3583*4882a593Smuzhiyun 	unsigned blocksize_mask = (1 << blkbits) - 1;
3584*4882a593Smuzhiyun 	unsigned long align = offset | iov_iter_alignment(iter);
3585*4882a593Smuzhiyun 	struct block_device *bdev = inode->i_sb->s_bdev;
3586*4882a593Smuzhiyun 
3587*4882a593Smuzhiyun 	if (iov_iter_rw(iter) == READ && offset >= i_size_read(inode))
3588*4882a593Smuzhiyun 		return 1;
3589*4882a593Smuzhiyun 
3590*4882a593Smuzhiyun 	if (align & blocksize_mask) {
3591*4882a593Smuzhiyun 		if (bdev)
3592*4882a593Smuzhiyun 			blkbits = blksize_bits(bdev_logical_block_size(bdev));
3593*4882a593Smuzhiyun 		blocksize_mask = (1 << blkbits) - 1;
3594*4882a593Smuzhiyun 		if (align & blocksize_mask)
3595*4882a593Smuzhiyun 			return -EINVAL;
3596*4882a593Smuzhiyun 		return 1;
3597*4882a593Smuzhiyun 	}
3598*4882a593Smuzhiyun 	return 0;
3599*4882a593Smuzhiyun }
3600*4882a593Smuzhiyun 
f2fs_dio_end_io(struct bio * bio)3601*4882a593Smuzhiyun static void f2fs_dio_end_io(struct bio *bio)
3602*4882a593Smuzhiyun {
3603*4882a593Smuzhiyun 	struct f2fs_private_dio *dio = bio->bi_private;
3604*4882a593Smuzhiyun 
3605*4882a593Smuzhiyun 	dec_page_count(F2FS_I_SB(dio->inode),
3606*4882a593Smuzhiyun 			dio->write ? F2FS_DIO_WRITE : F2FS_DIO_READ);
3607*4882a593Smuzhiyun 
3608*4882a593Smuzhiyun 	bio->bi_private = dio->orig_private;
3609*4882a593Smuzhiyun 	bio->bi_end_io = dio->orig_end_io;
3610*4882a593Smuzhiyun 
3611*4882a593Smuzhiyun 	kfree(dio);
3612*4882a593Smuzhiyun 
3613*4882a593Smuzhiyun 	bio_endio(bio);
3614*4882a593Smuzhiyun }
3615*4882a593Smuzhiyun 
f2fs_dio_submit_bio(struct bio * bio,struct inode * inode,loff_t file_offset)3616*4882a593Smuzhiyun static void f2fs_dio_submit_bio(struct bio *bio, struct inode *inode,
3617*4882a593Smuzhiyun 							loff_t file_offset)
3618*4882a593Smuzhiyun {
3619*4882a593Smuzhiyun 	struct f2fs_private_dio *dio;
3620*4882a593Smuzhiyun 	bool write = (bio_op(bio) == REQ_OP_WRITE);
3621*4882a593Smuzhiyun 
3622*4882a593Smuzhiyun 	dio = f2fs_kzalloc(F2FS_I_SB(inode),
3623*4882a593Smuzhiyun 			sizeof(struct f2fs_private_dio), GFP_NOFS);
3624*4882a593Smuzhiyun 	if (!dio)
3625*4882a593Smuzhiyun 		goto out;
3626*4882a593Smuzhiyun 
3627*4882a593Smuzhiyun 	dio->inode = inode;
3628*4882a593Smuzhiyun 	dio->orig_end_io = bio->bi_end_io;
3629*4882a593Smuzhiyun 	dio->orig_private = bio->bi_private;
3630*4882a593Smuzhiyun 	dio->write = write;
3631*4882a593Smuzhiyun 
3632*4882a593Smuzhiyun 	bio->bi_end_io = f2fs_dio_end_io;
3633*4882a593Smuzhiyun 	bio->bi_private = dio;
3634*4882a593Smuzhiyun 
3635*4882a593Smuzhiyun 	inc_page_count(F2FS_I_SB(inode),
3636*4882a593Smuzhiyun 			write ? F2FS_DIO_WRITE : F2FS_DIO_READ);
3637*4882a593Smuzhiyun 
3638*4882a593Smuzhiyun 	submit_bio(bio);
3639*4882a593Smuzhiyun 	return;
3640*4882a593Smuzhiyun out:
3641*4882a593Smuzhiyun 	bio->bi_status = BLK_STS_IOERR;
3642*4882a593Smuzhiyun 	bio_endio(bio);
3643*4882a593Smuzhiyun }
3644*4882a593Smuzhiyun 
f2fs_direct_IO(struct kiocb * iocb,struct iov_iter * iter)3645*4882a593Smuzhiyun static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3646*4882a593Smuzhiyun {
3647*4882a593Smuzhiyun 	struct address_space *mapping = iocb->ki_filp->f_mapping;
3648*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3649*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3650*4882a593Smuzhiyun 	struct f2fs_inode_info *fi = F2FS_I(inode);
3651*4882a593Smuzhiyun 	size_t count = iov_iter_count(iter);
3652*4882a593Smuzhiyun 	loff_t offset = iocb->ki_pos;
3653*4882a593Smuzhiyun 	int rw = iov_iter_rw(iter);
3654*4882a593Smuzhiyun 	int err;
3655*4882a593Smuzhiyun 	enum rw_hint hint = iocb->ki_hint;
3656*4882a593Smuzhiyun 	int whint_mode = F2FS_OPTION(sbi).whint_mode;
3657*4882a593Smuzhiyun 	bool do_opu;
3658*4882a593Smuzhiyun 
3659*4882a593Smuzhiyun 	err = check_direct_IO(inode, iter, offset);
3660*4882a593Smuzhiyun 	if (err)
3661*4882a593Smuzhiyun 		return err < 0 ? err : 0;
3662*4882a593Smuzhiyun 
3663*4882a593Smuzhiyun 	if (f2fs_force_buffered_io(inode, iocb, iter))
3664*4882a593Smuzhiyun 		return 0;
3665*4882a593Smuzhiyun 
3666*4882a593Smuzhiyun 	do_opu = allow_outplace_dio(inode, iocb, iter);
3667*4882a593Smuzhiyun 
3668*4882a593Smuzhiyun 	trace_f2fs_direct_IO_enter(inode, offset, count, rw);
3669*4882a593Smuzhiyun 
3670*4882a593Smuzhiyun 	if (trace_android_fs_dataread_start_enabled() &&
3671*4882a593Smuzhiyun 	    (rw == READ)) {
3672*4882a593Smuzhiyun 		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
3673*4882a593Smuzhiyun 
3674*4882a593Smuzhiyun 		path = android_fstrace_get_pathname(pathbuf,
3675*4882a593Smuzhiyun 						    MAX_TRACE_PATHBUF_LEN,
3676*4882a593Smuzhiyun 						    inode);
3677*4882a593Smuzhiyun 		trace_android_fs_dataread_start(inode, offset,
3678*4882a593Smuzhiyun 						count, current->pid, path,
3679*4882a593Smuzhiyun 						current->comm);
3680*4882a593Smuzhiyun 	}
3681*4882a593Smuzhiyun 	if (trace_android_fs_datawrite_start_enabled() &&
3682*4882a593Smuzhiyun 	    (rw == WRITE)) {
3683*4882a593Smuzhiyun 		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
3684*4882a593Smuzhiyun 
3685*4882a593Smuzhiyun 		path = android_fstrace_get_pathname(pathbuf,
3686*4882a593Smuzhiyun 						    MAX_TRACE_PATHBUF_LEN,
3687*4882a593Smuzhiyun 						    inode);
3688*4882a593Smuzhiyun 		trace_android_fs_datawrite_start(inode, offset, count,
3689*4882a593Smuzhiyun 						 current->pid, path,
3690*4882a593Smuzhiyun 						 current->comm);
3691*4882a593Smuzhiyun 	}
3692*4882a593Smuzhiyun 
3693*4882a593Smuzhiyun 	if (rw == WRITE && whint_mode == WHINT_MODE_OFF)
3694*4882a593Smuzhiyun 		iocb->ki_hint = WRITE_LIFE_NOT_SET;
3695*4882a593Smuzhiyun 
3696*4882a593Smuzhiyun 	if (iocb->ki_flags & IOCB_NOWAIT) {
3697*4882a593Smuzhiyun 		if (!f2fs_down_read_trylock(&fi->i_gc_rwsem[rw])) {
3698*4882a593Smuzhiyun 			iocb->ki_hint = hint;
3699*4882a593Smuzhiyun 			err = -EAGAIN;
3700*4882a593Smuzhiyun 			goto out;
3701*4882a593Smuzhiyun 		}
3702*4882a593Smuzhiyun 		if (do_opu && !f2fs_down_read_trylock(&fi->i_gc_rwsem[READ])) {
3703*4882a593Smuzhiyun 			f2fs_up_read(&fi->i_gc_rwsem[rw]);
3704*4882a593Smuzhiyun 			iocb->ki_hint = hint;
3705*4882a593Smuzhiyun 			err = -EAGAIN;
3706*4882a593Smuzhiyun 			goto out;
3707*4882a593Smuzhiyun 		}
3708*4882a593Smuzhiyun 	} else {
3709*4882a593Smuzhiyun 		f2fs_down_read(&fi->i_gc_rwsem[rw]);
3710*4882a593Smuzhiyun 		if (do_opu)
3711*4882a593Smuzhiyun 			f2fs_down_read(&fi->i_gc_rwsem[READ]);
3712*4882a593Smuzhiyun 	}
3713*4882a593Smuzhiyun 
3714*4882a593Smuzhiyun 	err = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
3715*4882a593Smuzhiyun 			iter, rw == WRITE ? get_data_block_dio_write :
3716*4882a593Smuzhiyun 			get_data_block_dio, NULL, f2fs_dio_submit_bio,
3717*4882a593Smuzhiyun 			rw == WRITE ? DIO_LOCKING | DIO_SKIP_HOLES :
3718*4882a593Smuzhiyun 			DIO_SKIP_HOLES);
3719*4882a593Smuzhiyun 
3720*4882a593Smuzhiyun 	if (do_opu)
3721*4882a593Smuzhiyun 		f2fs_up_read(&fi->i_gc_rwsem[READ]);
3722*4882a593Smuzhiyun 
3723*4882a593Smuzhiyun 	f2fs_up_read(&fi->i_gc_rwsem[rw]);
3724*4882a593Smuzhiyun 
3725*4882a593Smuzhiyun 	if (rw == WRITE) {
3726*4882a593Smuzhiyun 		if (whint_mode == WHINT_MODE_OFF)
3727*4882a593Smuzhiyun 			iocb->ki_hint = hint;
3728*4882a593Smuzhiyun 		if (err > 0) {
3729*4882a593Smuzhiyun 			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
3730*4882a593Smuzhiyun 									err);
3731*4882a593Smuzhiyun 			if (!do_opu)
3732*4882a593Smuzhiyun 				set_inode_flag(inode, FI_UPDATE_WRITE);
3733*4882a593Smuzhiyun 		} else if (err == -EIOCBQUEUED) {
3734*4882a593Smuzhiyun 			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
3735*4882a593Smuzhiyun 						count - iov_iter_count(iter));
3736*4882a593Smuzhiyun 		} else if (err < 0) {
3737*4882a593Smuzhiyun 			f2fs_write_failed(mapping, offset + count);
3738*4882a593Smuzhiyun 		}
3739*4882a593Smuzhiyun 	} else {
3740*4882a593Smuzhiyun 		if (err > 0)
3741*4882a593Smuzhiyun 			f2fs_update_iostat(sbi, APP_DIRECT_READ_IO, err);
3742*4882a593Smuzhiyun 		else if (err == -EIOCBQUEUED)
3743*4882a593Smuzhiyun 			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_READ_IO,
3744*4882a593Smuzhiyun 						count - iov_iter_count(iter));
3745*4882a593Smuzhiyun 	}
3746*4882a593Smuzhiyun 
3747*4882a593Smuzhiyun out:
3748*4882a593Smuzhiyun 	if (trace_android_fs_dataread_start_enabled() &&
3749*4882a593Smuzhiyun 	    (rw == READ))
3750*4882a593Smuzhiyun 		trace_android_fs_dataread_end(inode, offset, count);
3751*4882a593Smuzhiyun 	if (trace_android_fs_datawrite_start_enabled() &&
3752*4882a593Smuzhiyun 	    (rw == WRITE))
3753*4882a593Smuzhiyun 		trace_android_fs_datawrite_end(inode, offset, count);
3754*4882a593Smuzhiyun 
3755*4882a593Smuzhiyun 	trace_f2fs_direct_IO_exit(inode, offset, count, rw, err);
3756*4882a593Smuzhiyun 
3757*4882a593Smuzhiyun 	return err;
3758*4882a593Smuzhiyun }
3759*4882a593Smuzhiyun 
f2fs_invalidate_page(struct page * page,unsigned int offset,unsigned int length)3760*4882a593Smuzhiyun void f2fs_invalidate_page(struct page *page, unsigned int offset,
3761*4882a593Smuzhiyun 							unsigned int length)
3762*4882a593Smuzhiyun {
3763*4882a593Smuzhiyun 	struct inode *inode = page->mapping->host;
3764*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3765*4882a593Smuzhiyun 
3766*4882a593Smuzhiyun 	if (inode->i_ino >= F2FS_ROOT_INO(sbi) &&
3767*4882a593Smuzhiyun 		(offset % PAGE_SIZE || length != PAGE_SIZE))
3768*4882a593Smuzhiyun 		return;
3769*4882a593Smuzhiyun 
3770*4882a593Smuzhiyun 	if (PageDirty(page)) {
3771*4882a593Smuzhiyun 		if (inode->i_ino == F2FS_META_INO(sbi)) {
3772*4882a593Smuzhiyun 			dec_page_count(sbi, F2FS_DIRTY_META);
3773*4882a593Smuzhiyun 		} else if (inode->i_ino == F2FS_NODE_INO(sbi)) {
3774*4882a593Smuzhiyun 			dec_page_count(sbi, F2FS_DIRTY_NODES);
3775*4882a593Smuzhiyun 		} else {
3776*4882a593Smuzhiyun 			inode_dec_dirty_pages(inode);
3777*4882a593Smuzhiyun 			f2fs_remove_dirty_inode(inode);
3778*4882a593Smuzhiyun 		}
3779*4882a593Smuzhiyun 	}
3780*4882a593Smuzhiyun 
3781*4882a593Smuzhiyun 	clear_page_private_gcing(page);
3782*4882a593Smuzhiyun 
3783*4882a593Smuzhiyun 	if (test_opt(sbi, COMPRESS_CACHE)) {
3784*4882a593Smuzhiyun 		if (f2fs_compressed_file(inode))
3785*4882a593Smuzhiyun 			f2fs_invalidate_compress_pages(sbi, inode->i_ino);
3786*4882a593Smuzhiyun 		if (inode->i_ino == F2FS_COMPRESS_INO(sbi))
3787*4882a593Smuzhiyun 			clear_page_private_data(page);
3788*4882a593Smuzhiyun 	}
3789*4882a593Smuzhiyun 
3790*4882a593Smuzhiyun 	if (page_private_atomic(page))
3791*4882a593Smuzhiyun 		return f2fs_drop_inmem_page(inode, page);
3792*4882a593Smuzhiyun 
3793*4882a593Smuzhiyun 	detach_page_private(page);
3794*4882a593Smuzhiyun 	set_page_private(page, 0);
3795*4882a593Smuzhiyun }
3796*4882a593Smuzhiyun 
f2fs_release_page(struct page * page,gfp_t wait)3797*4882a593Smuzhiyun int f2fs_release_page(struct page *page, gfp_t wait)
3798*4882a593Smuzhiyun {
3799*4882a593Smuzhiyun 	/* If this is dirty page, keep PagePrivate */
3800*4882a593Smuzhiyun 	if (PageDirty(page))
3801*4882a593Smuzhiyun 		return 0;
3802*4882a593Smuzhiyun 
3803*4882a593Smuzhiyun 	/* This is atomic written page, keep Private */
3804*4882a593Smuzhiyun 	if (page_private_atomic(page))
3805*4882a593Smuzhiyun 		return 0;
3806*4882a593Smuzhiyun 
3807*4882a593Smuzhiyun 	if (test_opt(F2FS_P_SB(page), COMPRESS_CACHE)) {
3808*4882a593Smuzhiyun 		struct f2fs_sb_info *sbi = F2FS_P_SB(page);
3809*4882a593Smuzhiyun 		struct inode *inode = page->mapping->host;
3810*4882a593Smuzhiyun 
3811*4882a593Smuzhiyun 		if (f2fs_compressed_file(inode))
3812*4882a593Smuzhiyun 			f2fs_invalidate_compress_pages(sbi, inode->i_ino);
3813*4882a593Smuzhiyun 		if (inode->i_ino == F2FS_COMPRESS_INO(sbi))
3814*4882a593Smuzhiyun 			clear_page_private_data(page);
3815*4882a593Smuzhiyun 	}
3816*4882a593Smuzhiyun 
3817*4882a593Smuzhiyun 	clear_page_private_gcing(page);
3818*4882a593Smuzhiyun 
3819*4882a593Smuzhiyun 	detach_page_private(page);
3820*4882a593Smuzhiyun 	set_page_private(page, 0);
3821*4882a593Smuzhiyun 	return 1;
3822*4882a593Smuzhiyun }
3823*4882a593Smuzhiyun 
f2fs_set_data_page_dirty(struct page * page)3824*4882a593Smuzhiyun static int f2fs_set_data_page_dirty(struct page *page)
3825*4882a593Smuzhiyun {
3826*4882a593Smuzhiyun 	struct inode *inode = page_file_mapping(page)->host;
3827*4882a593Smuzhiyun 
3828*4882a593Smuzhiyun 	trace_f2fs_set_page_dirty(page, DATA);
3829*4882a593Smuzhiyun 
3830*4882a593Smuzhiyun 	if (!PageUptodate(page))
3831*4882a593Smuzhiyun 		SetPageUptodate(page);
3832*4882a593Smuzhiyun 	if (PageSwapCache(page))
3833*4882a593Smuzhiyun 		return __set_page_dirty_nobuffers(page);
3834*4882a593Smuzhiyun 
3835*4882a593Smuzhiyun 	if (f2fs_is_atomic_file(inode) && !f2fs_is_commit_atomic_write(inode)) {
3836*4882a593Smuzhiyun 		if (!page_private_atomic(page)) {
3837*4882a593Smuzhiyun 			f2fs_register_inmem_page(inode, page);
3838*4882a593Smuzhiyun 			return 1;
3839*4882a593Smuzhiyun 		}
3840*4882a593Smuzhiyun 		/*
3841*4882a593Smuzhiyun 		 * Previously, this page has been registered, we just
3842*4882a593Smuzhiyun 		 * return here.
3843*4882a593Smuzhiyun 		 */
3844*4882a593Smuzhiyun 		return 0;
3845*4882a593Smuzhiyun 	}
3846*4882a593Smuzhiyun 
3847*4882a593Smuzhiyun 	if (!PageDirty(page)) {
3848*4882a593Smuzhiyun 		__set_page_dirty_nobuffers(page);
3849*4882a593Smuzhiyun 		f2fs_update_dirty_page(inode, page);
3850*4882a593Smuzhiyun 		return 1;
3851*4882a593Smuzhiyun 	}
3852*4882a593Smuzhiyun 	return 0;
3853*4882a593Smuzhiyun }
3854*4882a593Smuzhiyun 
3855*4882a593Smuzhiyun 
f2fs_bmap_compress(struct inode * inode,sector_t block)3856*4882a593Smuzhiyun static sector_t f2fs_bmap_compress(struct inode *inode, sector_t block)
3857*4882a593Smuzhiyun {
3858*4882a593Smuzhiyun #ifdef CONFIG_F2FS_FS_COMPRESSION
3859*4882a593Smuzhiyun 	struct dnode_of_data dn;
3860*4882a593Smuzhiyun 	sector_t start_idx, blknr = 0;
3861*4882a593Smuzhiyun 	int ret;
3862*4882a593Smuzhiyun 
3863*4882a593Smuzhiyun 	start_idx = round_down(block, F2FS_I(inode)->i_cluster_size);
3864*4882a593Smuzhiyun 
3865*4882a593Smuzhiyun 	set_new_dnode(&dn, inode, NULL, NULL, 0);
3866*4882a593Smuzhiyun 	ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE);
3867*4882a593Smuzhiyun 	if (ret)
3868*4882a593Smuzhiyun 		return 0;
3869*4882a593Smuzhiyun 
3870*4882a593Smuzhiyun 	if (dn.data_blkaddr != COMPRESS_ADDR) {
3871*4882a593Smuzhiyun 		dn.ofs_in_node += block - start_idx;
3872*4882a593Smuzhiyun 		blknr = f2fs_data_blkaddr(&dn);
3873*4882a593Smuzhiyun 		if (!__is_valid_data_blkaddr(blknr))
3874*4882a593Smuzhiyun 			blknr = 0;
3875*4882a593Smuzhiyun 	}
3876*4882a593Smuzhiyun 
3877*4882a593Smuzhiyun 	f2fs_put_dnode(&dn);
3878*4882a593Smuzhiyun 	return blknr;
3879*4882a593Smuzhiyun #else
3880*4882a593Smuzhiyun 	return 0;
3881*4882a593Smuzhiyun #endif
3882*4882a593Smuzhiyun }
3883*4882a593Smuzhiyun 
3884*4882a593Smuzhiyun 
f2fs_bmap(struct address_space * mapping,sector_t block)3885*4882a593Smuzhiyun static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
3886*4882a593Smuzhiyun {
3887*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
3888*4882a593Smuzhiyun 	sector_t blknr = 0;
3889*4882a593Smuzhiyun 
3890*4882a593Smuzhiyun 	if (f2fs_has_inline_data(inode))
3891*4882a593Smuzhiyun 		goto out;
3892*4882a593Smuzhiyun 
3893*4882a593Smuzhiyun 	/* make sure allocating whole blocks */
3894*4882a593Smuzhiyun 	if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
3895*4882a593Smuzhiyun 		filemap_write_and_wait(mapping);
3896*4882a593Smuzhiyun 
3897*4882a593Smuzhiyun 	/* Block number less than F2FS MAX BLOCKS */
3898*4882a593Smuzhiyun 	if (unlikely(block >= max_file_blocks(inode)))
3899*4882a593Smuzhiyun 		goto out;
3900*4882a593Smuzhiyun 
3901*4882a593Smuzhiyun 	if (f2fs_compressed_file(inode)) {
3902*4882a593Smuzhiyun 		blknr = f2fs_bmap_compress(inode, block);
3903*4882a593Smuzhiyun 	} else {
3904*4882a593Smuzhiyun 		struct f2fs_map_blocks map;
3905*4882a593Smuzhiyun 
3906*4882a593Smuzhiyun 		memset(&map, 0, sizeof(map));
3907*4882a593Smuzhiyun 		map.m_lblk = block;
3908*4882a593Smuzhiyun 		map.m_len = 1;
3909*4882a593Smuzhiyun 		map.m_next_pgofs = NULL;
3910*4882a593Smuzhiyun 		map.m_seg_type = NO_CHECK_TYPE;
3911*4882a593Smuzhiyun 
3912*4882a593Smuzhiyun 		if (!f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_BMAP))
3913*4882a593Smuzhiyun 			blknr = map.m_pblk;
3914*4882a593Smuzhiyun 	}
3915*4882a593Smuzhiyun out:
3916*4882a593Smuzhiyun 	trace_f2fs_bmap(inode, block, blknr);
3917*4882a593Smuzhiyun 	return blknr;
3918*4882a593Smuzhiyun }
3919*4882a593Smuzhiyun 
3920*4882a593Smuzhiyun #ifdef CONFIG_MIGRATION
3921*4882a593Smuzhiyun #include <linux/migrate.h>
3922*4882a593Smuzhiyun 
f2fs_migrate_page(struct address_space * mapping,struct page * newpage,struct page * page,enum migrate_mode mode)3923*4882a593Smuzhiyun int f2fs_migrate_page(struct address_space *mapping,
3924*4882a593Smuzhiyun 		struct page *newpage, struct page *page, enum migrate_mode mode)
3925*4882a593Smuzhiyun {
3926*4882a593Smuzhiyun 	int rc, extra_count;
3927*4882a593Smuzhiyun 	struct f2fs_inode_info *fi = F2FS_I(mapping->host);
3928*4882a593Smuzhiyun 	bool atomic_written = page_private_atomic(page);
3929*4882a593Smuzhiyun 
3930*4882a593Smuzhiyun 	BUG_ON(PageWriteback(page));
3931*4882a593Smuzhiyun 
3932*4882a593Smuzhiyun 	/* migrating an atomic written page is safe with the inmem_lock hold */
3933*4882a593Smuzhiyun 	if (atomic_written) {
3934*4882a593Smuzhiyun 		if (mode != MIGRATE_SYNC)
3935*4882a593Smuzhiyun 			return -EBUSY;
3936*4882a593Smuzhiyun 		if (!mutex_trylock(&fi->inmem_lock))
3937*4882a593Smuzhiyun 			return -EAGAIN;
3938*4882a593Smuzhiyun 	}
3939*4882a593Smuzhiyun 
3940*4882a593Smuzhiyun 	/* one extra reference was held for atomic_write page */
3941*4882a593Smuzhiyun 	extra_count = atomic_written ? 1 : 0;
3942*4882a593Smuzhiyun 	rc = migrate_page_move_mapping(mapping, newpage,
3943*4882a593Smuzhiyun 				page, extra_count);
3944*4882a593Smuzhiyun 	if (rc != MIGRATEPAGE_SUCCESS) {
3945*4882a593Smuzhiyun 		if (atomic_written)
3946*4882a593Smuzhiyun 			mutex_unlock(&fi->inmem_lock);
3947*4882a593Smuzhiyun 		return rc;
3948*4882a593Smuzhiyun 	}
3949*4882a593Smuzhiyun 
3950*4882a593Smuzhiyun 	if (atomic_written) {
3951*4882a593Smuzhiyun 		struct inmem_pages *cur;
3952*4882a593Smuzhiyun 
3953*4882a593Smuzhiyun 		list_for_each_entry(cur, &fi->inmem_pages, list)
3954*4882a593Smuzhiyun 			if (cur->page == page) {
3955*4882a593Smuzhiyun 				cur->page = newpage;
3956*4882a593Smuzhiyun 				break;
3957*4882a593Smuzhiyun 			}
3958*4882a593Smuzhiyun 		mutex_unlock(&fi->inmem_lock);
3959*4882a593Smuzhiyun 		put_page(page);
3960*4882a593Smuzhiyun 		get_page(newpage);
3961*4882a593Smuzhiyun 	}
3962*4882a593Smuzhiyun 
3963*4882a593Smuzhiyun 	/* guarantee to start from no stale private field */
3964*4882a593Smuzhiyun 	set_page_private(newpage, 0);
3965*4882a593Smuzhiyun 	if (PagePrivate(page)) {
3966*4882a593Smuzhiyun 		set_page_private(newpage, page_private(page));
3967*4882a593Smuzhiyun 		SetPagePrivate(newpage);
3968*4882a593Smuzhiyun 		get_page(newpage);
3969*4882a593Smuzhiyun 
3970*4882a593Smuzhiyun 		set_page_private(page, 0);
3971*4882a593Smuzhiyun 		ClearPagePrivate(page);
3972*4882a593Smuzhiyun 		put_page(page);
3973*4882a593Smuzhiyun 	}
3974*4882a593Smuzhiyun 
3975*4882a593Smuzhiyun 	if (mode != MIGRATE_SYNC_NO_COPY)
3976*4882a593Smuzhiyun 		migrate_page_copy(newpage, page);
3977*4882a593Smuzhiyun 	else
3978*4882a593Smuzhiyun 		migrate_page_states(newpage, page);
3979*4882a593Smuzhiyun 
3980*4882a593Smuzhiyun 	return MIGRATEPAGE_SUCCESS;
3981*4882a593Smuzhiyun }
3982*4882a593Smuzhiyun #endif
3983*4882a593Smuzhiyun 
3984*4882a593Smuzhiyun #ifdef CONFIG_SWAP
f2fs_migrate_blocks(struct inode * inode,block_t start_blk,unsigned int blkcnt)3985*4882a593Smuzhiyun static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk,
3986*4882a593Smuzhiyun 							unsigned int blkcnt)
3987*4882a593Smuzhiyun {
3988*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3989*4882a593Smuzhiyun 	unsigned int blkofs;
3990*4882a593Smuzhiyun 	unsigned int blk_per_sec = BLKS_PER_SEC(sbi);
3991*4882a593Smuzhiyun 	unsigned int secidx = start_blk / blk_per_sec;
3992*4882a593Smuzhiyun 	unsigned int end_sec = secidx + blkcnt / blk_per_sec;
3993*4882a593Smuzhiyun 	int ret = 0;
3994*4882a593Smuzhiyun 
3995*4882a593Smuzhiyun 	f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3996*4882a593Smuzhiyun 	f2fs_down_write(&F2FS_I(inode)->i_mmap_sem);
3997*4882a593Smuzhiyun 
3998*4882a593Smuzhiyun 	set_inode_flag(inode, FI_ALIGNED_WRITE);
3999*4882a593Smuzhiyun 	set_inode_flag(inode, FI_OPU_WRITE);
4000*4882a593Smuzhiyun 
4001*4882a593Smuzhiyun 	for (; secidx < end_sec; secidx++) {
4002*4882a593Smuzhiyun 		f2fs_down_write(&sbi->pin_sem);
4003*4882a593Smuzhiyun 
4004*4882a593Smuzhiyun 		f2fs_lock_op(sbi);
4005*4882a593Smuzhiyun 		f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
4006*4882a593Smuzhiyun 		f2fs_unlock_op(sbi);
4007*4882a593Smuzhiyun 
4008*4882a593Smuzhiyun 		set_inode_flag(inode, FI_SKIP_WRITES);
4009*4882a593Smuzhiyun 
4010*4882a593Smuzhiyun 		for (blkofs = 0; blkofs < blk_per_sec; blkofs++) {
4011*4882a593Smuzhiyun 			struct page *page;
4012*4882a593Smuzhiyun 			unsigned int blkidx = secidx * blk_per_sec + blkofs;
4013*4882a593Smuzhiyun 
4014*4882a593Smuzhiyun 			page = f2fs_get_lock_data_page(inode, blkidx, true);
4015*4882a593Smuzhiyun 			if (IS_ERR(page)) {
4016*4882a593Smuzhiyun 				f2fs_up_write(&sbi->pin_sem);
4017*4882a593Smuzhiyun 				ret = PTR_ERR(page);
4018*4882a593Smuzhiyun 				goto done;
4019*4882a593Smuzhiyun 			}
4020*4882a593Smuzhiyun 
4021*4882a593Smuzhiyun 			set_page_dirty(page);
4022*4882a593Smuzhiyun 			f2fs_put_page(page, 1);
4023*4882a593Smuzhiyun 		}
4024*4882a593Smuzhiyun 
4025*4882a593Smuzhiyun 		clear_inode_flag(inode, FI_SKIP_WRITES);
4026*4882a593Smuzhiyun 
4027*4882a593Smuzhiyun 		ret = filemap_fdatawrite(inode->i_mapping);
4028*4882a593Smuzhiyun 
4029*4882a593Smuzhiyun 		f2fs_up_write(&sbi->pin_sem);
4030*4882a593Smuzhiyun 
4031*4882a593Smuzhiyun 		if (ret)
4032*4882a593Smuzhiyun 			break;
4033*4882a593Smuzhiyun 	}
4034*4882a593Smuzhiyun 
4035*4882a593Smuzhiyun done:
4036*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_SKIP_WRITES);
4037*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_OPU_WRITE);
4038*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_ALIGNED_WRITE);
4039*4882a593Smuzhiyun 
4040*4882a593Smuzhiyun 	f2fs_up_write(&F2FS_I(inode)->i_mmap_sem);
4041*4882a593Smuzhiyun 	f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
4042*4882a593Smuzhiyun 
4043*4882a593Smuzhiyun 	return ret;
4044*4882a593Smuzhiyun }
4045*4882a593Smuzhiyun 
check_swap_activate(struct swap_info_struct * sis,struct file * swap_file,sector_t * span)4046*4882a593Smuzhiyun static int check_swap_activate(struct swap_info_struct *sis,
4047*4882a593Smuzhiyun 				struct file *swap_file, sector_t *span)
4048*4882a593Smuzhiyun {
4049*4882a593Smuzhiyun 	struct address_space *mapping = swap_file->f_mapping;
4050*4882a593Smuzhiyun 	struct inode *inode = mapping->host;
4051*4882a593Smuzhiyun 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
4052*4882a593Smuzhiyun 	sector_t cur_lblock;
4053*4882a593Smuzhiyun 	sector_t last_lblock;
4054*4882a593Smuzhiyun 	sector_t pblock;
4055*4882a593Smuzhiyun 	sector_t lowest_pblock = -1;
4056*4882a593Smuzhiyun 	sector_t highest_pblock = 0;
4057*4882a593Smuzhiyun 	int nr_extents = 0;
4058*4882a593Smuzhiyun 	unsigned long nr_pblocks;
4059*4882a593Smuzhiyun 	unsigned int blks_per_sec = BLKS_PER_SEC(sbi);
4060*4882a593Smuzhiyun 	unsigned int sec_blks_mask = BLKS_PER_SEC(sbi) - 1;
4061*4882a593Smuzhiyun 	unsigned int not_aligned = 0;
4062*4882a593Smuzhiyun 	int ret = 0;
4063*4882a593Smuzhiyun 
4064*4882a593Smuzhiyun 	/*
4065*4882a593Smuzhiyun 	 * Map all the blocks into the extent list.  This code doesn't try
4066*4882a593Smuzhiyun 	 * to be very smart.
4067*4882a593Smuzhiyun 	 */
4068*4882a593Smuzhiyun 	cur_lblock = 0;
4069*4882a593Smuzhiyun 	last_lblock = bytes_to_blks(inode, i_size_read(inode));
4070*4882a593Smuzhiyun 
4071*4882a593Smuzhiyun 	while (cur_lblock < last_lblock && cur_lblock < sis->max) {
4072*4882a593Smuzhiyun 		struct f2fs_map_blocks map;
4073*4882a593Smuzhiyun retry:
4074*4882a593Smuzhiyun 		cond_resched();
4075*4882a593Smuzhiyun 
4076*4882a593Smuzhiyun 		memset(&map, 0, sizeof(map));
4077*4882a593Smuzhiyun 		map.m_lblk = cur_lblock;
4078*4882a593Smuzhiyun 		map.m_len = last_lblock - cur_lblock;
4079*4882a593Smuzhiyun 		map.m_next_pgofs = NULL;
4080*4882a593Smuzhiyun 		map.m_next_extent = NULL;
4081*4882a593Smuzhiyun 		map.m_seg_type = NO_CHECK_TYPE;
4082*4882a593Smuzhiyun 		map.m_may_create = false;
4083*4882a593Smuzhiyun 
4084*4882a593Smuzhiyun 		ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
4085*4882a593Smuzhiyun 		if (ret)
4086*4882a593Smuzhiyun 			goto out;
4087*4882a593Smuzhiyun 
4088*4882a593Smuzhiyun 		/* hole */
4089*4882a593Smuzhiyun 		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
4090*4882a593Smuzhiyun 			f2fs_err(sbi, "Swapfile has holes");
4091*4882a593Smuzhiyun 			ret = -EINVAL;
4092*4882a593Smuzhiyun 			goto out;
4093*4882a593Smuzhiyun 		}
4094*4882a593Smuzhiyun 
4095*4882a593Smuzhiyun 		pblock = map.m_pblk;
4096*4882a593Smuzhiyun 		nr_pblocks = map.m_len;
4097*4882a593Smuzhiyun 
4098*4882a593Smuzhiyun 		if ((pblock - SM_I(sbi)->main_blkaddr) & sec_blks_mask ||
4099*4882a593Smuzhiyun 				nr_pblocks & sec_blks_mask) {
4100*4882a593Smuzhiyun 			not_aligned++;
4101*4882a593Smuzhiyun 
4102*4882a593Smuzhiyun 			nr_pblocks = roundup(nr_pblocks, blks_per_sec);
4103*4882a593Smuzhiyun 			if (cur_lblock + nr_pblocks > sis->max)
4104*4882a593Smuzhiyun 				nr_pblocks -= blks_per_sec;
4105*4882a593Smuzhiyun 
4106*4882a593Smuzhiyun 			if (!nr_pblocks) {
4107*4882a593Smuzhiyun 				/* this extent is last one */
4108*4882a593Smuzhiyun 				nr_pblocks = map.m_len;
4109*4882a593Smuzhiyun 				f2fs_warn(sbi, "Swapfile: last extent is not aligned to section");
4110*4882a593Smuzhiyun 				goto next;
4111*4882a593Smuzhiyun 			}
4112*4882a593Smuzhiyun 
4113*4882a593Smuzhiyun 			ret = f2fs_migrate_blocks(inode, cur_lblock,
4114*4882a593Smuzhiyun 							nr_pblocks);
4115*4882a593Smuzhiyun 			if (ret)
4116*4882a593Smuzhiyun 				goto out;
4117*4882a593Smuzhiyun 			goto retry;
4118*4882a593Smuzhiyun 		}
4119*4882a593Smuzhiyun next:
4120*4882a593Smuzhiyun 		if (cur_lblock + nr_pblocks >= sis->max)
4121*4882a593Smuzhiyun 			nr_pblocks = sis->max - cur_lblock;
4122*4882a593Smuzhiyun 
4123*4882a593Smuzhiyun 		if (cur_lblock) {	/* exclude the header page */
4124*4882a593Smuzhiyun 			if (pblock < lowest_pblock)
4125*4882a593Smuzhiyun 				lowest_pblock = pblock;
4126*4882a593Smuzhiyun 			if (pblock + nr_pblocks - 1 > highest_pblock)
4127*4882a593Smuzhiyun 				highest_pblock = pblock + nr_pblocks - 1;
4128*4882a593Smuzhiyun 		}
4129*4882a593Smuzhiyun 
4130*4882a593Smuzhiyun 		/*
4131*4882a593Smuzhiyun 		 * We found a PAGE_SIZE-length, PAGE_SIZE-aligned run of blocks
4132*4882a593Smuzhiyun 		 */
4133*4882a593Smuzhiyun 		ret = add_swap_extent(sis, cur_lblock, nr_pblocks, pblock);
4134*4882a593Smuzhiyun 		if (ret < 0)
4135*4882a593Smuzhiyun 			goto out;
4136*4882a593Smuzhiyun 		nr_extents += ret;
4137*4882a593Smuzhiyun 		cur_lblock += nr_pblocks;
4138*4882a593Smuzhiyun 	}
4139*4882a593Smuzhiyun 	ret = nr_extents;
4140*4882a593Smuzhiyun 	*span = 1 + highest_pblock - lowest_pblock;
4141*4882a593Smuzhiyun 	if (cur_lblock == 0)
4142*4882a593Smuzhiyun 		cur_lblock = 1;	/* force Empty message */
4143*4882a593Smuzhiyun 	sis->max = cur_lblock;
4144*4882a593Smuzhiyun 	sis->pages = cur_lblock - 1;
4145*4882a593Smuzhiyun 	sis->highest_bit = cur_lblock - 1;
4146*4882a593Smuzhiyun out:
4147*4882a593Smuzhiyun 	if (not_aligned)
4148*4882a593Smuzhiyun 		f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate(%u * N)",
4149*4882a593Smuzhiyun 			  not_aligned, blks_per_sec * F2FS_BLKSIZE);
4150*4882a593Smuzhiyun 	return ret;
4151*4882a593Smuzhiyun }
4152*4882a593Smuzhiyun 
f2fs_swap_activate(struct swap_info_struct * sis,struct file * file,sector_t * span)4153*4882a593Smuzhiyun static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
4154*4882a593Smuzhiyun 				sector_t *span)
4155*4882a593Smuzhiyun {
4156*4882a593Smuzhiyun 	struct inode *inode = file_inode(file);
4157*4882a593Smuzhiyun 	int ret;
4158*4882a593Smuzhiyun 
4159*4882a593Smuzhiyun 	if (!S_ISREG(inode->i_mode))
4160*4882a593Smuzhiyun 		return -EINVAL;
4161*4882a593Smuzhiyun 
4162*4882a593Smuzhiyun 	if (f2fs_readonly(F2FS_I_SB(inode)->sb))
4163*4882a593Smuzhiyun 		return -EROFS;
4164*4882a593Smuzhiyun 
4165*4882a593Smuzhiyun 	if (f2fs_lfs_mode(F2FS_I_SB(inode))) {
4166*4882a593Smuzhiyun 		f2fs_err(F2FS_I_SB(inode),
4167*4882a593Smuzhiyun 			"Swapfile not supported in LFS mode");
4168*4882a593Smuzhiyun 		return -EINVAL;
4169*4882a593Smuzhiyun 	}
4170*4882a593Smuzhiyun 
4171*4882a593Smuzhiyun 	ret = f2fs_convert_inline_inode(inode);
4172*4882a593Smuzhiyun 	if (ret)
4173*4882a593Smuzhiyun 		return ret;
4174*4882a593Smuzhiyun 
4175*4882a593Smuzhiyun 	if (!f2fs_disable_compressed_file(inode))
4176*4882a593Smuzhiyun 		return -EINVAL;
4177*4882a593Smuzhiyun 
4178*4882a593Smuzhiyun 	f2fs_precache_extents(inode);
4179*4882a593Smuzhiyun 
4180*4882a593Smuzhiyun 	ret = check_swap_activate(sis, file, span);
4181*4882a593Smuzhiyun 	if (ret < 0)
4182*4882a593Smuzhiyun 		return ret;
4183*4882a593Smuzhiyun 
4184*4882a593Smuzhiyun 	set_inode_flag(inode, FI_PIN_FILE);
4185*4882a593Smuzhiyun 	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
4186*4882a593Smuzhiyun 	return ret;
4187*4882a593Smuzhiyun }
4188*4882a593Smuzhiyun 
f2fs_swap_deactivate(struct file * file)4189*4882a593Smuzhiyun static void f2fs_swap_deactivate(struct file *file)
4190*4882a593Smuzhiyun {
4191*4882a593Smuzhiyun 	struct inode *inode = file_inode(file);
4192*4882a593Smuzhiyun 
4193*4882a593Smuzhiyun 	clear_inode_flag(inode, FI_PIN_FILE);
4194*4882a593Smuzhiyun }
4195*4882a593Smuzhiyun #else
f2fs_swap_activate(struct swap_info_struct * sis,struct file * file,sector_t * span)4196*4882a593Smuzhiyun static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
4197*4882a593Smuzhiyun 				sector_t *span)
4198*4882a593Smuzhiyun {
4199*4882a593Smuzhiyun 	return -EOPNOTSUPP;
4200*4882a593Smuzhiyun }
4201*4882a593Smuzhiyun 
f2fs_swap_deactivate(struct file * file)4202*4882a593Smuzhiyun static void f2fs_swap_deactivate(struct file *file)
4203*4882a593Smuzhiyun {
4204*4882a593Smuzhiyun }
4205*4882a593Smuzhiyun #endif
4206*4882a593Smuzhiyun 
4207*4882a593Smuzhiyun const struct address_space_operations f2fs_dblock_aops = {
4208*4882a593Smuzhiyun 	.readpage	= f2fs_read_data_page,
4209*4882a593Smuzhiyun 	.readahead	= f2fs_readahead,
4210*4882a593Smuzhiyun 	.writepage	= f2fs_write_data_page,
4211*4882a593Smuzhiyun 	.writepages	= f2fs_write_data_pages,
4212*4882a593Smuzhiyun 	.write_begin	= f2fs_write_begin,
4213*4882a593Smuzhiyun 	.write_end	= f2fs_write_end,
4214*4882a593Smuzhiyun 	.set_page_dirty	= f2fs_set_data_page_dirty,
4215*4882a593Smuzhiyun 	.invalidatepage	= f2fs_invalidate_page,
4216*4882a593Smuzhiyun 	.releasepage	= f2fs_release_page,
4217*4882a593Smuzhiyun 	.direct_IO	= f2fs_direct_IO,
4218*4882a593Smuzhiyun 	.bmap		= f2fs_bmap,
4219*4882a593Smuzhiyun 	.swap_activate  = f2fs_swap_activate,
4220*4882a593Smuzhiyun 	.swap_deactivate = f2fs_swap_deactivate,
4221*4882a593Smuzhiyun #ifdef CONFIG_MIGRATION
4222*4882a593Smuzhiyun 	.migratepage    = f2fs_migrate_page,
4223*4882a593Smuzhiyun #endif
4224*4882a593Smuzhiyun };
4225*4882a593Smuzhiyun 
f2fs_clear_page_cache_dirty_tag(struct page * page)4226*4882a593Smuzhiyun void f2fs_clear_page_cache_dirty_tag(struct page *page)
4227*4882a593Smuzhiyun {
4228*4882a593Smuzhiyun 	struct address_space *mapping = page_mapping(page);
4229*4882a593Smuzhiyun 	unsigned long flags;
4230*4882a593Smuzhiyun 
4231*4882a593Smuzhiyun 	xa_lock_irqsave(&mapping->i_pages, flags);
4232*4882a593Smuzhiyun 	__xa_clear_mark(&mapping->i_pages, page_index(page),
4233*4882a593Smuzhiyun 						PAGECACHE_TAG_DIRTY);
4234*4882a593Smuzhiyun 	xa_unlock_irqrestore(&mapping->i_pages, flags);
4235*4882a593Smuzhiyun }
4236*4882a593Smuzhiyun 
f2fs_init_post_read_processing(void)4237*4882a593Smuzhiyun int __init f2fs_init_post_read_processing(void)
4238*4882a593Smuzhiyun {
4239*4882a593Smuzhiyun 	bio_post_read_ctx_cache =
4240*4882a593Smuzhiyun 		kmem_cache_create("f2fs_bio_post_read_ctx",
4241*4882a593Smuzhiyun 				  sizeof(struct bio_post_read_ctx), 0, 0, NULL);
4242*4882a593Smuzhiyun 	if (!bio_post_read_ctx_cache)
4243*4882a593Smuzhiyun 		goto fail;
4244*4882a593Smuzhiyun 	bio_post_read_ctx_pool =
4245*4882a593Smuzhiyun 		mempool_create_slab_pool(NUM_PREALLOC_POST_READ_CTXS,
4246*4882a593Smuzhiyun 					 bio_post_read_ctx_cache);
4247*4882a593Smuzhiyun 	if (!bio_post_read_ctx_pool)
4248*4882a593Smuzhiyun 		goto fail_free_cache;
4249*4882a593Smuzhiyun 	return 0;
4250*4882a593Smuzhiyun 
4251*4882a593Smuzhiyun fail_free_cache:
4252*4882a593Smuzhiyun 	kmem_cache_destroy(bio_post_read_ctx_cache);
4253*4882a593Smuzhiyun fail:
4254*4882a593Smuzhiyun 	return -ENOMEM;
4255*4882a593Smuzhiyun }
4256*4882a593Smuzhiyun 
f2fs_destroy_post_read_processing(void)4257*4882a593Smuzhiyun void f2fs_destroy_post_read_processing(void)
4258*4882a593Smuzhiyun {
4259*4882a593Smuzhiyun 	mempool_destroy(bio_post_read_ctx_pool);
4260*4882a593Smuzhiyun 	kmem_cache_destroy(bio_post_read_ctx_cache);
4261*4882a593Smuzhiyun }
4262*4882a593Smuzhiyun 
f2fs_init_post_read_wq(struct f2fs_sb_info * sbi)4263*4882a593Smuzhiyun int f2fs_init_post_read_wq(struct f2fs_sb_info *sbi)
4264*4882a593Smuzhiyun {
4265*4882a593Smuzhiyun 	if (!f2fs_sb_has_encrypt(sbi) &&
4266*4882a593Smuzhiyun 		!f2fs_sb_has_verity(sbi) &&
4267*4882a593Smuzhiyun 		!f2fs_sb_has_compression(sbi))
4268*4882a593Smuzhiyun 		return 0;
4269*4882a593Smuzhiyun 
4270*4882a593Smuzhiyun 	sbi->post_read_wq = alloc_workqueue("f2fs_post_read_wq",
4271*4882a593Smuzhiyun 						 WQ_UNBOUND | WQ_HIGHPRI,
4272*4882a593Smuzhiyun 						 num_online_cpus());
4273*4882a593Smuzhiyun 	if (!sbi->post_read_wq)
4274*4882a593Smuzhiyun 		return -ENOMEM;
4275*4882a593Smuzhiyun 	return 0;
4276*4882a593Smuzhiyun }
4277*4882a593Smuzhiyun 
f2fs_destroy_post_read_wq(struct f2fs_sb_info * sbi)4278*4882a593Smuzhiyun void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi)
4279*4882a593Smuzhiyun {
4280*4882a593Smuzhiyun 	if (sbi->post_read_wq)
4281*4882a593Smuzhiyun 		destroy_workqueue(sbi->post_read_wq);
4282*4882a593Smuzhiyun }
4283*4882a593Smuzhiyun 
f2fs_init_bio_entry_cache(void)4284*4882a593Smuzhiyun int __init f2fs_init_bio_entry_cache(void)
4285*4882a593Smuzhiyun {
4286*4882a593Smuzhiyun 	bio_entry_slab = f2fs_kmem_cache_create("f2fs_bio_entry_slab",
4287*4882a593Smuzhiyun 			sizeof(struct bio_entry));
4288*4882a593Smuzhiyun 	if (!bio_entry_slab)
4289*4882a593Smuzhiyun 		return -ENOMEM;
4290*4882a593Smuzhiyun 	return 0;
4291*4882a593Smuzhiyun }
4292*4882a593Smuzhiyun 
f2fs_destroy_bio_entry_cache(void)4293*4882a593Smuzhiyun void f2fs_destroy_bio_entry_cache(void)
4294*4882a593Smuzhiyun {
4295*4882a593Smuzhiyun 	kmem_cache_destroy(bio_entry_slab);
4296*4882a593Smuzhiyun }
4297