data.c 100 KB
Newer Older
Chao Yu's avatar
Chao Yu committed
1
// SPDX-License-Identifier: GPL-2.0
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2
/*
3 4 5 6 7 8 9 10 11 12 13
 * fs/f2fs/data.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 */
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/buffer_head.h>
#include <linux/mpage.h>
#include <linux/writeback.h>
#include <linux/backing-dev.h>
Chao Yu's avatar
Chao Yu committed
14
#include <linux/pagevec.h>
15 16
#include <linux/blkdev.h>
#include <linux/bio.h>
17
#include <linux/blk-crypto.h>
Jaegeuk Kim's avatar
Jaegeuk Kim committed
18
#include <linux/swap.h>
19
#include <linux/prefetch.h>
20
#include <linux/uio.h>
21
#include <linux/cleancache.h>
22
#include <linux/sched/signal.h>
23
#include <linux/fiemap.h>
24 25 26 27

#include "f2fs.h"
#include "node.h"
#include "segment.h"
28
#include <trace/events/f2fs.h>
29

30 31 32
#define NUM_PREALLOC_POST_READ_CTXS	128

static struct kmem_cache *bio_post_read_ctx_cache;
Chao Yu's avatar
Chao Yu committed
33
static struct kmem_cache *bio_entry_slab;
34
static mempool_t *bio_post_read_ctx_pool;
Chao Yu's avatar
Chao Yu committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
static struct bio_set f2fs_bioset;

#define	F2FS_BIO_POOL_SIZE	NR_CURSEG_TYPE

int __init f2fs_init_bioset(void)
{
	if (bioset_init(&f2fs_bioset, F2FS_BIO_POOL_SIZE,
					0, BIOSET_NEED_BVECS))
		return -ENOMEM;
	return 0;
}

void f2fs_destroy_bioset(void)
{
	bioset_exit(&f2fs_bioset);
}

52 53 54 55 56 57 58 59 60 61 62 63 64
static bool __is_cp_guaranteed(struct page *page)
{
	struct address_space *mapping = page->mapping;
	struct inode *inode;
	struct f2fs_sb_info *sbi;

	if (!mapping)
		return false;

	inode = mapping->host;
	sbi = F2FS_I_SB(inode);

	if (inode->i_ino == F2FS_META_INO(sbi) ||
Jack Qiu's avatar
Jack Qiu committed
65
			inode->i_ino == F2FS_NODE_INO(sbi) ||
66 67 68 69 70 71
			S_ISDIR(inode->i_mode))
		return true;

	if (f2fs_is_compressed_page(page))
		return false;
	if ((S_ISREG(inode->i_mode) &&
72
			(f2fs_is_atomic_file(inode) || IS_NOQUOTA(inode))) ||
73
			page_private_gcing(page))
74 75 76 77
		return true;
	return false;
}

78 79
static enum count_type __read_io_type(struct page *page)
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
80
	struct address_space *mapping = page_file_mapping(page);
81 82 83 84 85 86 87 88 89 90 91 92 93 94

	if (mapping) {
		struct inode *inode = mapping->host;
		struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

		if (inode->i_ino == F2FS_META_INO(sbi))
			return F2FS_RD_META;

		if (inode->i_ino == F2FS_NODE_INO(sbi))
			return F2FS_RD_NODE;
	}
	return F2FS_RD_DATA;
}

95 96
/* postprocessing steps for read bios */
enum bio_post_read_step {
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
#ifdef CONFIG_FS_ENCRYPTION
	STEP_DECRYPT	= 1 << 0,
#else
	STEP_DECRYPT	= 0,	/* compile out the decryption-related code */
#endif
#ifdef CONFIG_F2FS_FS_COMPRESSION
	STEP_DECOMPRESS	= 1 << 1,
#else
	STEP_DECOMPRESS	= 0,	/* compile out the decompression-related code */
#endif
#ifdef CONFIG_FS_VERITY
	STEP_VERITY	= 1 << 2,
#else
	STEP_VERITY	= 0,	/* compile out the verity-related code */
#endif
112 113 114 115
};

struct bio_post_read_ctx {
	struct bio *bio;
Chao Yu's avatar
Chao Yu committed
116
	struct f2fs_sb_info *sbi;
117 118
	struct work_struct work;
	unsigned int enabled_steps;
119
	block_t fs_blkaddr;
120 121
};

122
static void f2fs_finish_read_bio(struct bio *bio)
123
{
124
	struct bio_vec *bv;
125
	struct bvec_iter_all iter_all;
126

127 128 129 130
	/*
	 * Update and unlock the bio's pagecache pages, and put the
	 * decompression context for any compressed pages.
	 */
131
	bio_for_each_segment_all(bv, bio, iter_all) {
132
		struct page *page = bv->bv_page;
133

134 135
		if (f2fs_is_compressed_page(page)) {
			if (bio->bi_status)
136
				f2fs_end_read_compressed_page(page, true, 0);
137
			f2fs_put_page_dic(page);
Chao Yu's avatar
Chao Yu committed
138 139 140
			continue;
		}

141
		/* PG_error was set if decryption or verity failed. */
142 143
		if (bio->bi_status || PageError(page)) {
			ClearPageUptodate(page);
144 145
			/* will re-read again later */
			ClearPageError(page);
146 147 148
		} else {
			SetPageUptodate(page);
		}
149
		dec_page_count(F2FS_P_SB(page), __read_io_type(page));
150 151
		unlock_page(page);
	}
152

153 154 155
	if (bio->bi_private)
		mempool_free(bio->bi_private, bio_post_read_ctx_pool);
	bio_put(bio);
Chao Yu's avatar
Chao Yu committed
156 157
}

158
static void f2fs_verify_bio(struct work_struct *work)
159 160 161
{
	struct bio_post_read_ctx *ctx =
		container_of(work, struct bio_post_read_ctx, work);
162
	struct bio *bio = ctx->bio;
163
	bool may_have_compressed_pages = (ctx->enabled_steps & STEP_DECOMPRESS);
164 165 166

	/*
	 * fsverity_verify_bio() may call readpages() again, and while verity
167 168 169 170
	 * will be disabled for this, decryption and/or decompression may still
	 * be needed, resulting in another bio_post_read_ctx being allocated.
	 * So to prevent deadlocks we need to release the current ctx to the
	 * mempool first.  This assumes that verity is the last post-read step.
171 172 173
	 */
	mempool_free(ctx, bio_post_read_ctx_pool);
	bio->bi_private = NULL;
174

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	/*
	 * Verify the bio's pages with fs-verity.  Exclude compressed pages,
	 * as those were handled separately by f2fs_end_read_compressed_page().
	 */
	if (may_have_compressed_pages) {
		struct bio_vec *bv;
		struct bvec_iter_all iter_all;

		bio_for_each_segment_all(bv, bio, iter_all) {
			struct page *page = bv->bv_page;

			if (!f2fs_is_compressed_page(page) &&
			    !PageError(page) && !fsverity_verify_page(page))
				SetPageError(page);
		}
	} else {
		fsverity_verify_bio(bio);
Chao Yu's avatar
Chao Yu committed
192
	}
193

194
	f2fs_finish_read_bio(bio);
195 196
}

197 198 199 200 201 202 203 204 205 206
/*
 * If the bio's data needs to be verified with fs-verity, then enqueue the
 * verity work for the bio.  Otherwise finish the bio now.
 *
 * Note that to avoid deadlocks, the verity work can't be done on the
 * decryption/decompression workqueue.  This is because verifying the data pages
 * can involve reading verity metadata pages from the file, and these verity
 * metadata pages may be encrypted and/or compressed.
 */
static void f2fs_verify_and_finish_bio(struct bio *bio)
Eric Biggers's avatar
Eric Biggers committed
207
{
208
	struct bio_post_read_ctx *ctx = bio->bi_private;
Chao Yu's avatar
Chao Yu committed
209

210 211
	if (ctx && (ctx->enabled_steps & STEP_VERITY)) {
		INIT_WORK(&ctx->work, f2fs_verify_bio);
Chao Yu's avatar
Chao Yu committed
212
		fsverity_enqueue_verify_work(&ctx->work);
213 214
	} else {
		f2fs_finish_read_bio(bio);
Chao Yu's avatar
Chao Yu committed
215 216
	}
}
Eric Biggers's avatar
Eric Biggers committed
217

218 219 220 221 222 223 224 225 226 227
/*
 * Handle STEP_DECOMPRESS by decompressing any compressed clusters whose last
 * remaining page was read by @ctx->bio.
 *
 * Note that a bio may span clusters (even a mix of compressed and uncompressed
 * clusters) or be for just part of a cluster.  STEP_DECOMPRESS just indicates
 * that the bio includes at least one compressed page.  The actual decompression
 * is done on a per-cluster basis, not a per-bio basis.
 */
static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx)
228
{
229 230 231
	struct bio_vec *bv;
	struct bvec_iter_all iter_all;
	bool all_compressed = true;
232
	block_t blkaddr = ctx->fs_blkaddr;
Chao Yu's avatar
Chao Yu committed
233

234 235
	bio_for_each_segment_all(bv, ctx->bio, iter_all) {
		struct page *page = bv->bv_page;
Chao Yu's avatar
Chao Yu committed
236

237 238
		/* PG_error was set if decryption failed. */
		if (f2fs_is_compressed_page(page))
239 240
			f2fs_end_read_compressed_page(page, PageError(page),
						blkaddr);
241 242
		else
			all_compressed = false;
243 244

		blkaddr++;
245
	}
Chao Yu's avatar
Chao Yu committed
246

247 248 249 250 251 252 253
	/*
	 * Optimization: if all the bio's pages are compressed, then scheduling
	 * the per-bio verity work is unnecessary, as verity will be fully
	 * handled at the compression cluster level.
	 */
	if (all_compressed)
		ctx->enabled_steps &= ~STEP_VERITY;
254 255
}

256
static void f2fs_post_read_work(struct work_struct *work)
257
{
258 259 260 261 262 263 264 265 266 267
	struct bio_post_read_ctx *ctx =
		container_of(work, struct bio_post_read_ctx, work);

	if (ctx->enabled_steps & STEP_DECRYPT)
		fscrypt_decrypt_bio(ctx->bio);

	if (ctx->enabled_steps & STEP_DECOMPRESS)
		f2fs_handle_step_decompress(ctx);

	f2fs_verify_and_finish_bio(ctx->bio);
268 269 270 271
}

static void f2fs_read_end_io(struct bio *bio)
{
272
	struct f2fs_sb_info *sbi = F2FS_P_SB(bio_first_page_all(bio));
273
	struct bio_post_read_ctx *ctx = bio->bi_private;
274 275 276

	if (time_to_inject(sbi, FAULT_READ_IO)) {
		f2fs_show_injection_info(sbi, FAULT_READ_IO);
277
		bio->bi_status = BLK_STS_IOERR;
278
	}
Chao Yu's avatar
Chao Yu committed
279

280 281
	if (bio->bi_status) {
		f2fs_finish_read_bio(bio);
282
		return;
283
	}
284

285 286 287 288 289 290
	if (ctx && (ctx->enabled_steps & (STEP_DECRYPT | STEP_DECOMPRESS))) {
		INIT_WORK(&ctx->work, f2fs_post_read_work);
		queue_work(ctx->sbi->post_read_wq, &ctx->work);
	} else {
		f2fs_verify_and_finish_bio(bio);
	}
291 292
}

293
static void f2fs_write_end_io(struct bio *bio)
294
{
295
	struct f2fs_sb_info *sbi = bio->bi_private;
296
	struct bio_vec *bvec;
297
	struct bvec_iter_all iter_all;
298

299
	if (time_to_inject(sbi, FAULT_WRITE_IO)) {
300
		f2fs_show_injection_info(sbi, FAULT_WRITE_IO);
301 302 303
		bio->bi_status = BLK_STS_IOERR;
	}

304
	bio_for_each_segment_all(bvec, bio, iter_all) {
305
		struct page *page = bvec->bv_page;
306
		enum count_type type = WB_DATA_TYPE(page);
307

308 309
		if (page_private_dummy(page)) {
			clear_page_private_dummy(page);
310 311 312
			unlock_page(page);
			mempool_free(page, sbi->write_io_dummy);

313
			if (unlikely(bio->bi_status))
314 315 316 317
				f2fs_stop_checkpoint(sbi, true);
			continue;
		}

318
		fscrypt_finalize_bounce_page(&page);
319

Chao Yu's avatar
Chao Yu committed
320 321 322 323 324 325 326
#ifdef CONFIG_F2FS_FS_COMPRESSION
		if (f2fs_is_compressed_page(page)) {
			f2fs_compress_write_end_io(bio, page);
			continue;
		}
#endif

327
		if (unlikely(bio->bi_status)) {
328
			mapping_set_error(page->mapping, -EIO);
329 330
			if (type == F2FS_WB_CP_DATA)
				f2fs_stop_checkpoint(sbi, true);
331
		}
332 333 334 335

		f2fs_bug_on(sbi, page->mapping == NODE_MAPPING(sbi) &&
					page->index != nid_of_node(page));

336
		dec_page_count(sbi, type);
337 338
		if (f2fs_in_warm_node_list(sbi, page))
			f2fs_del_fsync_node_entry(sbi, page);
339
		clear_page_private_gcing(page);
340
		end_page_writeback(page);
341
	}
342
	if (!get_pages(sbi, F2FS_WB_CP_DATA) &&
343
				wq_has_sleeper(&sbi->cp_wait))
344 345 346 347 348
		wake_up(&sbi->cp_wait);

	bio_put(bio);
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
349 350 351 352 353 354
struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi,
				block_t blk_addr, struct bio *bio)
{
	struct block_device *bdev = sbi->sb->s_bdev;
	int i;

355 356 357 358 359 360 361 362
	if (f2fs_is_multi_device(sbi)) {
		for (i = 0; i < sbi->s_ndevs; i++) {
			if (FDEV(i).start_blk <= blk_addr &&
			    FDEV(i).end_blk >= blk_addr) {
				blk_addr -= FDEV(i).start_blk;
				bdev = FDEV(i).bdev;
				break;
			}
Jaegeuk Kim's avatar
Jaegeuk Kim committed
363 364 365
		}
	}
	if (bio) {
366
		bio_set_dev(bio, bdev);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
367 368 369 370 371 372 373 374 375
		bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(blk_addr);
	}
	return bdev;
}

int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr)
{
	int i;

376 377 378
	if (!f2fs_is_multi_device(sbi))
		return 0;

Jaegeuk Kim's avatar
Jaegeuk Kim committed
379 380 381 382 383 384
	for (i = 0; i < sbi->s_ndevs; i++)
		if (FDEV(i).start_blk <= blkaddr && FDEV(i).end_blk >= blkaddr)
			return i;
	return 0;
}

385
static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages)
386
{
387
	struct f2fs_sb_info *sbi = fio->sbi;
388 389
	struct bio *bio;

390
	bio = bio_alloc_bioset(GFP_NOIO, npages, &f2fs_bioset);
391

392 393
	f2fs_target_device(sbi, fio->new_blkaddr, bio);
	if (is_read_io(fio->op)) {
394 395 396 397 398
		bio->bi_end_io = f2fs_read_end_io;
		bio->bi_private = NULL;
	} else {
		bio->bi_end_io = f2fs_write_end_io;
		bio->bi_private = sbi;
399 400
		bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi,
						fio->type, fio->temp);
401
	}
402 403
	if (fio->io_wbc)
		wbc_init_bio(fio->io_wbc, bio);
404 405 406 407

	return bio;
}

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
static void f2fs_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
				  pgoff_t first_idx,
				  const struct f2fs_io_info *fio,
				  gfp_t gfp_mask)
{
	/*
	 * The f2fs garbage collector sets ->encrypted_page when it wants to
	 * read/write raw data without encryption.
	 */
	if (!fio || !fio->encrypted_page)
		fscrypt_set_bio_crypt_ctx(bio, inode, first_idx, gfp_mask);
}

static bool f2fs_crypt_mergeable_bio(struct bio *bio, const struct inode *inode,
				     pgoff_t next_idx,
				     const struct f2fs_io_info *fio)
{
	/*
	 * The f2fs garbage collector sets ->encrypted_page when it wants to
	 * read/write raw data without encryption.
	 */
	if (fio && fio->encrypted_page)
		return !bio_has_crypt_ctx(bio);

	return fscrypt_mergeable_bio(bio, inode, next_idx);
}

435 436
static inline void __submit_bio(struct f2fs_sb_info *sbi,
				struct bio *bio, enum page_type type)
437
{
438
	if (!is_read_io(bio_op(bio))) {
439 440 441 442 443
		unsigned int start;

		if (type != DATA && type != NODE)
			goto submit_io;

444
		if (f2fs_lfs_mode(sbi) && current->plug)
445 446
			blk_finish_plug(current->plug);

447
		if (!F2FS_IO_ALIGNED(sbi))
448 449
			goto submit_io;

450 451 452 453 454 455 456 457 458 459
		start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;
		start %= F2FS_IO_SIZE(sbi);

		if (start == 0)
			goto submit_io;

		/* fill dummy pages */
		for (; start < F2FS_IO_SIZE(sbi); start++) {
			struct page *page =
				mempool_alloc(sbi->write_io_dummy,
460
					      GFP_NOIO | __GFP_NOFAIL);
461 462 463
			f2fs_bug_on(sbi, !page);

			lock_page(page);
464 465 466 467

			zero_user_segment(page, 0, PAGE_SIZE);
			set_page_private_dummy(page);

468 469 470 471 472 473 474 475 476
			if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
				f2fs_bug_on(sbi, 1);
		}
		/*
		 * In the NODE case, we lose next block address chain. So, we
		 * need to do checkpoint in f2fs_sync_file.
		 */
		if (type == NODE)
			set_sbi_flag(sbi, SBI_NEED_CP);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
477
	}
478
submit_io:
Jaegeuk Kim's avatar
Jaegeuk Kim committed
479 480 481 482
	if (is_read_io(bio_op(bio)))
		trace_f2fs_submit_read_bio(sbi->sb, type, bio);
	else
		trace_f2fs_submit_write_bio(sbi->sb, type, bio);
483
	submit_bio(bio);
484 485
}

Chao Yu's avatar
Chao Yu committed
486 487 488 489 490 491
void f2fs_submit_bio(struct f2fs_sb_info *sbi,
				struct bio *bio, enum page_type type)
{
	__submit_bio(sbi, bio, type);
}

492
static void __attach_io_flag(struct f2fs_io_info *fio)
493 494 495
{
	struct f2fs_sb_info *sbi = fio->sbi;
	unsigned int temp_mask = (1 << NR_TEMP_TYPE) - 1;
496 497 498 499 500 501 502 503 504 505 506 507
	unsigned int io_flag, fua_flag, meta_flag;

	if (fio->type == DATA)
		io_flag = sbi->data_io_flag;
	else if (fio->type == NODE)
		io_flag = sbi->node_io_flag;
	else
		return;

	fua_flag = io_flag & temp_mask;
	meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask;

508
	/*
509
	 * data/node io flag bits per temp:
510 511 512 513 514 515 516 517 518 519
	 *      REQ_META     |      REQ_FUA      |
	 *    5 |    4 |   3 |    2 |    1 |   0 |
	 * Cold | Warm | Hot | Cold | Warm | Hot |
	 */
	if ((1 << fio->temp) & meta_flag)
		fio->op_flags |= REQ_META;
	if ((1 << fio->temp) & fua_flag)
		fio->op_flags |= REQ_FUA;
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
520
static void __submit_merged_bio(struct f2fs_bio_info *io)
521
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
522
	struct f2fs_io_info *fio = &io->fio;
523 524 525 526

	if (!io->bio)
		return;

527
	__attach_io_flag(fio);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
528 529
	bio_set_op_attrs(io->bio, fio->op, fio->op_flags);

Mike Christie's avatar
Mike Christie committed
530
	if (is_read_io(fio->op))
Jaegeuk Kim's avatar
Jaegeuk Kim committed
531
		trace_f2fs_prepare_read_bio(io->sbi->sb, fio->type, io->bio);
532
	else
Jaegeuk Kim's avatar
Jaegeuk Kim committed
533
		trace_f2fs_prepare_write_bio(io->sbi->sb, fio->type, io->bio);
Mike Christie's avatar
Mike Christie committed
534

535
	__submit_bio(io->sbi, io->bio, fio->type);
536 537 538
	io->bio = NULL;
}

Chao Yu's avatar
Chao Yu committed
539
static bool __has_merged_page(struct bio *bio, struct inode *inode,
540
						struct page *page, nid_t ino)
Chao Yu's avatar
Chao Yu committed
541 542
{
	struct bio_vec *bvec;
543
	struct bvec_iter_all iter_all;
Chao Yu's avatar
Chao Yu committed
544

Chao Yu's avatar
Chao Yu committed
545
	if (!bio)
Chao Yu's avatar
Chao Yu committed
546
		return false;
547

548
	if (!inode && !page && !ino)
549
		return true;
Chao Yu's avatar
Chao Yu committed
550

Chao Yu's avatar
Chao Yu committed
551
	bio_for_each_segment_all(bvec, bio, iter_all) {
Chao Yu's avatar
Chao Yu committed
552
		struct page *target = bvec->bv_page;
Chao Yu's avatar
Chao Yu committed
553

Chao Yu's avatar
Chao Yu committed
554
		if (fscrypt_is_bounce_page(target)) {
555
			target = fscrypt_pagecache_page(target);
Chao Yu's avatar
Chao Yu committed
556 557 558 559 560 561 562 563
			if (IS_ERR(target))
				continue;
		}
		if (f2fs_is_compressed_page(target)) {
			target = f2fs_compress_control_page(target);
			if (IS_ERR(target))
				continue;
		}
Chao Yu's avatar
Chao Yu committed
564

565 566
		if (inode && inode == target->mapping->host)
			return true;
567 568
		if (page && page == target)
			return true;
569
		if (ino && ino == ino_of_node(target))
Chao Yu's avatar
Chao Yu committed
570 571 572 573 574 575
			return true;
	}

	return false;
}

576
static void __f2fs_submit_merged_write(struct f2fs_sb_info *sbi,
Jaegeuk Kim's avatar
Jaegeuk Kim committed
577
				enum page_type type, enum temp_type temp)
578 579
{
	enum page_type btype = PAGE_TYPE_OF_BIO(type);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
580
	struct f2fs_bio_info *io = sbi->write_io[btype] + temp;
581

582
	down_write(&io->io_rwsem);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
583 584 585 586

	/* change META to META_FLUSH in the checkpoint procedure */
	if (type >= META_FLUSH) {
		io->fio.type = META_FLUSH;
Mike Christie's avatar
Mike Christie committed
587
		io->fio.op = REQ_OP_WRITE;
588
		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
589
		if (!test_opt(sbi, NOBARRIER))
590
			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
591 592
	}
	__submit_merged_bio(io);
593
	up_write(&io->io_rwsem);
594 595
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
596
static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
597 598
				struct inode *inode, struct page *page,
				nid_t ino, enum page_type type, bool force)
599
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
600
	enum temp_type temp;
601
	bool ret = true;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
602 603

	for (temp = HOT; temp < NR_TEMP_TYPE; temp++) {
604 605 606
		if (!force)	{
			enum page_type btype = PAGE_TYPE_OF_BIO(type);
			struct f2fs_bio_info *io = sbi->write_io[btype] + temp;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
607

608
			down_read(&io->io_rwsem);
Chao Yu's avatar
Chao Yu committed
609
			ret = __has_merged_page(io->bio, inode, page, ino);
610 611 612 613
			up_read(&io->io_rwsem);
		}
		if (ret)
			__f2fs_submit_merged_write(sbi, type, temp);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
614 615 616 617 618

		/* TODO: use HOT temp only for meta pages now. */
		if (type >= META)
			break;
	}
619 620
}

621
void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type)
622
{
623
	__submit_merged_write_cond(sbi, NULL, NULL, 0, type, true);
624 625
}

626
void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
627 628
				struct inode *inode, struct page *page,
				nid_t ino, enum page_type type)
629
{
630
	__submit_merged_write_cond(sbi, inode, page, ino, type, false);
631 632
}

633
void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi)
634
{
635 636 637
	f2fs_submit_merged_write(sbi, DATA);
	f2fs_submit_merged_write(sbi, NODE);
	f2fs_submit_merged_write(sbi, META);
638 639
}

640 641
/*
 * Fill the locked page with data located in the block address.
642
 * A caller needs to unlock the page on failure.
643
 */
644
int f2fs_submit_page_bio(struct f2fs_io_info *fio)
645 646
{
	struct bio *bio;
647 648
	struct page *page = fio->encrypted_page ?
			fio->encrypted_page : fio->page;
649

650
	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
651 652
			fio->is_por ? META_POR : (__is_meta_io(fio) ?
			META_GENERIC : DATA_GENERIC_ENHANCE)))
653
		return -EFSCORRUPTED;
654

655
	trace_f2fs_submit_page_bio(page, fio);
656 657

	/* Allocate a new bio */
658
	bio = __bio_alloc(fio, 1);
659

660 661 662
	f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
			       fio->page->index, fio, GFP_NOIO);

663
	if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
664 665 666
		bio_put(bio);
		return -EFAULT;
	}
667 668

	if (fio->io_wbc && !is_read_io(fio->op))
669
		wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
670

671
	__attach_io_flag(fio);
Mike Christie's avatar
Mike Christie committed
672
	bio_set_op_attrs(bio, fio->op, fio->op_flags);
673

674 675
	inc_page_count(fio->sbi, is_read_io(fio->op) ?
			__read_io_type(page): WB_DATA_TYPE(fio->page));
Chao Yu's avatar
Chao Yu committed
676 677

	__submit_bio(fio->sbi, bio, fio->type);
678 679 680
	return 0;
}

681 682 683
static bool page_is_mergeable(struct f2fs_sb_info *sbi, struct bio *bio,
				block_t last_blkaddr, block_t cur_blkaddr)
{
684 685 686
	if (unlikely(sbi->max_io_bytes &&
			bio->bi_iter.bi_size >= sbi->max_io_bytes))
		return false;
687 688
	if (last_blkaddr + 1 != cur_blkaddr)
		return false;
689
	return bio->bi_bdev == f2fs_target_device(sbi, cur_blkaddr, NULL);
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
}

static bool io_type_is_mergeable(struct f2fs_bio_info *io,
						struct f2fs_io_info *fio)
{
	if (io->fio.op != fio->op)
		return false;
	return io->fio.op_flags == fio->op_flags;
}

static bool 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)
{
706 707 708 709 710 711 712 713 714 715
	if (F2FS_IO_ALIGNED(sbi) && (fio->type == DATA || fio->type == NODE)) {
		unsigned int filled_blocks =
				F2FS_BYTES_TO_BLK(bio->bi_iter.bi_size);
		unsigned int io_size = F2FS_IO_SIZE(sbi);
		unsigned int left_vecs = bio->bi_max_vecs - bio->bi_vcnt;

		/* IOs in bio is aligned and left space of vectors is not enough */
		if (!(filled_blocks % io_size) && left_vecs < io_size)
			return false;
	}
716 717 718 719 720
	if (!page_is_mergeable(sbi, bio, last_blkaddr, cur_blkaddr))
		return false;
	return io_type_is_mergeable(io, fio);
}

Chao Yu's avatar
Chao Yu committed
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
static void add_bio_entry(struct f2fs_sb_info *sbi, struct bio *bio,
				struct page *page, enum temp_type temp)
{
	struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
	struct bio_entry *be;

	be = f2fs_kmem_cache_alloc(bio_entry_slab, GFP_NOFS);
	be->bio = bio;
	bio_get(bio);

	if (bio_add_page(bio, page, PAGE_SIZE, 0) != PAGE_SIZE)
		f2fs_bug_on(sbi, 1);

	down_write(&io->bio_list_lock);
	list_add_tail(&be->list, &io->bio_list);
	up_write(&io->bio_list_lock);
}

static void del_bio_entry(struct bio_entry *be)
{
	list_del(&be->list);
	kmem_cache_free(bio_entry_slab, be);
}

745
static int add_ipu_page(struct f2fs_io_info *fio, struct bio **bio,
Chao Yu's avatar
Chao Yu committed
746 747
							struct page *page)
{
748
	struct f2fs_sb_info *sbi = fio->sbi;
Chao Yu's avatar
Chao Yu committed
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
	enum temp_type temp;
	bool found = false;
	int ret = -EAGAIN;

	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
		struct list_head *head = &io->bio_list;
		struct bio_entry *be;

		down_write(&io->bio_list_lock);
		list_for_each_entry(be, head, list) {
			if (be->bio != *bio)
				continue;

			found = true;

765 766 767 768 769 770 771 772
			f2fs_bug_on(sbi, !page_is_mergeable(sbi, *bio,
							    *fio->last_block,
							    fio->new_blkaddr));
			if (f2fs_crypt_mergeable_bio(*bio,
					fio->page->mapping->host,
					fio->page->index, fio) &&
			    bio_add_page(*bio, page, PAGE_SIZE, 0) ==
					PAGE_SIZE) {
Chao Yu's avatar
Chao Yu committed
773 774 775 776
				ret = 0;
				break;
			}

777
			/* page can't be merged into bio; submit the bio */
Chao Yu's avatar
Chao Yu committed
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
			del_bio_entry(be);
			__submit_bio(sbi, *bio, DATA);
			break;
		}
		up_write(&io->bio_list_lock);
	}

	if (ret) {
		bio_put(*bio);
		*bio = NULL;
	}

	return ret;
}

void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi,
					struct bio **bio, struct page *page)
{
	enum temp_type temp;
	bool found = false;
	struct bio *target = bio ? *bio : NULL;

	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
		struct list_head *head = &io->bio_list;
		struct bio_entry *be;

		if (list_empty(head))
			continue;

		down_read(&io->bio_list_lock);
		list_for_each_entry(be, head, list) {
			if (target)
				found = (target == be->bio);
			else
				found = __has_merged_page(be->bio, NULL,
								page, 0);
			if (found)
				break;
		}
		up_read(&io->bio_list_lock);

		if (!found)
			continue;

		found = false;

		down_write(&io->bio_list_lock);
		list_for_each_entry(be, head, list) {
			if (target)
				found = (target == be->bio);
			else
				found = __has_merged_page(be->bio, NULL,
								page, 0);
			if (found) {
				target = be->bio;
				del_bio_entry(be);
				break;
			}
		}
		up_write(&io->bio_list_lock);
	}

	if (found)
		__submit_bio(sbi, target, DATA);
	if (bio && *bio) {
		bio_put(*bio);
		*bio = NULL;
	}
}

Chao Yu's avatar
Chao Yu committed
849 850 851 852 853 854 855 856
int f2fs_merge_page_bio(struct f2fs_io_info *fio)
{
	struct bio *bio = *fio->bio;
	struct page *page = fio->encrypted_page ?
			fio->encrypted_page : fio->page;

	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
			__is_meta_io(fio) ? META_GENERIC : DATA_GENERIC))
857
		return -EFSCORRUPTED;
Chao Yu's avatar
Chao Yu committed
858 859 860

	trace_f2fs_submit_page_bio(page, fio);

861
	if (bio && !page_is_mergeable(fio->sbi, bio, *fio->last_block,
Chao Yu's avatar
Chao Yu committed
862 863
						fio->new_blkaddr))
		f2fs_submit_merged_ipu_write(fio->sbi, &bio, NULL);
Chao Yu's avatar
Chao Yu committed
864 865
alloc_new:
	if (!bio) {
866
		bio = __bio_alloc(fio, BIO_MAX_VECS);
867
		__attach_io_flag(fio);
868 869
		f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
				       fio->page->index, fio, GFP_NOIO);
Chao Yu's avatar
Chao Yu committed
870 871
		bio_set_op_attrs(bio, fio->op, fio->op_flags);

Chao Yu's avatar
Chao Yu committed
872 873
		add_bio_entry(fio->sbi, bio, page, fio->temp);
	} else {
874
		if (add_ipu_page(fio, &bio, page))
Chao Yu's avatar
Chao Yu committed
875
			goto alloc_new;
Chao Yu's avatar
Chao Yu committed
876 877 878
	}

	if (fio->io_wbc)
879
		wbc_account_cgroup_owner(fio->io_wbc, page, PAGE_SIZE);
Chao Yu's avatar
Chao Yu committed
880 881 882 883 884 885 886 887 888

	inc_page_count(fio->sbi, WB_DATA_TYPE(page));

	*fio->last_block = fio->new_blkaddr;
	*fio->bio = bio;

	return 0;
}

889
void f2fs_submit_page_write(struct f2fs_io_info *fio)
890
{
891
	struct f2fs_sb_info *sbi = fio->sbi;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
892
	enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
893
	struct f2fs_bio_info *io = sbi->write_io[btype] + fio->temp;
894
	struct page *bio_page;
895

896
	f2fs_bug_on(sbi, is_read_io(fio->op));
897

898 899 900 901 902 903
	down_write(&io->io_rwsem);
next:
	if (fio->in_list) {
		spin_lock(&io->io_lock);
		if (list_empty(&io->io_list)) {
			spin_unlock(&io->io_lock);
904
			goto out;
905 906 907 908 909 910
		}
		fio = list_first_entry(&io->io_list,
						struct f2fs_io_info, list);
		list_del(&fio->list);
		spin_unlock(&io->io_lock);
	}
911

912
	verify_fio_blkaddr(fio);
913

Chao Yu's avatar
Chao Yu committed
914 915 916 917 918 919
	if (fio->encrypted_page)
		bio_page = fio->encrypted_page;
	else if (fio->compressed_page)
		bio_page = fio->compressed_page;
	else
		bio_page = fio->page;
920

921 922
	/* set submitted = true as a return value */
	fio->submitted = true;
923

924
	inc_page_count(sbi, WB_DATA_TYPE(bio_page));
925

926 927 928 929 930
	if (io->bio &&
	    (!io_is_mergeable(sbi, io->bio, io, fio, io->last_block_in_bio,
			      fio->new_blkaddr) ||
	     !f2fs_crypt_mergeable_bio(io->bio, fio->page->mapping->host,
				       bio_page->index, fio)))
Jaegeuk Kim's avatar
Jaegeuk Kim committed
931
		__submit_merged_bio(io);
932 933
alloc_new:
	if (io->bio == NULL) {
934 935
		if (F2FS_IO_ALIGNED(sbi) &&
				(fio->type == DATA || fio->type == NODE) &&
936
				fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
937
			dec_page_count(sbi, WB_DATA_TYPE(bio_page));
938 939
			fio->retry = true;
			goto skip;
940
		}
941
		io->bio = __bio_alloc(fio, BIO_MAX_VECS);
942 943
		f2fs_set_bio_crypt_ctx(io->bio, fio->page->mapping->host,
				       bio_page->index, fio, GFP_NOIO);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
944
		io->fio = *fio;
945 946
	}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
947
	if (bio_add_page(io->bio, bio_page, PAGE_SIZE, 0) < PAGE_SIZE) {
Jaegeuk Kim's avatar
Jaegeuk Kim committed
948
		__submit_merged_bio(io);
949 950 951
		goto alloc_new;
	}

952
	if (fio->io_wbc)
953
		wbc_account_cgroup_owner(fio->io_wbc, bio_page, PAGE_SIZE);
954

955
	io->last_block_in_bio = fio->new_blkaddr;
956 957

	trace_f2fs_submit_page_write(fio->page, fio);
958
skip:
959 960
	if (fio->in_list)
		goto next;
961
out:
Daniel Rosenberg's avatar
Daniel Rosenberg committed
962
	if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
963
				!f2fs_is_checkpoint_ready(sbi))
Jaegeuk Kim's avatar
Jaegeuk Kim committed
964
		__submit_merged_bio(io);
965
	up_write(&io->io_rwsem);
966 967
}

968
static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr,
Eric Biggers's avatar
Eric Biggers committed
969
				      unsigned nr_pages, unsigned op_flag,
970
				      pgoff_t first_idx, bool for_write)
971 972 973
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct bio *bio;
974 975
	struct bio_post_read_ctx *ctx;
	unsigned int post_read_steps = 0;
976

977
	bio = bio_alloc_bioset(for_write ? GFP_NOIO : GFP_KERNEL,
978
			       bio_max_segs(nr_pages), &f2fs_bioset);
979
	if (!bio)
980
		return ERR_PTR(-ENOMEM);
981 982 983

	f2fs_set_bio_crypt_ctx(bio, inode, first_idx, NULL, GFP_NOFS);

984 985
	f2fs_target_device(sbi, blkaddr, bio);
	bio->bi_end_io = f2fs_read_end_io;
986
	bio_set_op_attrs(bio, REQ_OP_READ, op_flag);
987

988
	if (fscrypt_inode_uses_fs_layer_crypto(inode))
989
		post_read_steps |= STEP_DECRYPT;
Eric Biggers's avatar
Eric Biggers committed
990

991 992 993 994 995 996 997 998 999 1000 1001
	if (f2fs_need_verity(inode, first_idx))
		post_read_steps |= STEP_VERITY;

	/*
	 * STEP_DECOMPRESS is handled specially, since a compressed file might
	 * contain both compressed and uncompressed clusters.  We'll allocate a
	 * bio_post_read_ctx if the file is compressed, but the caller is
	 * responsible for enabling STEP_DECOMPRESS if it's actually needed.
	 */

	if (post_read_steps || f2fs_compressed_file(inode)) {
1002
		/* Due to the mempool, this never fails. */
1003 1004
		ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS);
		ctx->bio = bio;
Chao Yu's avatar
Chao Yu committed
1005
		ctx->sbi = sbi;
1006
		ctx->enabled_steps = post_read_steps;
1007
		ctx->fs_blkaddr = blkaddr;
1008 1009 1010
		bio->bi_private = ctx;
	}

1011 1012 1013 1014 1015
	return bio;
}

/* This can handle encryption stuffs */
static int f2fs_submit_page_read(struct inode *inode, struct page *page,
1016
				 block_t blkaddr, int op_flags, bool for_write)
1017
{
1018 1019
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct bio *bio;
1020

1021
	bio = f2fs_grab_read_bio(inode, blkaddr, 1, op_flags,
1022
					page->index, for_write);
1023 1024 1025
	if (IS_ERR(bio))
		return PTR_ERR(bio);

1026 1027 1028
	/* wait for GCed page writeback via META_MAPPING */
	f2fs_wait_on_block_writeback(inode, blkaddr);

1029 1030 1031 1032
	if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
		bio_put(bio);
		return -EFAULT;
	}
1033
	ClearPageError(page);
1034
	inc_page_count(sbi, F2FS_RD_DATA);
Chao Yu's avatar
Chao Yu committed
1035
	f2fs_update_iostat(sbi, FS_DATA_READ_IO, F2FS_BLKSIZE);
1036
	__submit_bio(sbi, bio, DATA);
1037 1038 1039
	return 0;
}

1040 1041 1042 1043
static void __set_data_blkaddr(struct dnode_of_data *dn)
{
	struct f2fs_node *rn = F2FS_NODE(dn->node_page);
	__le32 *addr_array;
1044 1045 1046 1047
	int base = 0;

	if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
		base = get_extra_isize(dn->inode);
1048 1049 1050

	/* Get physical address of data block */
	addr_array = blkaddr_in_node(rn);
1051
	addr_array[base + dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
1052 1053
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1054
/*
1055 1056 1057 1058 1059
 * Lock ordering for the change of data block address:
 * ->data_page
 *  ->node_page
 *    update block addresses in the node page
 */
Chao Yu's avatar
Chao Yu committed
1060
void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
1061
{
1062
	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
1063 1064
	__set_data_blkaddr(dn);
	if (set_page_dirty(dn->node_page))
1065
		dn->node_changed = true;
1066 1067
}

1068 1069 1070
void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
{
	dn->data_blkaddr = blkaddr;
Chao Yu's avatar
Chao Yu committed
1071
	f2fs_set_data_blkaddr(dn);
1072 1073 1074
	f2fs_update_extent_cache(dn);
}

1075
/* dn->ofs_in_node will be returned with up-to-date last block pointer */
Chao Yu's avatar
Chao Yu committed
1076
int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
1077
{
1078
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1079
	int err;
1080

1081 1082 1083
	if (!count)
		return 0;

1084
	if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
1085
		return -EPERM;
1086 1087
	if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
		return err;
1088

1089 1090 1091
	trace_f2fs_reserve_new_blocks(dn->inode, dn->nid,
						dn->ofs_in_node, count);

1092
	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
1093 1094

	for (; count > 0; dn->ofs_in_node++) {
1095
		block_t blkaddr = f2fs_data_blkaddr(dn);
Yi Zhuang's avatar
Yi Zhuang committed
1096

1097 1098 1099 1100 1101 1102 1103 1104 1105
		if (blkaddr == NULL_ADDR) {
			dn->data_blkaddr = NEW_ADDR;
			__set_data_blkaddr(dn);
			count--;
		}
	}

	if (set_page_dirty(dn->node_page))
		dn->node_changed = true;
1106 1107 1108
	return 0;
}

1109
/* Should keep dn->ofs_in_node unchanged */
Chao Yu's avatar
Chao Yu committed
1110
int f2fs_reserve_new_block(struct dnode_of_data *dn)
1111 1112 1113 1114
{
	unsigned int ofs_in_node = dn->ofs_in_node;
	int ret;

Chao Yu's avatar
Chao Yu committed
1115
	ret = f2fs_reserve_new_blocks(dn, 1);
1116 1117 1118 1119
	dn->ofs_in_node = ofs_in_node;
	return ret;
}

1120 1121 1122 1123 1124
int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
{
	bool need_put = dn->inode_page ? false : true;
	int err;

Chao Yu's avatar
Chao Yu committed
1125
	err = f2fs_get_dnode_of_data(dn, index, ALLOC_NODE);
1126 1127
	if (err)
		return err;
1128

1129
	if (dn->data_blkaddr == NULL_ADDR)
Chao Yu's avatar
Chao Yu committed
1130
		err = f2fs_reserve_new_block(dn);
1131
	if (err || need_put)
1132 1133 1134 1135
		f2fs_put_dnode(dn);
	return err;
}

1136
int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index)
1137
{
1138
	struct extent_info ei = {0, };
1139
	struct inode *inode = dn->inode;
1140

1141 1142 1143
	if (f2fs_lookup_extent_cache(inode, index, &ei)) {
		dn->data_blkaddr = ei.blk + index - ei.fofs;
		return 0;
1144
	}
1145

1146
	return f2fs_reserve_block(dn, index);
1147 1148
}

Chao Yu's avatar
Chao Yu committed
1149
struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index,
Mike Christie's avatar
Mike Christie committed
1150
						int op_flags, bool for_write)
1151 1152 1153 1154
{
	struct address_space *mapping = inode->i_mapping;
	struct dnode_of_data dn;
	struct page *page;
1155
	struct extent_info ei = {0, };
1156
	int err;
1157

1158
	page = f2fs_grab_cache_page(mapping, index, for_write);
1159 1160 1161
	if (!page)
		return ERR_PTR(-ENOMEM);

Chao Yu's avatar
Chao Yu committed
1162 1163
	if (f2fs_lookup_extent_cache(inode, index, &ei)) {
		dn.data_blkaddr = ei.blk + index - ei.fofs;
1164 1165
		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr,
						DATA_GENERIC_ENHANCE_READ)) {
1166
			err = -EFSCORRUPTED;
1167 1168
			goto put_err;
		}
Chao Yu's avatar
Chao Yu committed
1169 1170 1171
		goto got_it;
	}

1172
	set_new_dnode(&dn, inode, NULL, NULL, 0);
Chao Yu's avatar
Chao Yu committed
1173
	err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
1174 1175
	if (err)
		goto put_err;
1176 1177
	f2fs_put_dnode(&dn);

1178
	if (unlikely(dn.data_blkaddr == NULL_ADDR)) {
1179 1180
		err = -ENOENT;
		goto put_err;
1181
	}
1182 1183 1184 1185
	if (dn.data_blkaddr != NEW_ADDR &&
			!f2fs_is_valid_blkaddr(F2FS_I_SB(inode),
						dn.data_blkaddr,
						DATA_GENERIC_ENHANCE)) {
1186
		err = -EFSCORRUPTED;
1187 1188
		goto put_err;
	}
Chao Yu's avatar
Chao Yu committed
1189
got_it:
1190 1191
	if (PageUptodate(page)) {
		unlock_page(page);
1192
		return page;
1193
	}
1194

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1195 1196 1197 1198
	/*
	 * A new dentry page is allocated but not able to be written, since its
	 * new inode page couldn't be allocated due to -ENOSPC.
	 * In such the case, its blkaddr can be remained as NEW_ADDR.
Chao Yu's avatar
Chao Yu committed
1199 1200
	 * see, f2fs_add_link -> f2fs_get_new_data_page ->
	 * f2fs_init_inode_metadata.
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1201 1202
	 */
	if (dn.data_blkaddr == NEW_ADDR) {
1203
		zero_user_segment(page, 0, PAGE_SIZE);
1204 1205
		if (!PageUptodate(page))
			SetPageUptodate(page);
1206
		unlock_page(page);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1207 1208
		return page;
	}
1209

1210 1211
	err = f2fs_submit_page_read(inode, page, dn.data_blkaddr,
						op_flags, for_write);
1212
	if (err)
1213
		goto put_err;
1214
	return page;
1215 1216 1217 1218

put_err:
	f2fs_put_page(page, 1);
	return ERR_PTR(err);
1219 1220
}

Chao Yu's avatar
Chao Yu committed
1221
struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index)
1222 1223 1224 1225 1226 1227 1228 1229 1230
{
	struct address_space *mapping = inode->i_mapping;
	struct page *page;

	page = find_get_page(mapping, index);
	if (page && PageUptodate(page))
		return page;
	f2fs_put_page(page, 0);

Chao Yu's avatar
Chao Yu committed
1231
	page = f2fs_get_read_data_page(inode, index, 0, false);
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
	if (IS_ERR(page))
		return page;

	if (PageUptodate(page))
		return page;

	wait_on_page_locked(page);
	if (unlikely(!PageUptodate(page))) {
		f2fs_put_page(page, 0);
		return ERR_PTR(-EIO);
	}
	return page;
}

/*
 * If it tries to access a hole, return an error.
 * Because, the callers, functions in dir.c and GC, should be able to know
 * whether this page exists or not.
 */
Chao Yu's avatar
Chao Yu committed
1251
struct page *f2fs_get_lock_data_page(struct inode *inode, pgoff_t index,
1252
							bool for_write)
1253 1254 1255 1256
{
	struct address_space *mapping = inode->i_mapping;
	struct page *page;
repeat:
Chao Yu's avatar
Chao Yu committed
1257
	page = f2fs_get_read_data_page(inode, index, 0, for_write);
1258 1259
	if (IS_ERR(page))
		return page;
1260

1261
	/* wait for read completion */
1262
	lock_page(page);
1263
	if (unlikely(page->mapping != mapping)) {
1264 1265
		f2fs_put_page(page, 1);
		goto repeat;
1266
	}
1267 1268 1269 1270
	if (unlikely(!PageUptodate(page))) {
		f2fs_put_page(page, 1);
		return ERR_PTR(-EIO);
	}
1271 1272 1273
	return page;
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1274
/*
1275 1276
 * Caller ensures that this data page is never allocated.
 * A new zero-filled data page is allocated in the page cache.
1277
 *
Chao Yu's avatar
Chao Yu committed
1278 1279
 * Also, caller should grab and release a rwsem by calling f2fs_lock_op() and
 * f2fs_unlock_op().
1280 1281
 * Note that, ipage is set only by make_empty_dir, and if any error occur,
 * ipage should be released by this function.
1282
 */
Chao Yu's avatar
Chao Yu committed
1283
struct page *f2fs_get_new_data_page(struct inode *inode,
1284
		struct page *ipage, pgoff_t index, bool new_i_size)
1285 1286 1287 1288 1289
{
	struct address_space *mapping = inode->i_mapping;
	struct page *page;
	struct dnode_of_data dn;
	int err;
1290

1291
	page = f2fs_grab_cache_page(mapping, index, true);
1292 1293 1294 1295 1296 1297
	if (!page) {
		/*
		 * before exiting, we should make sure ipage will be released
		 * if any error occur.
		 */
		f2fs_put_page(ipage, 1);
1298
		return ERR_PTR(-ENOMEM);
1299
	}
1300

1301
	set_new_dnode(&dn, inode, ipage, NULL, 0);
1302
	err = f2fs_reserve_block(&dn, index);
1303 1304
	if (err) {
		f2fs_put_page(page, 1);
1305
		return ERR_PTR(err);
1306
	}
1307 1308
	if (!ipage)
		f2fs_put_dnode(&dn);
1309 1310

	if (PageUptodate(page))
1311
		goto got_it;
1312 1313

	if (dn.data_blkaddr == NEW_ADDR) {
1314
		zero_user_segment(page, 0, PAGE_SIZE);
1315 1316
		if (!PageUptodate(page))
			SetPageUptodate(page);
1317
	} else {
1318
		f2fs_put_page(page, 1);
1319

1320 1321
		/* if ipage exists, blkaddr should be NEW_ADDR */
		f2fs_bug_on(F2FS_I_SB(inode), ipage);
Chao Yu's avatar
Chao Yu committed
1322
		page = f2fs_get_lock_data_page(inode, index, true);
1323
		if (IS_ERR(page))
1324
			return page;
1325
	}
1326
got_it:
1327
	if (new_i_size && i_size_read(inode) <
1328
				((loff_t)(index + 1) << PAGE_SHIFT))
1329
		f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT));
1330 1331 1332
	return page;
}

1333
static int __allocate_data_block(struct dnode_of_data *dn, int seg_type)
1334
{
1335
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1336 1337
	struct f2fs_summary sum;
	struct node_info ni;
1338
	block_t old_blkaddr;
1339
	blkcnt_t count = 1;
1340
	int err;
1341

1342
	if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
1343
		return -EPERM;
1344

1345 1346 1347 1348
	err = f2fs_get_node_info(sbi, dn->nid, &ni);
	if (err)
		return err;

1349
	dn->data_blkaddr = f2fs_data_blkaddr(dn);
1350
	if (dn->data_blkaddr != NULL_ADDR)
1351 1352
		goto alloc;

1353 1354
	if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
		return err;
1355

1356
alloc:
1357
	set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
1358 1359
	old_blkaddr = dn->data_blkaddr;
	f2fs_allocate_data_block(sbi, NULL, old_blkaddr, &dn->data_blkaddr,
1360
				&sum, seg_type, NULL);
1361
	if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) {
1362 1363
		invalidate_mapping_pages(META_MAPPING(sbi),
					old_blkaddr, old_blkaddr);
1364 1365
		f2fs_invalidate_compress_page(sbi, old_blkaddr);
	}
1366
	f2fs_update_data_blkaddr(dn, dn->data_blkaddr);
1367

1368 1369 1370 1371
	/*
	 * i_size will be updated by direct_IO. Otherwise, we'll get stale
	 * data from unwritten block via dio_read.
	 */
1372 1373 1374
	return 0;
}

1375
int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
1376
{
1377
	struct inode *inode = file_inode(iocb->ki_filp);
1378
	struct f2fs_map_blocks map;
1379
	int flag;
1380
	int err = 0;
1381
	bool direct_io = iocb->ki_flags & IOCB_DIRECT;
1382

1383
	map.m_lblk = F2FS_BLK_ALIGN(iocb->ki_pos);
1384 1385 1386 1387 1388 1389
	map.m_len = F2FS_BYTES_TO_BLK(iocb->ki_pos + iov_iter_count(from));
	if (map.m_len > map.m_lblk)
		map.m_len -= map.m_lblk;
	else
		map.m_len = 0;

1390
	map.m_next_pgofs = NULL;
1391
	map.m_next_extent = NULL;
1392
	map.m_seg_type = NO_CHECK_TYPE;
1393
	map.m_may_create = true;
1394

1395
	if (direct_io) {
Chao Yu's avatar
Chao Yu committed
1396
		map.m_seg_type = f2fs_rw_hint_to_seg_type(iocb->ki_hint);
1397
		flag = f2fs_force_buffered_io(inode, iocb, from) ?
1398 1399 1400
					F2FS_GET_BLOCK_PRE_AIO :
					F2FS_GET_BLOCK_PRE_DIO;
		goto map_blocks;
1401
	}
1402
	if (iocb->ki_pos + iov_iter_count(from) > MAX_INLINE_DATA(inode)) {
1403 1404 1405
		err = f2fs_convert_inline_inode(inode);
		if (err)
			return err;
1406
	}
1407
	if (f2fs_has_inline_data(inode))
1408
		return err;
1409 1410 1411 1412 1413 1414 1415 1416 1417

	flag = F2FS_GET_BLOCK_PRE_AIO;

map_blocks:
	err = f2fs_map_blocks(inode, &map, 1, flag);
	if (map.m_len > 0 && err == -ENOSPC) {
		if (!direct_io)
			set_inode_flag(inode, FI_NO_PREALLOC);
		err = 0;
1418
	}
1419
	return err;
1420 1421
}

1422
void f2fs_do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
{
	if (flag == F2FS_GET_BLOCK_PRE_AIO) {
		if (lock)
			down_read(&sbi->node_change);
		else
			up_read(&sbi->node_change);
	} else {
		if (lock)
			f2fs_lock_op(sbi);
		else
			f2fs_unlock_op(sbi);
	}
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1437
/*
Chao Yu's avatar
Chao Yu committed
1438 1439 1440
 * f2fs_map_blocks() tries to find or build mapping relationship which
 * maps continuous logical blocks to physical blocks, and return such
 * info via f2fs_map_blocks structure.
1441
 */
Chao Yu's avatar
Chao Yu committed
1442
int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
1443
						int create, int flag)
1444
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1445
	unsigned int maxblocks = map->m_len;
1446
	struct dnode_of_data dn;
1447
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1448
	int mode = map->m_may_create ? ALLOC_NODE : LOOKUP_NODE;
1449
	pgoff_t pgofs, end_offset, end;
1450
	int err = 0, ofs = 1;
1451 1452
	unsigned int ofs_in_node, last_ofs_in_node;
	blkcnt_t prealloc;
1453
	struct extent_info ei = {0, };
1454
	block_t blkaddr;
1455
	unsigned int start_pgofs;
1456

1457 1458 1459
	if (!maxblocks)
		return 0;

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1460 1461 1462 1463 1464
	map->m_len = 0;
	map->m_flags = 0;

	/* it only supports block size == page size */
	pgofs =	(pgoff_t)map->m_lblk;
1465
	end = pgofs + maxblocks;
1466

1467
	if (!create && f2fs_lookup_extent_cache(inode, pgofs, &ei)) {
1468
		if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
1469 1470 1471
							map->m_may_create)
			goto next_dnode;

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1472 1473 1474
		map->m_pblk = ei.blk + pgofs - ei.fofs;
		map->m_len = min((pgoff_t)maxblocks, ei.fofs + ei.len - pgofs);
		map->m_flags = F2FS_MAP_MAPPED;
1475 1476
		if (map->m_next_extent)
			*map->m_next_extent = pgofs + map->m_len;
1477 1478 1479 1480 1481

		/* for hardware encryption, but to avoid potential issue in future */
		if (flag == F2FS_GET_BLOCK_DIO)
			f2fs_wait_on_block_writeback_range(inode,
						map->m_pblk, map->m_len);
1482
		goto out;
1483
	}
1484

Chao Yu's avatar
Chao Yu committed
1485
next_dnode:
1486
	if (map->m_may_create)
1487
		f2fs_do_map_lock(sbi, flag, true);
1488 1489 1490

	/* When reading holes, we need its node page */
	set_new_dnode(&dn, inode, NULL, NULL, 0);
Chao Yu's avatar
Chao Yu committed
1491
	err = f2fs_get_dnode_of_data(&dn, pgofs, mode);
1492
	if (err) {
1493 1494
		if (flag == F2FS_GET_BLOCK_BMAP)
			map->m_pblk = 0;
1495
		if (err == -ENOENT) {
1496
			err = 0;
1497 1498
			if (map->m_next_pgofs)
				*map->m_next_pgofs =
Chao Yu's avatar
Chao Yu committed
1499
					f2fs_get_next_page_offset(&dn, pgofs);
1500 1501
			if (map->m_next_extent)
				*map->m_next_extent =
Chao Yu's avatar
Chao Yu committed
1502
					f2fs_get_next_page_offset(&dn, pgofs);
1503
		}
1504
		goto unlock_out;
1505
	}
Chao Yu's avatar
Chao Yu committed
1506

1507
	start_pgofs = pgofs;
1508
	prealloc = 0;
1509
	last_ofs_in_node = ofs_in_node = dn.ofs_in_node;
1510
	end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
Chao Yu's avatar
Chao Yu committed
1511 1512

next_block:
1513
	blkaddr = f2fs_data_blkaddr(&dn);
Chao Yu's avatar
Chao Yu committed
1514

1515
	if (__is_valid_data_blkaddr(blkaddr) &&
1516
		!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) {
1517
		err = -EFSCORRUPTED;
1518 1519 1520
		goto sync_out;
	}

1521
	if (__is_valid_data_blkaddr(blkaddr)) {
1522
		/* use out-place-update for driect IO under LFS mode */
1523
		if (f2fs_lfs_mode(sbi) && flag == F2FS_GET_BLOCK_DIO &&
1524
							map->m_may_create) {
1525
			err = __allocate_data_block(&dn, map->m_seg_type);
1526 1527 1528 1529
			if (err)
				goto sync_out;
			blkaddr = dn.data_blkaddr;
			set_inode_flag(inode, FI_APPEND_WRITE);
1530 1531
		}
	} else {
Chao Yu's avatar
Chao Yu committed
1532
		if (create) {
1533 1534
			if (unlikely(f2fs_cp_error(sbi))) {
				err = -EIO;
Chao Yu's avatar
Chao Yu committed
1535
				goto sync_out;
1536
			}
1537
			if (flag == F2FS_GET_BLOCK_PRE_AIO) {
1538 1539 1540 1541
				if (blkaddr == NULL_ADDR) {
					prealloc++;
					last_ofs_in_node = dn.ofs_in_node;
				}
1542
			} else {
1543 1544
				WARN_ON(flag != F2FS_GET_BLOCK_PRE_DIO &&
					flag != F2FS_GET_BLOCK_DIO);
1545 1546
				err = __allocate_data_block(&dn,
							map->m_seg_type);
1547
				if (!err)
1548
					set_inode_flag(inode, FI_APPEND_WRITE);
1549
			}
Chao Yu's avatar
Chao Yu committed
1550
			if (err)
Chao Yu's avatar
Chao Yu committed
1551
				goto sync_out;
1552
			map->m_flags |= F2FS_MAP_NEW;
Chao Yu's avatar
Chao Yu committed
1553
			blkaddr = dn.data_blkaddr;
Chao Yu's avatar
Chao Yu committed
1554
		} else {
1555 1556 1557 1558
			if (flag == F2FS_GET_BLOCK_BMAP) {
				map->m_pblk = 0;
				goto sync_out;
			}
1559 1560
			if (flag == F2FS_GET_BLOCK_PRECACHE)
				goto sync_out;
1561 1562 1563 1564
			if (flag == F2FS_GET_BLOCK_FIEMAP &&
						blkaddr == NULL_ADDR) {
				if (map->m_next_pgofs)
					*map->m_next_pgofs = pgofs + 1;
Chao Yu's avatar
Chao Yu committed
1565
				goto sync_out;
1566
			}
1567 1568 1569 1570
			if (flag != F2FS_GET_BLOCK_FIEMAP) {
				/* for defragment case */
				if (map->m_next_pgofs)
					*map->m_next_pgofs = pgofs + 1;
Chao Yu's avatar
Chao Yu committed
1571
				goto sync_out;
1572
			}
1573 1574
		}
	}
1575

1576 1577 1578
	if (flag == F2FS_GET_BLOCK_PRE_AIO)
		goto skip;

Chao Yu's avatar
Chao Yu committed
1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
	if (map->m_len == 0) {
		/* preallocated unwritten block should be mapped for fiemap. */
		if (blkaddr == NEW_ADDR)
			map->m_flags |= F2FS_MAP_UNWRITTEN;
		map->m_flags |= F2FS_MAP_MAPPED;

		map->m_pblk = blkaddr;
		map->m_len = 1;
	} else if ((map->m_pblk != NEW_ADDR &&
			blkaddr == (map->m_pblk + ofs)) ||
1589
			(map->m_pblk == NEW_ADDR && blkaddr == NEW_ADDR) ||
1590
			flag == F2FS_GET_BLOCK_PRE_DIO) {
Chao Yu's avatar
Chao Yu committed
1591 1592 1593 1594 1595
		ofs++;
		map->m_len++;
	} else {
		goto sync_out;
	}
1596

1597
skip:
1598 1599 1600
	dn.ofs_in_node++;
	pgofs++;

1601 1602 1603
	/* preallocate blocks in batch for one dnode page */
	if (flag == F2FS_GET_BLOCK_PRE_AIO &&
			(pgofs == end || dn.ofs_in_node == end_offset)) {
1604

1605
		dn.ofs_in_node = ofs_in_node;
Chao Yu's avatar
Chao Yu committed
1606
		err = f2fs_reserve_new_blocks(&dn, prealloc);
1607 1608
		if (err)
			goto sync_out;
1609

1610 1611 1612 1613
		map->m_len += dn.ofs_in_node - ofs_in_node;
		if (prealloc && dn.ofs_in_node != last_ofs_in_node + 1) {
			err = -ENOSPC;
			goto sync_out;
1614
		}
1615 1616 1617 1618 1619 1620 1621 1622
		dn.ofs_in_node = end_offset;
	}

	if (pgofs >= end)
		goto sync_out;
	else if (dn.ofs_in_node < end_offset)
		goto next_block;

1623 1624 1625 1626 1627 1628 1629 1630 1631 1632
	if (flag == F2FS_GET_BLOCK_PRECACHE) {
		if (map->m_flags & F2FS_MAP_MAPPED) {
			unsigned int ofs = start_pgofs - map->m_lblk;

			f2fs_update_extent_cache_range(&dn,
				start_pgofs, map->m_pblk + ofs,
				map->m_len - ofs);
		}
	}

1633 1634
	f2fs_put_dnode(&dn);

1635
	if (map->m_may_create) {
1636
		f2fs_do_map_lock(sbi, flag, false);
1637
		f2fs_balance_fs(sbi, dn.node_changed);
1638
	}
1639
	goto next_dnode;
1640

1641
sync_out:
1642 1643 1644 1645 1646 1647

	/* for hardware encryption, but to avoid potential issue in future */
	if (flag == F2FS_GET_BLOCK_DIO && map->m_flags & F2FS_MAP_MAPPED)
		f2fs_wait_on_block_writeback_range(inode,
						map->m_pblk, map->m_len);

1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
	if (flag == F2FS_GET_BLOCK_PRECACHE) {
		if (map->m_flags & F2FS_MAP_MAPPED) {
			unsigned int ofs = start_pgofs - map->m_lblk;

			f2fs_update_extent_cache_range(&dn,
				start_pgofs, map->m_pblk + ofs,
				map->m_len - ofs);
		}
		if (map->m_next_extent)
			*map->m_next_extent = pgofs + 1;
	}
1659
	f2fs_put_dnode(&dn);
1660
unlock_out:
1661
	if (map->m_may_create) {
1662
		f2fs_do_map_lock(sbi, flag, false);
1663
		f2fs_balance_fs(sbi, dn.node_changed);
1664
	}
1665
out:
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1666
	trace_f2fs_map_blocks(inode, map, err);
1667
	return err;
1668 1669
}

Hyunchul Lee's avatar
Hyunchul Lee committed
1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682
bool f2fs_overwrite_io(struct inode *inode, loff_t pos, size_t len)
{
	struct f2fs_map_blocks map;
	block_t last_lblk;
	int err;

	if (pos + len > i_size_read(inode))
		return false;

	map.m_lblk = F2FS_BYTES_TO_BLK(pos);
	map.m_next_pgofs = NULL;
	map.m_next_extent = NULL;
	map.m_seg_type = NO_CHECK_TYPE;
1683
	map.m_may_create = false;
Hyunchul Lee's avatar
Hyunchul Lee committed
1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695
	last_lblk = F2FS_BLK_ALIGN(pos + len);

	while (map.m_lblk < last_lblk) {
		map.m_len = last_lblk - map.m_lblk;
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
		if (err || map.m_len == 0)
			return false;
		map.m_lblk += map.m_len;
	}
	return true;
}

1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
static inline u64 bytes_to_blks(struct inode *inode, u64 bytes)
{
	return (bytes >> inode->i_blkbits);
}

static inline u64 blks_to_bytes(struct inode *inode, u64 blks)
{
	return (blks << inode->i_blkbits);
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1706
static int __get_data_block(struct inode *inode, sector_t iblock,
1707
			struct buffer_head *bh, int create, int flag,
1708
			pgoff_t *next_pgofs, int seg_type, bool may_write)
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1709 1710
{
	struct f2fs_map_blocks map;
1711
	int err;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1712 1713

	map.m_lblk = iblock;
1714
	map.m_len = bytes_to_blks(inode, bh->b_size);
1715
	map.m_next_pgofs = next_pgofs;
1716
	map.m_next_extent = NULL;
1717
	map.m_seg_type = seg_type;
1718
	map.m_may_create = may_write;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1719

1720 1721
	err = f2fs_map_blocks(inode, &map, create, flag);
	if (!err) {
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1722 1723
		map_bh(bh, inode->i_sb, map.m_pblk);
		bh->b_state = (bh->b_state & ~F2FS_MAP_FLAGS) | map.m_flags;
1724
		bh->b_size = blks_to_bytes(inode, map.m_len);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1725
	}
1726
	return err;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1727 1728
}

1729 1730 1731 1732 1733 1734
static int get_data_block_dio_write(struct inode *inode, sector_t iblock,
			struct buffer_head *bh_result, int create)
{
	return __get_data_block(inode, iblock, bh_result, create,
				F2FS_GET_BLOCK_DIO, NULL,
				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
1735
				true);
1736 1737 1738
}

static int get_data_block_dio(struct inode *inode, sector_t iblock,
1739 1740
			struct buffer_head *bh_result, int create)
{
1741
	return __get_data_block(inode, iblock, bh_result, create,
1742 1743 1744
				F2FS_GET_BLOCK_DIO, NULL,
				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
				false);
1745 1746
}

Chao Yu's avatar
Chao Yu committed
1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765
static int f2fs_xattr_fiemap(struct inode *inode,
				struct fiemap_extent_info *fieinfo)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct page *page;
	struct node_info ni;
	__u64 phys = 0, len;
	__u32 flags;
	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
	int err = 0;

	if (f2fs_has_inline_xattr(inode)) {
		int offset;

		page = f2fs_grab_cache_page(NODE_MAPPING(sbi),
						inode->i_ino, false);
		if (!page)
			return -ENOMEM;

1766 1767 1768 1769 1770
		err = f2fs_get_node_info(sbi, inode->i_ino, &ni);
		if (err) {
			f2fs_put_page(page, 1);
			return err;
		}
Chao Yu's avatar
Chao Yu committed
1771

1772
		phys = blks_to_bytes(inode, ni.blk_addr);
Chao Yu's avatar
Chao Yu committed
1773 1774
		offset = offsetof(struct f2fs_inode, i_addr) +
					sizeof(__le32) * (DEF_ADDRS_PER_INODE -
1775
					get_inline_xattr_addrs(inode));
Chao Yu's avatar
Chao Yu committed
1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787

		phys += offset;
		len = inline_xattr_size(inode);

		f2fs_put_page(page, 1);

		flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED;

		if (!xnid)
			flags |= FIEMAP_EXTENT_LAST;

		err = fiemap_fill_next_extent(fieinfo, 0, phys, len, flags);
1788
		trace_f2fs_fiemap(inode, 0, phys, len, flags, err);
Chao Yu's avatar
Chao Yu committed
1789 1790 1791 1792 1793 1794 1795 1796 1797
		if (err || err == 1)
			return err;
	}

	if (xnid) {
		page = f2fs_grab_cache_page(NODE_MAPPING(sbi), xnid, false);
		if (!page)
			return -ENOMEM;

1798 1799 1800 1801 1802
		err = f2fs_get_node_info(sbi, xnid, &ni);
		if (err) {
			f2fs_put_page(page, 1);
			return err;
		}
Chao Yu's avatar
Chao Yu committed
1803

1804
		phys = blks_to_bytes(inode, ni.blk_addr);
Chao Yu's avatar
Chao Yu committed
1805 1806 1807 1808 1809 1810 1811
		len = inode->i_sb->s_blocksize;

		f2fs_put_page(page, 1);

		flags = FIEMAP_EXTENT_LAST;
	}

1812
	if (phys) {
Chao Yu's avatar
Chao Yu committed
1813
		err = fiemap_fill_next_extent(fieinfo, 0, phys, len, flags);
1814 1815
		trace_f2fs_fiemap(inode, 0, phys, len, flags, err);
	}
Chao Yu's avatar
Chao Yu committed
1816 1817 1818 1819

	return (err < 0 ? err : 0);
}

1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838
static loff_t max_inode_blocks(struct inode *inode)
{
	loff_t result = ADDRS_PER_INODE(inode);
	loff_t leaf_count = ADDRS_PER_BLOCK(inode);

	/* two direct node blocks */
	result += (leaf_count * 2);

	/* two indirect node blocks */
	leaf_count *= NIDS_PER_BLOCK;
	result += (leaf_count * 2);

	/* one double indirect node block */
	leaf_count *= NIDS_PER_BLOCK;
	result += leaf_count;

	return result;
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
1839 1840 1841
int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
		u64 start, u64 len)
{
1842
	struct f2fs_map_blocks map;
1843
	sector_t start_blk, last_blk;
1844
	pgoff_t next_pgofs;
1845 1846 1847
	u64 logical = 0, phys = 0, size = 0;
	u32 flags = 0;
	int ret = 0;
1848
	bool compr_cluster = false, compr_appended;
1849
	unsigned int cluster_size = F2FS_I(inode)->i_cluster_size;
1850
	unsigned int count_in_cluster = 0;
1851
	loff_t maxbytes;
1852

1853 1854 1855 1856 1857 1858
	if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) {
		ret = f2fs_precache_extents(inode);
		if (ret)
			return ret;
	}

1859
	ret = fiemap_prep(inode, fieinfo, start, &len, FIEMAP_FLAG_XATTR);
1860 1861 1862
	if (ret)
		return ret;

1863 1864
	inode_lock(inode);

1865 1866 1867 1868 1869 1870 1871 1872 1873
	maxbytes = max_file_blocks(inode) << F2FS_BLKSIZE_BITS;
	if (start > maxbytes) {
		ret = -EFBIG;
		goto out;
	}

	if (len > maxbytes || (maxbytes - len) < start)
		len = maxbytes - start;

Chao Yu's avatar
Chao Yu committed
1874 1875 1876 1877 1878
	if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
		ret = f2fs_xattr_fiemap(inode, fieinfo);
		goto out;
	}

1879
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
1880 1881
		ret = f2fs_inline_data_fiemap(inode, fieinfo, start, len);
		if (ret != -EAGAIN)
1882
			goto out;
1883 1884
	}

1885 1886
	if (bytes_to_blks(inode, len) == 0)
		len = blks_to_bytes(inode, 1);
1887

1888 1889
	start_blk = bytes_to_blks(inode, start);
	last_blk = bytes_to_blks(inode, start + len - 1);
1890

1891
next:
1892 1893 1894 1895 1896
	memset(&map, 0, sizeof(map));
	map.m_lblk = start_blk;
	map.m_len = bytes_to_blks(inode, len);
	map.m_next_pgofs = &next_pgofs;
	map.m_seg_type = NO_CHECK_TYPE;
1897

1898 1899 1900 1901
	if (compr_cluster) {
		map.m_lblk += 1;
		map.m_len = cluster_size - count_in_cluster;
	}
1902

1903
	ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
1904 1905 1906 1907
	if (ret)
		goto out;

	/* HOLE */
1908
	if (!compr_cluster && !(map.m_flags & F2FS_MAP_FLAGS)) {
1909
		start_blk = next_pgofs;
1910

1911
		if (blks_to_bytes(inode, start_blk) < blks_to_bytes(inode,
1912
						max_inode_blocks(inode)))
1913
			goto prep_next;
1914

1915 1916
		flags |= FIEMAP_EXTENT_LAST;
	}
1917

1918 1919 1920 1921 1922 1923 1924 1925
	compr_appended = false;
	/* In a case of compressed cluster, append this to the last extent */
	if (compr_cluster && ((map.m_flags & F2FS_MAP_UNWRITTEN) ||
			!(map.m_flags & F2FS_MAP_FLAGS))) {
		compr_appended = true;
		goto skip_fill;
	}

1926
	if (size) {
1927
		flags |= FIEMAP_EXTENT_MERGED;
1928
		if (IS_ENCRYPTED(inode))
1929 1930
			flags |= FIEMAP_EXTENT_DATA_ENCRYPTED;

1931 1932
		ret = fiemap_fill_next_extent(fieinfo, logical,
				phys, size, flags);
1933
		trace_f2fs_fiemap(inode, logical, phys, size, flags, ret);
1934 1935 1936
		if (ret)
			goto out;
		size = 0;
1937
	}
1938

1939
	if (start_blk > last_blk)
1940
		goto out;
1941

1942
skip_fill:
1943
	if (map.m_pblk == COMPRESS_ADDR) {
1944
		compr_cluster = true;
1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968
		count_in_cluster = 1;
	} else if (compr_appended) {
		unsigned int appended_blks = cluster_size -
						count_in_cluster + 1;
		size += blks_to_bytes(inode, appended_blks);
		start_blk += appended_blks;
		compr_cluster = false;
	} else {
		logical = blks_to_bytes(inode, start_blk);
		phys = __is_valid_data_blkaddr(map.m_pblk) ?
			blks_to_bytes(inode, map.m_pblk) : 0;
		size = blks_to_bytes(inode, map.m_len);
		flags = 0;

		if (compr_cluster) {
			flags = FIEMAP_EXTENT_ENCODED;
			count_in_cluster += map.m_len;
			if (count_in_cluster == cluster_size) {
				compr_cluster = false;
				size += blks_to_bytes(inode, 1);
			}
		} else if (map.m_flags & F2FS_MAP_UNWRITTEN) {
			flags = FIEMAP_EXTENT_UNWRITTEN;
		}
1969

1970 1971
		start_blk += bytes_to_blks(inode, size);
	}
1972

1973
prep_next:
1974 1975 1976 1977 1978 1979 1980 1981 1982
	cond_resched();
	if (fatal_signal_pending(current))
		ret = -EINTR;
	else
		goto next;
out:
	if (ret == 1)
		ret = 0;

Al Viro's avatar
Al Viro committed
1983
	inode_unlock(inode);
1984
	return ret;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
1985 1986
}

Eric Biggers's avatar
Eric Biggers committed
1987 1988 1989 1990 1991 1992 1993 1994 1995
static inline loff_t f2fs_readpage_limit(struct inode *inode)
{
	if (IS_ENABLED(CONFIG_FS_VERITY) &&
	    (IS_VERITY(inode) || f2fs_verity_in_progress(inode)))
		return inode->i_sb->s_maxbytes;

	return i_size_read(inode);
}

1996 1997 1998 1999 2000 2001 2002 2003
static int 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)
{
	struct bio *bio = *bio_ret;
2004
	const unsigned blocksize = blks_to_bytes(inode, 1);
2005 2006 2007 2008 2009 2010
	sector_t block_in_file;
	sector_t last_block;
	sector_t last_block_in_file;
	sector_t block_nr;
	int ret = 0;

Jaegeuk Kim's avatar
Jaegeuk Kim committed
2011
	block_in_file = (sector_t)page_index(page);
2012
	last_block = block_in_file + nr_pages;
2013 2014
	last_block_in_file = bytes_to_blks(inode,
			f2fs_readpage_limit(inode) + blocksize - 1);
2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043
	if (last_block > last_block_in_file)
		last_block = last_block_in_file;

	/* just zeroing out page which is beyond EOF */
	if (block_in_file >= last_block)
		goto zero_out;
	/*
	 * Map blocks using the previous result first.
	 */
	if ((map->m_flags & F2FS_MAP_MAPPED) &&
			block_in_file > map->m_lblk &&
			block_in_file < (map->m_lblk + map->m_len))
		goto got_it;

	/*
	 * Then do more f2fs_map_blocks() calls until we are
	 * done with this page.
	 */
	map->m_lblk = block_in_file;
	map->m_len = last_block - block_in_file;

	ret = f2fs_map_blocks(inode, map, 0, F2FS_GET_BLOCK_DEFAULT);
	if (ret)
		goto out;
got_it:
	if ((map->m_flags & F2FS_MAP_MAPPED)) {
		block_nr = map->m_pblk + block_in_file - map->m_lblk;
		SetPageMappedToDisk(page);

Jaegeuk Kim's avatar
Jaegeuk Kim committed
2044 2045
		if (!PageUptodate(page) && (!PageSwapCache(page) &&
					!cleancache_get_page(page))) {
2046 2047 2048 2049 2050
			SetPageUptodate(page);
			goto confused;
		}

		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr,
2051
						DATA_GENERIC_ENHANCE_READ)) {
2052
			ret = -EFSCORRUPTED;
2053 2054 2055 2056 2057
			goto out;
		}
	} else {
zero_out:
		zero_user_segment(page, 0, PAGE_SIZE);
Eric Biggers's avatar
Eric Biggers committed
2058 2059 2060 2061 2062
		if (f2fs_need_verity(inode, page->index) &&
		    !fsverity_verify_page(page)) {
			ret = -EIO;
			goto out;
		}
2063 2064 2065 2066 2067 2068 2069 2070 2071 2072
		if (!PageUptodate(page))
			SetPageUptodate(page);
		unlock_page(page);
		goto out;
	}

	/*
	 * This page will go to BIO.  Do we need to send this
	 * BIO off first?
	 */
2073 2074 2075
	if (bio && (!page_is_mergeable(F2FS_I_SB(inode), bio,
				       *last_block_in_bio, block_nr) ||
		    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
2076 2077 2078 2079 2080 2081
submit_and_realloc:
		__submit_bio(F2FS_I_SB(inode), bio, DATA);
		bio = NULL;
	}
	if (bio == NULL) {
		bio = f2fs_grab_read_bio(inode, block_nr, nr_pages,
2082
				is_readahead ? REQ_RAHEAD : 0, page->index,
2083
				false);
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100
		if (IS_ERR(bio)) {
			ret = PTR_ERR(bio);
			bio = NULL;
			goto out;
		}
	}

	/*
	 * If the page is under writeback, we need to wait for
	 * its completion to see the correct decrypted data.
	 */
	f2fs_wait_on_block_writeback(inode, block_nr);

	if (bio_add_page(bio, page, blocksize, 0) < blocksize)
		goto submit_and_realloc;

	inc_page_count(F2FS_I_SB(inode), F2FS_RD_DATA);
Chao Yu's avatar
Chao Yu committed
2101
	f2fs_update_iostat(F2FS_I_SB(inode), FS_DATA_READ_IO, F2FS_BLKSIZE);
2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115
	ClearPageError(page);
	*last_block_in_bio = block_nr;
	goto out;
confused:
	if (bio) {
		__submit_bio(F2FS_I_SB(inode), bio, DATA);
		bio = NULL;
	}
	unlock_page(page);
out:
	*bio_ret = bio;
	return ret;
}

Chao Yu's avatar
Chao Yu committed
2116 2117 2118
#ifdef CONFIG_F2FS_FS_COMPRESSION
int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret,
				unsigned nr_pages, sector_t *last_block_in_bio,
2119
				bool is_readahead, bool for_write)
Chao Yu's avatar
Chao Yu committed
2120 2121 2122 2123 2124 2125 2126
{
	struct dnode_of_data dn;
	struct inode *inode = cc->inode;
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct bio *bio = *bio_ret;
	unsigned int start_idx = cc->cluster_idx << cc->log_cluster_size;
	sector_t last_block_in_file;
2127
	const unsigned blocksize = blks_to_bytes(inode, 1);
Chao Yu's avatar
Chao Yu committed
2128
	struct decompress_io_ctx *dic = NULL;
2129 2130
	struct extent_info ei = {0, };
	bool from_dnode = true;
Chao Yu's avatar
Chao Yu committed
2131 2132 2133 2134 2135
	int i;
	int ret = 0;

	f2fs_bug_on(sbi, f2fs_cluster_is_empty(cc));

2136 2137
	last_block_in_file = bytes_to_blks(inode,
			f2fs_readpage_limit(inode) + blocksize - 1);
Chao Yu's avatar
Chao Yu committed
2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160

	/* get rid of pages beyond EOF */
	for (i = 0; i < cc->cluster_size; i++) {
		struct page *page = cc->rpages[i];

		if (!page)
			continue;
		if ((sector_t)page->index >= last_block_in_file) {
			zero_user_segment(page, 0, PAGE_SIZE);
			if (!PageUptodate(page))
				SetPageUptodate(page);
		} else if (!PageUptodate(page)) {
			continue;
		}
		unlock_page(page);
		cc->rpages[i] = NULL;
		cc->nr_rpages--;
	}

	/* we are done since all pages are beyond EOF */
	if (f2fs_cluster_is_empty(cc))
		goto out;

2161 2162 2163 2164 2165 2166
	if (f2fs_lookup_extent_cache(inode, start_idx, &ei))
		from_dnode = false;

	if (!from_dnode)
		goto skip_reading_dnode;

Chao Yu's avatar
Chao Yu committed
2167 2168 2169 2170 2171
	set_new_dnode(&dn, inode, NULL, NULL, 0);
	ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE);
	if (ret)
		goto out;

2172
	f2fs_bug_on(sbi, dn.data_blkaddr != COMPRESS_ADDR);
Chao Yu's avatar
Chao Yu committed
2173

2174
skip_reading_dnode:
Chao Yu's avatar
Chao Yu committed
2175 2176 2177
	for (i = 1; i < cc->cluster_size; i++) {
		block_t blkaddr;

2178 2179 2180
		blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page,
					dn.ofs_in_node + i) :
					ei.blk + i - 1;
Chao Yu's avatar
Chao Yu committed
2181 2182 2183 2184 2185 2186 2187 2188 2189

		if (!__is_valid_data_blkaddr(blkaddr))
			break;

		if (!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) {
			ret = -EFAULT;
			goto out_put_dnode;
		}
		cc->nr_cpages++;
2190 2191 2192

		if (!from_dnode && i >= ei.c_len)
			break;
Chao Yu's avatar
Chao Yu committed
2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206
	}

	/* nothing to decompress */
	if (cc->nr_cpages == 0) {
		ret = 0;
		goto out_put_dnode;
	}

	dic = f2fs_alloc_dic(cc);
	if (IS_ERR(dic)) {
		ret = PTR_ERR(dic);
		goto out_put_dnode;
	}

2207
	for (i = 0; i < cc->nr_cpages; i++) {
Chao Yu's avatar
Chao Yu committed
2208 2209
		struct page *page = dic->cpages[i];
		block_t blkaddr;
2210
		struct bio_post_read_ctx *ctx;
Chao Yu's avatar
Chao Yu committed
2211

2212 2213 2214
		blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page,
					dn.ofs_in_node + i + 1) :
					ei.blk + i;
Chao Yu's avatar
Chao Yu committed
2215

2216 2217 2218 2219 2220 2221 2222 2223
		f2fs_wait_on_block_writeback(inode, blkaddr);

		if (f2fs_load_compressed_page(sbi, page, blkaddr)) {
			if (atomic_dec_and_test(&dic->remaining_pages))
				f2fs_decompress_cluster(dic);
			continue;
		}

2224 2225 2226
		if (bio && (!page_is_mergeable(sbi, bio,
					*last_block_in_bio, blkaddr) ||
		    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
Chao Yu's avatar
Chao Yu committed
2227 2228 2229 2230 2231 2232 2233 2234
submit_and_realloc:
			__submit_bio(sbi, bio, DATA);
			bio = NULL;
		}

		if (!bio) {
			bio = f2fs_grab_read_bio(inode, blkaddr, nr_pages,
					is_readahead ? REQ_RAHEAD : 0,
2235
					page->index, for_write);
Chao Yu's avatar
Chao Yu committed
2236 2237
			if (IS_ERR(bio)) {
				ret = PTR_ERR(bio);
2238
				f2fs_decompress_end_io(dic, ret);
Chao Yu's avatar
Chao Yu committed
2239
				f2fs_put_dnode(&dn);
2240
				*bio_ret = NULL;
Chao Yu's avatar
Chao Yu committed
2241 2242 2243 2244 2245 2246 2247
				return ret;
			}
		}

		if (bio_add_page(bio, page, blocksize, 0) < blocksize)
			goto submit_and_realloc;

2248
		ctx = bio->bi_private;
2249 2250
		ctx->enabled_steps |= STEP_DECOMPRESS;
		refcount_inc(&dic->refcnt);
2251

Chao Yu's avatar
Chao Yu committed
2252
		inc_page_count(sbi, F2FS_RD_DATA);
Chao Yu's avatar
Chao Yu committed
2253
		f2fs_update_iostat(sbi, FS_DATA_READ_IO, F2FS_BLKSIZE);
2254
		f2fs_update_iostat(sbi, FS_CDATA_READ_IO, F2FS_BLKSIZE);
Chao Yu's avatar
Chao Yu committed
2255 2256 2257 2258
		ClearPageError(page);
		*last_block_in_bio = blkaddr;
	}

2259 2260
	if (from_dnode)
		f2fs_put_dnode(&dn);
Chao Yu's avatar
Chao Yu committed
2261 2262 2263 2264 2265

	*bio_ret = bio;
	return 0;

out_put_dnode:
2266 2267
	if (from_dnode)
		f2fs_put_dnode(&dn);
Chao Yu's avatar
Chao Yu committed
2268
out:
2269 2270 2271 2272 2273 2274 2275
	for (i = 0; i < cc->cluster_size; i++) {
		if (cc->rpages[i]) {
			ClearPageUptodate(cc->rpages[i]);
			ClearPageError(cc->rpages[i]);
			unlock_page(cc->rpages[i]);
		}
	}
Chao Yu's avatar
Chao Yu committed
2276 2277 2278 2279 2280
	*bio_ret = bio;
	return ret;
}
#endif

2281 2282 2283 2284
/*
 * This function was originally taken from fs/mpage.c, and customized for f2fs.
 * Major change was from block_size == page_size in f2fs by default.
 */
2285
static int f2fs_mpage_readpages(struct inode *inode,
2286
		struct readahead_control *rac, struct page *page)
2287 2288 2289 2290
{
	struct bio *bio = NULL;
	sector_t last_block_in_bio = 0;
	struct f2fs_map_blocks map;
Chao Yu's avatar
Chao Yu committed
2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302
#ifdef CONFIG_F2FS_FS_COMPRESSION
	struct compress_ctx cc = {
		.inode = inode,
		.log_cluster_size = F2FS_I(inode)->i_log_cluster_size,
		.cluster_size = F2FS_I(inode)->i_cluster_size,
		.cluster_idx = NULL_CLUSTER,
		.rpages = NULL,
		.cpages = NULL,
		.nr_rpages = 0,
		.nr_cpages = 0,
	};
#endif
2303
	unsigned nr_pages = rac ? readahead_count(rac) : 1;
Chao Yu's avatar
Chao Yu committed
2304
	unsigned max_nr_pages = nr_pages;
2305
	int ret = 0;
2306 2307 2308 2309 2310

	map.m_pblk = 0;
	map.m_lblk = 0;
	map.m_len = 0;
	map.m_flags = 0;
2311
	map.m_next_pgofs = NULL;
2312
	map.m_next_extent = NULL;
2313
	map.m_seg_type = NO_CHECK_TYPE;
2314
	map.m_may_create = false;
2315

LiFan's avatar
LiFan committed
2316
	for (; nr_pages; nr_pages--) {
2317 2318
		if (rac) {
			page = readahead_page(rac);
2319
			prefetchw(&page->flags);
2320 2321
		}

Chao Yu's avatar
Chao Yu committed
2322 2323 2324 2325 2326 2327 2328
#ifdef CONFIG_F2FS_FS_COMPRESSION
		if (f2fs_compressed_file(inode)) {
			/* there are remained comressed pages, submit them */
			if (!f2fs_cluster_can_merge_page(&cc, page->index)) {
				ret = f2fs_read_multi_pages(&cc, &bio,
							max_nr_pages,
							&last_block_in_bio,
2329
							rac != NULL, false);
2330
				f2fs_destroy_compress_ctx(&cc, false);
Chao Yu's avatar
Chao Yu committed
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351
				if (ret)
					goto set_error_page;
			}
			ret = f2fs_is_compressed_cluster(inode, page->index);
			if (ret < 0)
				goto set_error_page;
			else if (!ret)
				goto read_single_page;

			ret = f2fs_init_compress_ctx(&cc);
			if (ret)
				goto set_error_page;

			f2fs_compress_ctx_add_page(&cc, page);

			goto next_page;
		}
read_single_page:
#endif

		ret = f2fs_read_single_page(inode, page, max_nr_pages, &map,
2352
					&bio, &last_block_in_bio, rac);
2353
		if (ret) {
Chao Yu's avatar
Chao Yu committed
2354 2355 2356
#ifdef CONFIG_F2FS_FS_COMPRESSION
set_error_page:
#endif
2357
			SetPageError(page);
2358
			zero_user_segment(page, 0, PAGE_SIZE);
2359 2360
			unlock_page(page);
		}
2361
#ifdef CONFIG_F2FS_FS_COMPRESSION
2362
next_page:
2363 2364
#endif
		if (rac)
2365
			put_page(page);
Chao Yu's avatar
Chao Yu committed
2366 2367 2368 2369 2370 2371 2372 2373

#ifdef CONFIG_F2FS_FS_COMPRESSION
		if (f2fs_compressed_file(inode)) {
			/* last page */
			if (nr_pages == 1 && !f2fs_cluster_is_empty(&cc)) {
				ret = f2fs_read_multi_pages(&cc, &bio,
							max_nr_pages,
							&last_block_in_bio,
2374
							rac != NULL, false);
2375
				f2fs_destroy_compress_ctx(&cc, false);
Chao Yu's avatar
Chao Yu committed
2376 2377 2378
			}
		}
#endif
2379 2380
	}
	if (bio)
2381
		__submit_bio(F2FS_I_SB(inode), bio, DATA);
2382
	return ret;
2383 2384
}

2385 2386
static int f2fs_read_data_page(struct file *file, struct page *page)
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2387
	struct inode *inode = page_file_mapping(page)->host;
2388
	int ret = -EAGAIN;
2389

2390 2391
	trace_f2fs_readpage(page, DATA);

Chao Yu's avatar
Chao Yu committed
2392 2393 2394 2395 2396
	if (!f2fs_is_compress_backend_ready(inode)) {
		unlock_page(page);
		return -EOPNOTSUPP;
	}

arter97's avatar
arter97 committed
2397
	/* If the file has inline data, try to read it directly */
2398 2399
	if (f2fs_has_inline_data(inode))
		ret = f2fs_read_inline_data(inode, page);
2400
	if (ret == -EAGAIN)
2401
		ret = f2fs_mpage_readpages(inode, NULL, page);
2402
	return ret;
2403 2404
}

2405
static void f2fs_readahead(struct readahead_control *rac)
2406
{
2407
	struct inode *inode = rac->mapping->host;
2408

2409
	trace_f2fs_readpages(inode, readahead_index(rac), readahead_count(rac));
2410

Chao Yu's avatar
Chao Yu committed
2411
	if (!f2fs_is_compress_backend_ready(inode))
2412
		return;
Chao Yu's avatar
Chao Yu committed
2413

2414 2415
	/* If the file has inline data, skip readpages */
	if (f2fs_has_inline_data(inode))
2416
		return;
2417

2418
	f2fs_mpage_readpages(inode, rac, NULL);
2419 2420
}

Chao Yu's avatar
Chao Yu committed
2421
int f2fs_encrypt_one_page(struct f2fs_io_info *fio)
2422 2423
{
	struct inode *inode = fio->page->mapping->host;
Chao Yu's avatar
Chao Yu committed
2424
	struct page *mpage, *page;
2425 2426
	gfp_t gfp_flags = GFP_NOFS;

2427
	if (!f2fs_encrypted_file(inode))
2428 2429
		return 0;

Chao Yu's avatar
Chao Yu committed
2430 2431
	page = fio->compressed_page ? fio->compressed_page : fio->page;

2432
	/* wait for GCed page writeback via META_MAPPING */
2433
	f2fs_wait_on_block_writeback(inode, fio->old_blkaddr);
2434

2435 2436 2437
	if (fscrypt_inode_uses_inline_crypto(inode))
		return 0;

2438
retry_encrypt:
Chao Yu's avatar
Chao Yu committed
2439 2440
	fio->encrypted_page = fscrypt_encrypt_pagecache_blocks(page,
					PAGE_SIZE, 0, gfp_flags);
2441 2442 2443 2444
	if (IS_ERR(fio->encrypted_page)) {
		/* flush pending IOs and wait for a while in the ENOMEM case */
		if (PTR_ERR(fio->encrypted_page) == -ENOMEM) {
			f2fs_flush_merged_writes(fio->sbi);
Chao Yu's avatar
Chao Yu committed
2445
			congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT);
2446 2447 2448 2449 2450
			gfp_flags |= __GFP_NOFAIL;
			goto retry_encrypt;
		}
		return PTR_ERR(fio->encrypted_page);
	}
2451

2452 2453 2454 2455 2456 2457
	mpage = find_lock_page(META_MAPPING(fio->sbi), fio->old_blkaddr);
	if (mpage) {
		if (PageUptodate(mpage))
			memcpy(page_address(mpage),
				page_address(fio->encrypted_page), PAGE_SIZE);
		f2fs_put_page(mpage, 1);
2458
	}
2459
	return 0;
2460 2461
}

Chao Yu's avatar
Chao Yu committed
2462 2463
static inline bool check_inplace_update_policy(struct inode *inode,
				struct f2fs_io_info *fio)
2464
{
Chao Yu's avatar
Chao Yu committed
2465 2466
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	unsigned int policy = SM_I(sbi)->ipu_policy;
2467

Chao Yu's avatar
Chao Yu committed
2468 2469
	if (policy & (0x1 << F2FS_IPU_FORCE))
		return true;
Chao Yu's avatar
Chao Yu committed
2470
	if (policy & (0x1 << F2FS_IPU_SSR) && f2fs_need_SSR(sbi))
Chao Yu's avatar
Chao Yu committed
2471 2472 2473 2474
		return true;
	if (policy & (0x1 << F2FS_IPU_UTIL) &&
			utilization(sbi) > SM_I(sbi)->min_ipu_util)
		return true;
Chao Yu's avatar
Chao Yu committed
2475
	if (policy & (0x1 << F2FS_IPU_SSR_UTIL) && f2fs_need_SSR(sbi) &&
Chao Yu's avatar
Chao Yu committed
2476 2477 2478 2479 2480 2481 2482 2483 2484
			utilization(sbi) > SM_I(sbi)->min_ipu_util)
		return true;

	/*
	 * IPU for rewrite async pages
	 */
	if (policy & (0x1 << F2FS_IPU_ASYNC) &&
			fio && fio->op == REQ_OP_WRITE &&
			!(fio->op_flags & REQ_SYNC) &&
2485
			!IS_ENCRYPTED(inode))
Chao Yu's avatar
Chao Yu committed
2486 2487 2488 2489 2490 2491 2492
		return true;

	/* this is only set during fdatasync */
	if (policy & (0x1 << F2FS_IPU_FSYNC) &&
			is_inode_flag_set(inode, FI_NEED_IPU))
		return true;

Daniel Rosenberg's avatar
Daniel Rosenberg committed
2493 2494 2495 2496
	if (unlikely(fio && is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
			!f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
		return true;

Chao Yu's avatar
Chao Yu committed
2497 2498 2499
	return false;
}

Chao Yu's avatar
Chao Yu committed
2500
bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
Chao Yu's avatar
Chao Yu committed
2501
{
2502 2503 2504 2505
	/* swap file is migrating in aligned write mode */
	if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
		return false;

2506 2507
	if (f2fs_is_pinned_file(inode))
		return true;
Chao Yu's avatar
Chao Yu committed
2508 2509 2510 2511 2512 2513 2514 2515

	/* if this is cold file, we should overwrite to avoid fragmentation */
	if (file_is_cold(inode))
		return true;

	return check_inplace_update_policy(inode, fio);
}

Chao Yu's avatar
Chao Yu committed
2516
bool f2fs_should_update_outplace(struct inode *inode, struct f2fs_io_info *fio)
Chao Yu's avatar
Chao Yu committed
2517 2518 2519
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

2520
	if (f2fs_lfs_mode(sbi))
Chao Yu's avatar
Chao Yu committed
2521 2522 2523
		return true;
	if (S_ISDIR(inode->i_mode))
		return true;
2524 2525
	if (IS_NOQUOTA(inode))
		return true;
Chao Yu's avatar
Chao Yu committed
2526 2527
	if (f2fs_is_atomic_file(inode))
		return true;
2528 2529
	if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
		return true;
2530 2531 2532 2533 2534

	/* swap file is migrating in aligned write mode */
	if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
		return true;

Chao Yu's avatar
Chao Yu committed
2535
	if (fio) {
2536
		if (page_private_gcing(fio->page))
Chao Yu's avatar
Chao Yu committed
2537
			return true;
2538
		if (page_private_dummy(fio->page))
Chao Yu's avatar
Chao Yu committed
2539
			return true;
Daniel Rosenberg's avatar
Daniel Rosenberg committed
2540 2541 2542
		if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
			f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
			return true;
Chao Yu's avatar
Chao Yu committed
2543 2544 2545 2546
	}
	return false;
}

2547 2548 2549 2550
static inline bool need_inplace_update(struct f2fs_io_info *fio)
{
	struct inode *inode = fio->page->mapping->host;

Chao Yu's avatar
Chao Yu committed
2551
	if (f2fs_should_update_outplace(inode, fio))
2552 2553
		return false;

Chao Yu's avatar
Chao Yu committed
2554
	return f2fs_should_update_inplace(inode, fio);
2555 2556
}

Chao Yu's avatar
Chao Yu committed
2557
int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2558
{
2559
	struct page *page = fio->page;
2560 2561
	struct inode *inode = page->mapping->host;
	struct dnode_of_data dn;
2562
	struct extent_info ei = {0, };
2563
	struct node_info ni;
2564
	bool ipu_force = false;
2565 2566 2567
	int err = 0;

	set_new_dnode(&dn, inode, NULL, NULL, 0);
2568 2569 2570
	if (need_inplace_update(fio) &&
			f2fs_lookup_extent_cache(inode, page->index, &ei)) {
		fio->old_blkaddr = ei.blk + page->index - ei.fofs;
2571

2572
		if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
2573
						DATA_GENERIC_ENHANCE))
2574
			return -EFSCORRUPTED;
2575 2576 2577 2578

		ipu_force = true;
		fio->need_lock = LOCK_DONE;
		goto got_it;
2579
	}
2580

2581 2582 2583
	/* Deadlock due to between page->lock and f2fs_lock_op */
	if (fio->need_lock == LOCK_REQ && !f2fs_trylock_op(fio->sbi))
		return -EAGAIN;
2584

Chao Yu's avatar
Chao Yu committed
2585
	err = f2fs_get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
2586
	if (err)
2587
		goto out;
2588

2589
	fio->old_blkaddr = dn.data_blkaddr;
2590 2591

	/* This page is already truncated */
2592
	if (fio->old_blkaddr == NULL_ADDR) {
2593
		ClearPageUptodate(page);
2594
		clear_page_private_gcing(page);
2595
		goto out_writepage;
2596
	}
2597
got_it:
2598 2599
	if (__is_valid_data_blkaddr(fio->old_blkaddr) &&
		!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
2600
						DATA_GENERIC_ENHANCE)) {
2601
		err = -EFSCORRUPTED;
2602 2603
		goto out_writepage;
	}
2604 2605 2606 2607
	/*
	 * If current allocation needs SSR,
	 * it had better in-place writes for updated data.
	 */
2608 2609
	if (ipu_force ||
		(__is_valid_data_blkaddr(fio->old_blkaddr) &&
2610
					need_inplace_update(fio))) {
Chao Yu's avatar
Chao Yu committed
2611
		err = f2fs_encrypt_one_page(fio);
2612 2613 2614 2615
		if (err)
			goto out_writepage;

		set_page_writeback(page);
2616
		ClearPageError(page);
2617
		f2fs_put_dnode(&dn);
2618
		if (fio->need_lock == LOCK_REQ)
2619
			f2fs_unlock_op(fio->sbi);
Chao Yu's avatar
Chao Yu committed
2620
		err = f2fs_inplace_write_data(fio);
2621
		if (err) {
2622
			if (fscrypt_inode_uses_fs_layer_crypto(inode))
2623
				fscrypt_finalize_bounce_page(&fio->encrypted_page);
2624 2625
			if (PageWriteback(page))
				end_page_writeback(page);
2626 2627
		} else {
			set_inode_flag(inode, FI_UPDATE_WRITE);
2628
		}
2629
		trace_f2fs_do_write_data_page(fio->page, IPU);
2630
		return err;
2631
	}
2632

2633 2634 2635 2636 2637 2638 2639 2640
	if (fio->need_lock == LOCK_RETRY) {
		if (!f2fs_trylock_op(fio->sbi)) {
			err = -EAGAIN;
			goto out_writepage;
		}
		fio->need_lock = LOCK_REQ;
	}

2641 2642 2643 2644 2645 2646
	err = f2fs_get_node_info(fio->sbi, dn.nid, &ni);
	if (err)
		goto out_writepage;

	fio->version = ni.version;

Chao Yu's avatar
Chao Yu committed
2647
	err = f2fs_encrypt_one_page(fio);
2648 2649 2650 2651
	if (err)
		goto out_writepage;

	set_page_writeback(page);
2652
	ClearPageError(page);
2653

Chao Yu's avatar
Chao Yu committed
2654 2655 2656
	if (fio->compr_blocks && fio->old_blkaddr == COMPRESS_ADDR)
		f2fs_i_compr_blocks_update(inode, fio->compr_blocks - 1, false);

2657
	/* LFS mode write path */
Chao Yu's avatar
Chao Yu committed
2658
	f2fs_outplace_write_data(&dn, fio);
2659 2660 2661 2662
	trace_f2fs_do_write_data_page(page, OPU);
	set_inode_flag(inode, FI_APPEND_WRITE);
	if (page->index == 0)
		set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
2663 2664
out_writepage:
	f2fs_put_dnode(&dn);
2665
out:
2666
	if (fio->need_lock == LOCK_REQ)
2667
		f2fs_unlock_op(fio->sbi);
2668 2669 2670
	return err;
}

Chao Yu's avatar
Chao Yu committed
2671
int f2fs_write_single_data_page(struct page *page, int *submitted,
Chao Yu's avatar
Chao Yu committed
2672 2673
				struct bio **bio,
				sector_t *last_block,
Chao Yu's avatar
Chao Yu committed
2674
				struct writeback_control *wbc,
Chao Yu's avatar
Chao Yu committed
2675
				enum iostat_type io_type,
2676 2677
				int compr_blocks,
				bool allow_balance)
2678 2679
{
	struct inode *inode = page->mapping->host;
2680
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2681
	loff_t i_size = i_size_read(inode);
Chao Yu's avatar
Chao Yu committed
2682
	const pgoff_t end_index = ((unsigned long long)i_size)
2683
							>> PAGE_SHIFT;
Chao Yu's avatar
Chao Yu committed
2684
	loff_t psize = (loff_t)(page->index + 1) << PAGE_SHIFT;
2685
	unsigned offset = 0;
2686
	bool need_balance_fs = false;
2687
	int err = 0;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2688
	struct f2fs_io_info fio = {
2689
		.sbi = sbi,
Chao Yu's avatar
Chao Yu committed
2690
		.ino = inode->i_ino,
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2691
		.type = DATA,
Mike Christie's avatar
Mike Christie committed
2692
		.op = REQ_OP_WRITE,
2693
		.op_flags = wbc_to_write_flags(wbc),
2694
		.old_blkaddr = NULL_ADDR,
2695
		.page = page,
2696
		.encrypted_page = NULL,
2697
		.submitted = false,
Chao Yu's avatar
Chao Yu committed
2698
		.compr_blocks = compr_blocks,
2699
		.need_lock = LOCK_RETRY,
Chao Yu's avatar
Chao Yu committed
2700
		.io_type = io_type,
2701
		.io_wbc = wbc,
Chao Yu's avatar
Chao Yu committed
2702 2703
		.bio = bio,
		.last_block = last_block,
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2704
	};
2705

2706 2707
	trace_f2fs_writepage(page, DATA);

2708 2709 2710
	/* we should bypass data pages to proceed the kworkder jobs */
	if (unlikely(f2fs_cp_error(sbi))) {
		mapping_set_error(page->mapping, -EIO);
2711 2712 2713 2714 2715 2716
		/*
		 * don't drop any dirty dentry pages for keeping lastest
		 * directory structure.
		 */
		if (S_ISDIR(inode->i_mode))
			goto redirty_out;
2717 2718 2719
		goto out;
	}

2720 2721 2722
	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
		goto redirty_out;

Chao Yu's avatar
Chao Yu committed
2723 2724 2725
	if (page->index < end_index ||
			f2fs_verity_in_progress(inode) ||
			compr_blocks)
2726
		goto write;
2727 2728 2729 2730 2731

	/*
	 * If the offset is out-of-range of file size,
	 * this page does not have to be written to disk.
	 */
2732
	offset = i_size & (PAGE_SIZE - 1);
2733
	if ((page->index >= end_index + 1) || !offset)
2734
		goto out;
2735

2736
	zero_user_segment(page, offset, PAGE_SIZE);
2737
write:
2738 2739
	if (f2fs_is_drop_cache(inode))
		goto out;
2740 2741 2742
	/* we should not write 0'th page having journal header */
	if (f2fs_is_volatile_file(inode) && (!page->index ||
			(!wbc->for_reclaim &&
Chao Yu's avatar
Chao Yu committed
2743
			f2fs_available_free_memory(sbi, BASE_CHECK))))
2744
		goto redirty_out;
2745

2746 2747
	/* Dentry/quota blocks are controlled by checkpoint */
	if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
2748 2749 2750 2751 2752 2753 2754 2755
		/*
		 * We need to wait for node_write to avoid block allocation during
		 * checkpoint. This can only happen to quota writes which can cause
		 * the below discard race condition.
		 */
		if (IS_NOQUOTA(inode))
			down_read(&sbi->node_write);

2756
		fio.need_lock = LOCK_DONE;
Chao Yu's avatar
Chao Yu committed
2757
		err = f2fs_do_write_data_page(&fio);
2758 2759 2760 2761

		if (IS_NOQUOTA(inode))
			up_read(&sbi->node_write);

2762 2763
		goto done;
	}
2764

2765
	if (!wbc->for_reclaim)
2766
		need_balance_fs = true;
2767
	else if (has_not_enough_free_secs(sbi, 0, 0))
2768
		goto redirty_out;
2769 2770
	else
		set_inode_flag(inode, FI_HOT_DATA);
2771

2772
	err = -EAGAIN;
2773
	if (f2fs_has_inline_data(inode)) {
2774
		err = f2fs_write_inline_data(inode, page);
2775 2776 2777
		if (!err)
			goto out;
	}
2778

2779
	if (err == -EAGAIN) {
Chao Yu's avatar
Chao Yu committed
2780
		err = f2fs_do_write_data_page(&fio);
2781 2782
		if (err == -EAGAIN) {
			fio.need_lock = LOCK_REQ;
Chao Yu's avatar
Chao Yu committed
2783
			err = f2fs_do_write_data_page(&fio);
2784 2785
		}
	}
2786

2787 2788 2789
	if (err) {
		file_set_keep_isize(inode);
	} else {
2790
		spin_lock(&F2FS_I(inode)->i_size_lock);
2791 2792
		if (F2FS_I(inode)->last_disk_size < psize)
			F2FS_I(inode)->last_disk_size = psize;
2793
		spin_unlock(&F2FS_I(inode)->i_size_lock);
2794
	}
2795

2796 2797 2798
done:
	if (err && err != -ENOENT)
		goto redirty_out;
2799

2800
out:
2801
	inode_dec_dirty_pages(inode);
2802
	if (err) {
2803
		ClearPageUptodate(page);
2804
		clear_page_private_gcing(page);
2805
	}
2806 2807

	if (wbc->for_reclaim) {
2808
		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, DATA);
2809
		clear_inode_flag(inode, FI_HOT_DATA);
Chao Yu's avatar
Chao Yu committed
2810
		f2fs_remove_dirty_inode(inode);
2811
		submitted = NULL;
2812
	}
2813
	unlock_page(page);
2814
	if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) &&
2815
			!F2FS_I(inode)->cp_task && allow_balance)
Jaegeuk Kim's avatar
Jaegeuk Kim committed
2816
		f2fs_balance_fs(sbi, need_balance_fs);
2817

2818
	if (unlikely(f2fs_cp_error(sbi))) {
2819
		f2fs_submit_merged_write(sbi, DATA);
Chao Yu's avatar
Chao Yu committed
2820
		f2fs_submit_merged_ipu_write(sbi, bio, NULL);
2821 2822 2823 2824
		submitted = NULL;
	}

	if (submitted)
Chao Yu's avatar
Chao Yu committed
2825
		*submitted = fio.submitted ? 1 : 0;
2826

2827 2828 2829
	return 0;

redirty_out:
2830
	redirty_page_for_writepage(wbc, page);
2831 2832 2833 2834 2835 2836 2837
	/*
	 * pageout() in MM traslates EAGAIN, so calls handle_write_error()
	 * -> mapping_set_error() -> set_bit(AS_EIO, ...).
	 * file_write_and_wait_range() will see EIO error, which is critical
	 * to return value of fsync() followed by atomic_write failure to user.
	 */
	if (!err || wbc->for_reclaim)
2838
		return AOP_WRITEPAGE_ACTIVATE;
2839 2840
	unlock_page(page);
	return err;
2841 2842
}

2843 2844 2845
static int f2fs_write_data_page(struct page *page,
					struct writeback_control *wbc)
{
Chao Yu's avatar
Chao Yu committed
2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861
#ifdef CONFIG_F2FS_FS_COMPRESSION
	struct inode *inode = page->mapping->host;

	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		goto out;

	if (f2fs_compressed_file(inode)) {
		if (f2fs_is_compressed_cluster(inode, page->index)) {
			redirty_page_for_writepage(wbc, page);
			return AOP_WRITEPAGE_ACTIVATE;
		}
	}
out:
#endif

	return f2fs_write_single_data_page(page, NULL, NULL, NULL,
2862
						wbc, FS_DATA_IO, 0, true);
2863 2864
}

Chao Yu's avatar
Chao Yu committed
2865 2866 2867 2868 2869 2870
/*
 * This function was copied from write_cche_pages from mm/page-writeback.c.
 * The major change is making write step of cold data page separately from
 * warm/hot data page.
 */
static int f2fs_write_cache_pages(struct address_space *mapping,
Chao Yu's avatar
Chao Yu committed
2871 2872
					struct writeback_control *wbc,
					enum iostat_type io_type)
Chao Yu's avatar
Chao Yu committed
2873 2874
{
	int ret = 0;
Chao Yu's avatar
Chao Yu committed
2875
	int done = 0, retry = 0;
Chao Yu's avatar
Chao Yu committed
2876
	struct pagevec pvec;
2877
	struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
Chao Yu's avatar
Chao Yu committed
2878 2879
	struct bio *bio = NULL;
	sector_t last_block;
Chao Yu's avatar
Chao Yu committed
2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895
#ifdef CONFIG_F2FS_FS_COMPRESSION
	struct inode *inode = mapping->host;
	struct compress_ctx cc = {
		.inode = inode,
		.log_cluster_size = F2FS_I(inode)->i_log_cluster_size,
		.cluster_size = F2FS_I(inode)->i_cluster_size,
		.cluster_idx = NULL_CLUSTER,
		.rpages = NULL,
		.nr_rpages = 0,
		.cpages = NULL,
		.rbuf = NULL,
		.cbuf = NULL,
		.rlen = PAGE_SIZE * F2FS_I(inode)->i_cluster_size,
		.private = NULL,
	};
#endif
Chao Yu's avatar
Chao Yu committed
2896 2897 2898 2899 2900
	int nr_pages;
	pgoff_t index;
	pgoff_t end;		/* Inclusive */
	pgoff_t done_index;
	int range_whole = 0;
Matthew Wilcox's avatar
Matthew Wilcox committed
2901
	xa_mark_t tag;
2902
	int nwritten = 0;
Chao Yu's avatar
Chao Yu committed
2903 2904
	int submitted = 0;
	int i;
Chao Yu's avatar
Chao Yu committed
2905

2906
	pagevec_init(&pvec);
2907

2908 2909 2910 2911 2912 2913
	if (get_dirty_pages(mapping->host) <=
				SM_I(F2FS_M_SB(mapping))->min_hot_blocks)
		set_inode_flag(mapping->host, FI_HOT_DATA);
	else
		clear_inode_flag(mapping->host, FI_HOT_DATA);

Chao Yu's avatar
Chao Yu committed
2914
	if (wbc->range_cyclic) {
2915
		index = mapping->writeback_index; /* prev offset */
Chao Yu's avatar
Chao Yu committed
2916 2917
		end = -1;
	} else {
2918 2919
		index = wbc->range_start >> PAGE_SHIFT;
		end = wbc->range_end >> PAGE_SHIFT;
Chao Yu's avatar
Chao Yu committed
2920 2921 2922 2923 2924 2925 2926 2927
		if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
			range_whole = 1;
	}
	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
		tag = PAGECACHE_TAG_TOWRITE;
	else
		tag = PAGECACHE_TAG_DIRTY;
retry:
Chao Yu's avatar
Chao Yu committed
2928
	retry = 0;
Chao Yu's avatar
Chao Yu committed
2929 2930 2931
	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
		tag_pages_for_writeback(mapping, index, end);
	done_index = index;
Chao Yu's avatar
Chao Yu committed
2932
	while (!done && !retry && (index <= end)) {
2933
		nr_pages = pagevec_lookup_range_tag(&pvec, mapping, &index, end,
2934
				tag);
Chao Yu's avatar
Chao Yu committed
2935 2936 2937 2938 2939
		if (nr_pages == 0)
			break;

		for (i = 0; i < nr_pages; i++) {
			struct page *page = pvec.pages[i];
Chao Yu's avatar
Chao Yu committed
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958
			bool need_readd;
readd:
			need_readd = false;
#ifdef CONFIG_F2FS_FS_COMPRESSION
			if (f2fs_compressed_file(inode)) {
				ret = f2fs_init_compress_ctx(&cc);
				if (ret) {
					done = 1;
					break;
				}

				if (!f2fs_cluster_can_merge_page(&cc,
								page->index)) {
					ret = f2fs_write_multi_pages(&cc,
						&submitted, wbc, io_type);
					if (!ret)
						need_readd = true;
					goto result;
				}
Chao Yu's avatar
Chao Yu committed
2959

Chao Yu's avatar
Chao Yu committed
2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986
				if (unlikely(f2fs_cp_error(sbi)))
					goto lock_page;

				if (f2fs_cluster_is_empty(&cc)) {
					void *fsdata = NULL;
					struct page *pagep;
					int ret2;

					ret2 = f2fs_prepare_compress_overwrite(
							inode, &pagep,
							page->index, &fsdata);
					if (ret2 < 0) {
						ret = ret2;
						done = 1;
						break;
					} else if (ret2 &&
						!f2fs_compress_write_end(inode,
								fsdata, page->index,
								1)) {
						retry = 1;
						break;
					}
				} else {
					goto lock_page;
				}
			}
#endif
2987
			/* give a priority to WB_SYNC threads */
2988
			if (atomic_read(&sbi->wb_sync_req[DATA]) &&
2989 2990 2991 2992
					wbc->sync_mode == WB_SYNC_NONE) {
				done = 1;
				break;
			}
Chao Yu's avatar
Chao Yu committed
2993 2994 2995
#ifdef CONFIG_F2FS_FS_COMPRESSION
lock_page:
#endif
Chao Yu's avatar
Chao Yu committed
2996
			done_index = page->index;
2997
retry_write:
Chao Yu's avatar
Chao Yu committed
2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011
			lock_page(page);

			if (unlikely(page->mapping != mapping)) {
continue_unlock:
				unlock_page(page);
				continue;
			}

			if (!PageDirty(page)) {
				/* someone wrote it for us */
				goto continue_unlock;
			}

			if (PageWriteback(page)) {
Chao Yu's avatar
Chao Yu committed
3012
				if (wbc->sync_mode != WB_SYNC_NONE)
3013
					f2fs_wait_on_page_writeback(page,
3014
							DATA, true, true);
Chao Yu's avatar
Chao Yu committed
3015
				else
Chao Yu's avatar
Chao Yu committed
3016 3017 3018 3019 3020 3021
					goto continue_unlock;
			}

			if (!clear_page_dirty_for_io(page))
				goto continue_unlock;

Chao Yu's avatar
Chao Yu committed
3022 3023 3024 3025 3026 3027 3028 3029
#ifdef CONFIG_F2FS_FS_COMPRESSION
			if (f2fs_compressed_file(inode)) {
				get_page(page);
				f2fs_compress_ctx_add_page(&cc, page);
				continue;
			}
#endif
			ret = f2fs_write_single_data_page(page, &submitted,
3030 3031
					&bio, &last_block, wbc, io_type,
					0, true);
Chao Yu's avatar
Chao Yu committed
3032 3033 3034 3035 3036 3037 3038 3039
			if (ret == AOP_WRITEPAGE_ACTIVATE)
				unlock_page(page);
#ifdef CONFIG_F2FS_FS_COMPRESSION
result:
#endif
			nwritten += submitted;
			wbc->nr_to_write -= submitted;

Chao Yu's avatar
Chao Yu committed
3040
			if (unlikely(ret)) {
3041 3042 3043 3044 3045 3046
				/*
				 * keep nr_to_write, since vfs uses this to
				 * get # of written pages.
				 */
				if (ret == AOP_WRITEPAGE_ACTIVATE) {
					ret = 0;
Chao Yu's avatar
Chao Yu committed
3047
					goto next;
3048 3049 3050 3051 3052
				} else if (ret == -EAGAIN) {
					ret = 0;
					if (wbc->sync_mode == WB_SYNC_ALL) {
						cond_resched();
						congestion_wait(BLK_RW_ASYNC,
Chao Yu's avatar
Chao Yu committed
3053
							DEFAULT_IO_TIMEOUT);
3054 3055
						goto retry_write;
					}
Chao Yu's avatar
Chao Yu committed
3056
					goto next;
3057
				}
3058 3059 3060
				done_index = page->index + 1;
				done = 1;
				break;
Chao Yu's avatar
Chao Yu committed
3061 3062
			}

Chao Yu's avatar
Chao Yu committed
3063
			if (wbc->nr_to_write <= 0 &&
3064
					wbc->sync_mode == WB_SYNC_NONE) {
Chao Yu's avatar
Chao Yu committed
3065 3066 3067
				done = 1;
				break;
			}
Chao Yu's avatar
Chao Yu committed
3068 3069 3070
next:
			if (need_readd)
				goto readd;
Chao Yu's avatar
Chao Yu committed
3071 3072 3073 3074
		}
		pagevec_release(&pvec);
		cond_resched();
	}
Chao Yu's avatar
Chao Yu committed
3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085
#ifdef CONFIG_F2FS_FS_COMPRESSION
	/* flush remained pages in compress cluster */
	if (f2fs_compressed_file(inode) && !f2fs_cluster_is_empty(&cc)) {
		ret = f2fs_write_multi_pages(&cc, &submitted, wbc, io_type);
		nwritten += submitted;
		wbc->nr_to_write -= submitted;
		if (ret) {
			done = 1;
			retry = 0;
		}
	}
3086
	if (f2fs_compressed_file(inode))
3087
		f2fs_destroy_compress_ctx(&cc, false);
Chao Yu's avatar
Chao Yu committed
3088
#endif
3089
	if (retry) {
Chao Yu's avatar
Chao Yu committed
3090
		index = 0;
3091
		end = -1;
Chao Yu's avatar
Chao Yu committed
3092 3093
		goto retry;
	}
3094 3095
	if (wbc->range_cyclic && !done)
		done_index = 0;
Chao Yu's avatar
Chao Yu committed
3096 3097 3098
	if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
		mapping->writeback_index = done_index;

3099
	if (nwritten)
3100
		f2fs_submit_merged_write_cond(F2FS_M_SB(mapping), mapping->host,
3101
								NULL, 0, DATA);
Chao Yu's avatar
Chao Yu committed
3102 3103
	/* submit cached bio of IPU write */
	if (bio)
Chao Yu's avatar
Chao Yu committed
3104
		f2fs_submit_merged_ipu_write(sbi, &bio, NULL);
Chao Yu's avatar
Chao Yu committed
3105

Chao Yu's avatar
Chao Yu committed
3106 3107 3108
	return ret;
}

3109 3110 3111
static inline bool __should_serialize_io(struct inode *inode,
					struct writeback_control *wbc)
{
3112 3113 3114 3115
	/* to avoid deadlock in path of data flush */
	if (F2FS_I(inode)->cp_task)
		return false;

3116 3117
	if (!S_ISREG(inode->i_mode))
		return false;
3118 3119
	if (IS_NOQUOTA(inode))
		return false;
3120

3121
	if (f2fs_need_compress_data(inode))
3122
		return true;
3123 3124 3125 3126 3127 3128 3129
	if (wbc->sync_mode != WB_SYNC_ALL)
		return true;
	if (get_dirty_pages(inode) >= SM_I(F2FS_I_SB(inode))->min_seq_blocks)
		return true;
	return false;
}

3130
static int __f2fs_write_data_pages(struct address_space *mapping,
Chao Yu's avatar
Chao Yu committed
3131 3132
						struct writeback_control *wbc,
						enum iostat_type io_type)
3133 3134
{
	struct inode *inode = mapping->host;
3135
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3136
	struct blk_plug plug;
3137
	int ret;
3138
	bool locked = false;
3139

P J P's avatar
P J P committed
3140 3141 3142 3143
	/* deal with chardevs and other special file */
	if (!mapping->a_ops->writepage)
		return 0;

3144 3145 3146 3147
	/* skip writing if there is no dirty page in this inode */
	if (!get_dirty_pages(inode) && wbc->sync_mode == WB_SYNC_NONE)
		return 0;

3148 3149 3150 3151
	/* during POR, we don't need to trigger writepage at all. */
	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
		goto skip_write;

3152 3153
	if ((S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) &&
			wbc->sync_mode == WB_SYNC_NONE &&
3154
			get_dirty_pages(inode) < nr_pages_to_skip(sbi, DATA) &&
Chao Yu's avatar
Chao Yu committed
3155
			f2fs_available_free_memory(sbi, DIRTY_DENTS))
3156 3157
		goto skip_write;

Chao Yu's avatar
Chao Yu committed
3158
	/* skip writing during file defragment */
3159
	if (is_inode_flag_set(inode, FI_DO_DEFRAG))
Chao Yu's avatar
Chao Yu committed
3160 3161
		goto skip_write;

Yunlei He's avatar
Yunlei He committed
3162 3163
	trace_f2fs_writepages(mapping->host, wbc, DATA);

3164 3165
	/* to avoid spliting IOs due to mixed WB_SYNC_ALL and WB_SYNC_NONE */
	if (wbc->sync_mode == WB_SYNC_ALL)
3166 3167
		atomic_inc(&sbi->wb_sync_req[DATA]);
	else if (atomic_read(&sbi->wb_sync_req[DATA]))
3168 3169
		goto skip_write;

3170 3171 3172 3173 3174
	if (__should_serialize_io(inode, wbc)) {
		mutex_lock(&sbi->writepages);
		locked = true;
	}

3175
	blk_start_plug(&plug);
Chao Yu's avatar
Chao Yu committed
3176
	ret = f2fs_write_cache_pages(mapping, wbc, io_type);
3177
	blk_finish_plug(&plug);
3178

3179 3180 3181
	if (locked)
		mutex_unlock(&sbi->writepages);

3182
	if (wbc->sync_mode == WB_SYNC_ALL)
3183
		atomic_dec(&sbi->wb_sync_req[DATA]);
3184 3185 3186 3187
	/*
	 * if some pages were truncated, we cannot guarantee its mapping->host
	 * to detect pending bios.
	 */
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3188

Chao Yu's avatar
Chao Yu committed
3189
	f2fs_remove_dirty_inode(inode);
3190
	return ret;
3191 3192

skip_write:
3193
	wbc->pages_skipped += get_dirty_pages(inode);
Yunlei He's avatar
Yunlei He committed
3194
	trace_f2fs_writepages(mapping->host, wbc, DATA);
3195
	return 0;
3196 3197
}

Chao Yu's avatar
Chao Yu committed
3198 3199 3200 3201 3202 3203 3204 3205 3206 3207
static int f2fs_write_data_pages(struct address_space *mapping,
			    struct writeback_control *wbc)
{
	struct inode *inode = mapping->host;

	return __f2fs_write_data_pages(mapping, wbc,
			F2FS_I(inode)->cp_task == current ?
			FS_CP_DATA_IO : FS_DATA_IO);
}

3208
static void f2fs_write_failed(struct inode *inode, loff_t to)
3209
{
3210
	loff_t i_size = i_size_read(inode);
3211

3212 3213 3214
	if (IS_NOQUOTA(inode))
		return;

Eric Biggers's avatar
Eric Biggers committed
3215 3216
	/* In the fs-verity case, f2fs_end_enable_verity() does the truncate */
	if (to > i_size && !f2fs_verity_in_progress(inode)) {
3217
		down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3218
		down_write(&F2FS_I(inode)->i_mmap_sem);
3219

3220
		truncate_pagecache(inode, i_size);
3221
		f2fs_truncate_blocks(inode, i_size, true);
3222

3223
		up_write(&F2FS_I(inode)->i_mmap_sem);
3224
		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3225 3226 3227
	}
}

3228 3229 3230 3231 3232 3233 3234 3235
static int prepare_write_begin(struct f2fs_sb_info *sbi,
			struct page *page, loff_t pos, unsigned len,
			block_t *blk_addr, bool *node_changed)
{
	struct inode *inode = page->mapping->host;
	pgoff_t index = page->index;
	struct dnode_of_data dn;
	struct page *ipage;
3236
	bool locked = false;
3237
	struct extent_info ei = {0, };
3238
	int err = 0;
3239
	int flag;
3240

3241 3242 3243 3244
	/*
	 * we already allocated all the blocks, so we don't need to get
	 * the block addresses when there is no need to fill the page.
	 */
3245
	if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE &&
Eric Biggers's avatar
Eric Biggers committed
3246 3247
	    !is_inode_flag_set(inode, FI_NO_PREALLOC) &&
	    !f2fs_verity_in_progress(inode))
3248 3249
		return 0;

3250 3251 3252 3253 3254 3255
	/* f2fs_lock_op avoids race between write CP and convert_inline_page */
	if (f2fs_has_inline_data(inode) && pos + len > MAX_INLINE_DATA(inode))
		flag = F2FS_GET_BLOCK_DEFAULT;
	else
		flag = F2FS_GET_BLOCK_PRE_AIO;

3256
	if (f2fs_has_inline_data(inode) ||
3257
			(pos & PAGE_MASK) >= i_size_read(inode)) {
3258
		f2fs_do_map_lock(sbi, flag, true);
3259 3260
		locked = true;
	}
Chao Yu's avatar
Chao Yu committed
3261

3262
restart:
3263
	/* check inline_data */
Chao Yu's avatar
Chao Yu committed
3264
	ipage = f2fs_get_node_page(sbi, inode->i_ino);
3265 3266 3267 3268 3269 3270 3271 3272
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto unlock_out;
	}

	set_new_dnode(&dn, inode, ipage, ipage, 0);

	if (f2fs_has_inline_data(inode)) {
3273
		if (pos + len <= MAX_INLINE_DATA(inode)) {
Chao Yu's avatar
Chao Yu committed
3274
			f2fs_do_read_inline_data(page, ipage);
3275
			set_inode_flag(inode, FI_DATA_EXIST);
3276
			if (inode->i_nlink)
3277
				set_page_private_inline(ipage);
3278 3279 3280
		} else {
			err = f2fs_convert_inline_page(&dn, page);
			if (err)
3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291
				goto out;
			if (dn.data_blkaddr == NULL_ADDR)
				err = f2fs_get_block(&dn, index);
		}
	} else if (locked) {
		err = f2fs_get_block(&dn, index);
	} else {
		if (f2fs_lookup_extent_cache(inode, index, &ei)) {
			dn.data_blkaddr = ei.blk + index - ei.fofs;
		} else {
			/* hole case */
Chao Yu's avatar
Chao Yu committed
3292
			err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
3293
			if (err || dn.data_blkaddr == NULL_ADDR) {
3294
				f2fs_put_dnode(&dn);
3295
				f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO,
3296
								true);
3297
				WARN_ON(flag != F2FS_GET_BLOCK_PRE_AIO);
3298 3299 3300
				locked = true;
				goto restart;
			}
3301 3302
		}
	}
3303

3304 3305 3306
	/* convert_inline_page can make node_changed */
	*blk_addr = dn.data_blkaddr;
	*node_changed = dn.node_changed;
3307
out:
3308 3309
	f2fs_put_dnode(&dn);
unlock_out:
3310
	if (locked)
3311
		f2fs_do_map_lock(sbi, flag, false);
3312 3313 3314
	return err;
}

3315 3316 3317 3318 3319
static int f2fs_write_begin(struct file *file, struct address_space *mapping,
		loff_t pos, unsigned len, unsigned flags,
		struct page **pagep, void **fsdata)
{
	struct inode *inode = mapping->host;
3320
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3321
	struct page *page = NULL;
3322
	pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT;
3323
	bool need_balance = false, drop_atomic = false;
3324
	block_t blkaddr = NULL_ADDR;
3325 3326
	int err = 0;

3327 3328
	trace_f2fs_write_begin(inode, pos, len, flags);

3329 3330
	if (!f2fs_is_checkpoint_ready(sbi)) {
		err = -ENOSPC;
Daniel Rosenberg's avatar
Daniel Rosenberg committed
3331
		goto fail;
3332
	}
Daniel Rosenberg's avatar
Daniel Rosenberg committed
3333

3334 3335 3336
	if ((f2fs_is_atomic_file(inode) &&
			!f2fs_available_free_memory(sbi, INMEM_PAGES)) ||
			is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST)) {
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3337
		err = -ENOMEM;
3338
		drop_atomic = true;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3339 3340 3341
		goto fail;
	}

3342 3343 3344 3345 3346 3347 3348 3349 3350 3351
	/*
	 * We should check this at this moment to avoid deadlock on inode page
	 * and #0 page. The locking rule for inline_data conversion should be:
	 * lock_page(page #0) -> lock_page(inode_page)
	 */
	if (index != 0) {
		err = f2fs_convert_inline_inode(inode);
		if (err)
			goto fail;
	}
Chao Yu's avatar
Chao Yu committed
3352 3353 3354 3355 3356 3357 3358

#ifdef CONFIG_F2FS_FS_COMPRESSION
	if (f2fs_compressed_file(inode)) {
		int ret;

		*fsdata = NULL;

3359 3360 3361
		if (len == PAGE_SIZE)
			goto repeat;

Chao Yu's avatar
Chao Yu committed
3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372
		ret = f2fs_prepare_compress_overwrite(inode, pagep,
							index, fsdata);
		if (ret < 0) {
			err = ret;
			goto fail;
		} else if (ret) {
			return 0;
		}
	}
#endif

3373
repeat:
3374 3375 3376 3377
	/*
	 * Do not use grab_cache_page_write_begin() to avoid deadlock due to
	 * wait_for_stable_page. Will wait that below with our IO control.
	 */
3378
	page = f2fs_pagecache_get_page(mapping, index,
3379
				FGP_LOCK | FGP_WRITE | FGP_CREAT, GFP_NOFS);
3380 3381 3382 3383
	if (!page) {
		err = -ENOMEM;
		goto fail;
	}
3384

Chao Yu's avatar
Chao Yu committed
3385 3386
	/* TODO: cluster can be compressed due to race with .writepage */

3387 3388
	*pagep = page;

3389 3390
	err = prepare_write_begin(sbi, page, pos, len,
					&blkaddr, &need_balance);
3391
	if (err)
3392
		goto fail;
3393

3394 3395
	if (need_balance && !IS_NOQUOTA(inode) &&
			has_not_enough_free_secs(sbi, 0, 0)) {
3396
		unlock_page(page);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3397
		f2fs_balance_fs(sbi, true);
3398 3399 3400 3401 3402 3403 3404 3405
		lock_page(page);
		if (page->mapping != mapping) {
			/* The page got truncated from under us */
			f2fs_put_page(page, 1);
			goto repeat;
		}
	}

3406
	f2fs_wait_on_page_writeback(page, DATA, false, true);
3407

3408 3409
	if (len == PAGE_SIZE || PageUptodate(page))
		return 0;
3410

Eric Biggers's avatar
Eric Biggers committed
3411 3412
	if (!(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode) &&
	    !f2fs_verity_in_progress(inode)) {
3413 3414 3415 3416
		zero_user_segment(page, len, PAGE_SIZE);
		return 0;
	}

3417
	if (blkaddr == NEW_ADDR) {
3418
		zero_user_segment(page, 0, PAGE_SIZE);
3419
		SetPageUptodate(page);
3420
	} else {
3421 3422
		if (!f2fs_is_valid_blkaddr(sbi, blkaddr,
				DATA_GENERIC_ENHANCE_READ)) {
3423
			err = -EFSCORRUPTED;
3424 3425
			goto fail;
		}
3426
		err = f2fs_submit_page_read(inode, page, blkaddr, 0, true);
3427
		if (err)
3428
			goto fail;
3429

3430
		lock_page(page);
3431
		if (unlikely(page->mapping != mapping)) {
3432 3433
			f2fs_put_page(page, 1);
			goto repeat;
3434
		}
3435 3436 3437
		if (unlikely(!PageUptodate(page))) {
			err = -EIO;
			goto fail;
3438
		}
3439 3440
	}
	return 0;
3441

3442
fail:
3443
	f2fs_put_page(page, 1);
3444
	f2fs_write_failed(inode, pos + len);
3445
	if (drop_atomic)
Chao Yu's avatar
Chao Yu committed
3446
		f2fs_drop_inmem_pages_all(sbi, false);
3447
	return err;
3448 3449
}

3450 3451 3452 3453 3454 3455 3456
static int f2fs_write_end(struct file *file,
			struct address_space *mapping,
			loff_t pos, unsigned len, unsigned copied,
			struct page *page, void *fsdata)
{
	struct inode *inode = page->mapping->host;

3457 3458
	trace_f2fs_write_end(inode, pos, len, copied);

3459 3460 3461 3462 3463 3464
	/*
	 * This should be come from len == PAGE_SIZE, and we expect copied
	 * should be PAGE_SIZE. Otherwise, we treat it with zero copied and
	 * let generic_perform_write() try to copy data again through copied=0.
	 */
	if (!PageUptodate(page)) {
3465
		if (unlikely(copied != len))
3466 3467 3468 3469
			copied = 0;
		else
			SetPageUptodate(page);
	}
Chao Yu's avatar
Chao Yu committed
3470 3471 3472 3473 3474 3475

#ifdef CONFIG_F2FS_FS_COMPRESSION
	/* overwrite compressed file */
	if (f2fs_compressed_file(inode) && fsdata) {
		f2fs_compress_write_end(inode, fsdata, page->index, copied);
		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
3476 3477 3478 3479

		if (pos + copied > i_size_read(inode) &&
				!f2fs_verity_in_progress(inode))
			f2fs_i_size_write(inode, pos + copied);
Chao Yu's avatar
Chao Yu committed
3480 3481 3482 3483
		return copied;
	}
#endif

3484 3485 3486
	if (!copied)
		goto unlock_out;

3487
	set_page_dirty(page);
3488

Eric Biggers's avatar
Eric Biggers committed
3489 3490
	if (pos + copied > i_size_read(inode) &&
	    !f2fs_verity_in_progress(inode))
3491
		f2fs_i_size_write(inode, pos + copied);
3492
unlock_out:
3493
	f2fs_put_page(page, 1);
3494
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
3495 3496 3497
	return copied;
}

3498 3499
static int check_direct_IO(struct inode *inode, struct iov_iter *iter,
			   loff_t offset)
3500
{
3501 3502 3503 3504 3505 3506
	unsigned i_blkbits = READ_ONCE(inode->i_blkbits);
	unsigned blkbits = i_blkbits;
	unsigned blocksize_mask = (1 << blkbits) - 1;
	unsigned long align = offset | iov_iter_alignment(iter);
	struct block_device *bdev = inode->i_sb->s_bdev;

3507 3508 3509
	if (iov_iter_rw(iter) == READ && offset >= i_size_read(inode))
		return 1;

3510 3511 3512 3513 3514 3515 3516 3517
	if (align & blocksize_mask) {
		if (bdev)
			blkbits = blksize_bits(bdev_logical_block_size(bdev));
		blocksize_mask = (1 << blkbits) - 1;
		if (align & blocksize_mask)
			return -EINVAL;
		return 1;
	}
3518 3519 3520
	return 0;
}

Chao Yu's avatar
Chao Yu committed
3521 3522 3523 3524 3525 3526 3527 3528 3529 3530
static void f2fs_dio_end_io(struct bio *bio)
{
	struct f2fs_private_dio *dio = bio->bi_private;

	dec_page_count(F2FS_I_SB(dio->inode),
			dio->write ? F2FS_DIO_WRITE : F2FS_DIO_READ);

	bio->bi_private = dio->orig_private;
	bio->bi_end_io = dio->orig_end_io;

Chao Yu's avatar
Chao Yu committed
3531
	kfree(dio);
Chao Yu's avatar
Chao Yu committed
3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543

	bio_endio(bio);
}

static void f2fs_dio_submit_bio(struct bio *bio, struct inode *inode,
							loff_t file_offset)
{
	struct f2fs_private_dio *dio;
	bool write = (bio_op(bio) == REQ_OP_WRITE);

	dio = f2fs_kzalloc(F2FS_I_SB(inode),
			sizeof(struct f2fs_private_dio), GFP_NOFS);
3544
	if (!dio)
Chao Yu's avatar
Chao Yu committed
3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564
		goto out;

	dio->inode = inode;
	dio->orig_end_io = bio->bi_end_io;
	dio->orig_private = bio->bi_private;
	dio->write = write;

	bio->bi_end_io = f2fs_dio_end_io;
	bio->bi_private = dio;

	inc_page_count(F2FS_I_SB(inode),
			write ? F2FS_DIO_WRITE : F2FS_DIO_READ);

	submit_bio(bio);
	return;
out:
	bio->bi_status = BLK_STS_IOERR;
	bio_endio(bio);
}

3565
static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3566
{
3567
	struct address_space *mapping = iocb->ki_filp->f_mapping;
3568
	struct inode *inode = mapping->host;
3569
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3570
	struct f2fs_inode_info *fi = F2FS_I(inode);
3571
	size_t count = iov_iter_count(iter);
3572
	loff_t offset = iocb->ki_pos;
3573
	int rw = iov_iter_rw(iter);
3574
	int err;
3575
	enum rw_hint hint = iocb->ki_hint;
3576
	int whint_mode = F2FS_OPTION(sbi).whint_mode;
3577
	bool do_opu;
3578

3579
	err = check_direct_IO(inode, iter, offset);
3580
	if (err)
3581
		return err < 0 ? err : 0;
3582

3583
	if (f2fs_force_buffered_io(inode, iocb, iter))
3584
		return 0;
3585

3586
	do_opu = rw == WRITE && f2fs_lfs_mode(sbi);
3587

3588
	trace_f2fs_direct_IO_enter(inode, offset, count, rw);
3589

3590 3591 3592
	if (rw == WRITE && whint_mode == WHINT_MODE_OFF)
		iocb->ki_hint = WRITE_LIFE_NOT_SET;

3593 3594 3595 3596 3597 3598 3599 3600
	if (iocb->ki_flags & IOCB_NOWAIT) {
		if (!down_read_trylock(&fi->i_gc_rwsem[rw])) {
			iocb->ki_hint = hint;
			err = -EAGAIN;
			goto out;
		}
		if (do_opu && !down_read_trylock(&fi->i_gc_rwsem[READ])) {
			up_read(&fi->i_gc_rwsem[rw]);
Hyunchul Lee's avatar
Hyunchul Lee committed
3601 3602 3603 3604
			iocb->ki_hint = hint;
			err = -EAGAIN;
			goto out;
		}
3605 3606 3607 3608
	} else {
		down_read(&fi->i_gc_rwsem[rw]);
		if (do_opu)
			down_read(&fi->i_gc_rwsem[READ]);
Hyunchul Lee's avatar
Hyunchul Lee committed
3609 3610
	}

Chao Yu's avatar
Chao Yu committed
3611
	err = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
3612 3613
			iter, rw == WRITE ? get_data_block_dio_write :
			get_data_block_dio, NULL, f2fs_dio_submit_bio,
DongDongJu's avatar
DongDongJu committed
3614 3615
			rw == WRITE ? DIO_LOCKING | DIO_SKIP_HOLES :
			DIO_SKIP_HOLES);
3616 3617 3618 3619 3620

	if (do_opu)
		up_read(&fi->i_gc_rwsem[READ]);

	up_read(&fi->i_gc_rwsem[rw]);
3621 3622

	if (rw == WRITE) {
3623 3624
		if (whint_mode == WHINT_MODE_OFF)
			iocb->ki_hint = hint;
Chao Yu's avatar
Chao Yu committed
3625 3626 3627
		if (err > 0) {
			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
									err);
3628 3629
			if (!do_opu)
				set_inode_flag(inode, FI_UPDATE_WRITE);
3630 3631 3632
		} else if (err == -EIOCBQUEUED) {
			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
						count - iov_iter_count(iter));
Chao Yu's avatar
Chao Yu committed
3633
		} else if (err < 0) {
3634
			f2fs_write_failed(inode, offset + count);
Chao Yu's avatar
Chao Yu committed
3635
		}
Chao Yu's avatar
Chao Yu committed
3636 3637 3638
	} else {
		if (err > 0)
			f2fs_update_iostat(sbi, APP_DIRECT_READ_IO, err);
3639 3640 3641
		else if (err == -EIOCBQUEUED)
			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_READ_IO,
						count - iov_iter_count(iter));
3642
	}
3643

Hyunchul Lee's avatar
Hyunchul Lee committed
3644
out:
3645
	trace_f2fs_direct_IO_exit(inode, offset, count, rw, err);
3646

3647
	return err;
3648 3649
}

3650 3651
void f2fs_invalidate_page(struct page *page, unsigned int offset,
							unsigned int length)
3652 3653
{
	struct inode *inode = page->mapping->host;
3654
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3655

3656
	if (inode->i_ino >= F2FS_ROOT_INO(sbi) &&
3657
		(offset % PAGE_SIZE || length != PAGE_SIZE))
3658 3659
		return;

3660
	if (PageDirty(page)) {
3661
		if (inode->i_ino == F2FS_META_INO(sbi)) {
3662
			dec_page_count(sbi, F2FS_DIRTY_META);
3663
		} else if (inode->i_ino == F2FS_NODE_INO(sbi)) {
3664
			dec_page_count(sbi, F2FS_DIRTY_NODES);
3665
		} else {
3666
			inode_dec_dirty_pages(inode);
Chao Yu's avatar
Chao Yu committed
3667
			f2fs_remove_dirty_inode(inode);
3668
		}
3669
	}
Chao Yu's avatar
Chao Yu committed
3670

3671
	clear_page_private_gcing(page);
3672

3673 3674 3675 3676 3677 3678 3679
	if (test_opt(sbi, COMPRESS_CACHE)) {
		if (f2fs_compressed_file(inode))
			f2fs_invalidate_compress_pages(sbi, inode->i_ino);
		if (inode->i_ino == F2FS_COMPRESS_INO(sbi))
			clear_page_private_data(page);
	}

3680
	if (page_private_atomic(page))
Chao Yu's avatar
Chao Yu committed
3681
		return f2fs_drop_inmem_page(inode, page);
Chao Yu's avatar
Chao Yu committed
3682

3683 3684
	detach_page_private(page);
	set_page_private(page, 0);
3685 3686
}

3687
int f2fs_release_page(struct page *page, gfp_t wait)
3688
{
3689 3690 3691 3692
	/* If this is dirty page, keep PagePrivate */
	if (PageDirty(page))
		return 0;

Chao Yu's avatar
Chao Yu committed
3693
	/* This is atomic written page, keep Private */
3694
	if (page_private_atomic(page))
Chao Yu's avatar
Chao Yu committed
3695 3696
		return 0;

3697 3698 3699 3700 3701 3702 3703 3704 3705 3706
	if (test_opt(F2FS_P_SB(page), COMPRESS_CACHE)) {
		struct f2fs_sb_info *sbi = F2FS_P_SB(page);
		struct inode *inode = page->mapping->host;

		if (f2fs_compressed_file(inode))
			f2fs_invalidate_compress_pages(sbi, inode->i_ino);
		if (inode->i_ino == F2FS_COMPRESS_INO(sbi))
			clear_page_private_data(page);
	}

3707 3708 3709 3710
	clear_page_private_gcing(page);

	detach_page_private(page);
	set_page_private(page, 0);
3711
	return 1;
3712 3713 3714 3715
}

static int f2fs_set_data_page_dirty(struct page *page)
{
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3716
	struct inode *inode = page_file_mapping(page)->host;
3717

3718 3719
	trace_f2fs_set_page_dirty(page, DATA);

3720 3721
	if (!PageUptodate(page))
		SetPageUptodate(page);
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3722 3723
	if (PageSwapCache(page))
		return __set_page_dirty_nobuffers(page);
3724

Chao Yu's avatar
Chao Yu committed
3725
	if (f2fs_is_atomic_file(inode) && !f2fs_is_commit_atomic_write(inode)) {
3726
		if (!page_private_atomic(page)) {
Chao Yu's avatar
Chao Yu committed
3727
			f2fs_register_inmem_page(inode, page);
Chao Yu's avatar
Chao Yu committed
3728 3729 3730 3731 3732 3733 3734
			return 1;
		}
		/*
		 * Previously, this page has been registered, we just
		 * return here.
		 */
		return 0;
3735 3736
	}

3737
	if (!PageDirty(page)) {
3738
		__set_page_dirty_nobuffers(page);
Chao Yu's avatar
Chao Yu committed
3739
		f2fs_update_dirty_page(inode, page);
3740 3741 3742 3743 3744
		return 1;
	}
	return 0;
}

3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769

static sector_t f2fs_bmap_compress(struct inode *inode, sector_t block)
{
#ifdef CONFIG_F2FS_FS_COMPRESSION
	struct dnode_of_data dn;
	sector_t start_idx, blknr = 0;
	int ret;

	start_idx = round_down(block, F2FS_I(inode)->i_cluster_size);

	set_new_dnode(&dn, inode, NULL, NULL, 0);
	ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE);
	if (ret)
		return 0;

	if (dn.data_blkaddr != COMPRESS_ADDR) {
		dn.ofs_in_node += block - start_idx;
		blknr = f2fs_data_blkaddr(&dn);
		if (!__is_valid_data_blkaddr(blknr))
			blknr = 0;
	}

	f2fs_put_dnode(&dn);
	return blknr;
#else
3770
	return 0;
3771 3772 3773 3774
#endif
}


Jaegeuk Kim's avatar
Jaegeuk Kim committed
3775 3776
static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
{
3777
	struct inode *inode = mapping->host;
Chao Yu's avatar
Chao Yu committed
3778
	sector_t blknr = 0;
3779

Jaegeuk Kim's avatar
Jaegeuk Kim committed
3780
	if (f2fs_has_inline_data(inode))
Chao Yu's avatar
Chao Yu committed
3781
		goto out;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
3782 3783 3784 3785 3786

	/* make sure allocating whole blocks */
	if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
		filemap_write_and_wait(mapping);

3787
	/* Block number less than F2FS MAX BLOCKS */
3788
	if (unlikely(block >= max_file_blocks(inode)))
3789
		goto out;
3790

3791 3792 3793
	if (f2fs_compressed_file(inode)) {
		blknr = f2fs_bmap_compress(inode, block);
	} else {
3794 3795 3796 3797 3798 3799 3800 3801 3802 3803
		struct f2fs_map_blocks map;

		memset(&map, 0, sizeof(map));
		map.m_lblk = block;
		map.m_len = 1;
		map.m_next_pgofs = NULL;
		map.m_seg_type = NO_CHECK_TYPE;

		if (!f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_BMAP))
			blknr = map.m_pblk;
3804
	}
Chao Yu's avatar
Chao Yu committed
3805 3806 3807
out:
	trace_f2fs_bmap(inode, block, blknr);
	return blknr;
3808 3809
}

3810 3811 3812 3813 3814 3815 3816 3817
#ifdef CONFIG_MIGRATION
#include <linux/migrate.h>

int f2fs_migrate_page(struct address_space *mapping,
		struct page *newpage, struct page *page, enum migrate_mode mode)
{
	int rc, extra_count;
	struct f2fs_inode_info *fi = F2FS_I(mapping->host);
3818
	bool atomic_written = page_private_atomic(page);
3819 3820 3821 3822

	BUG_ON(PageWriteback(page));

	/* migrating an atomic written page is safe with the inmem_lock hold */
3823 3824 3825 3826 3827 3828
	if (atomic_written) {
		if (mode != MIGRATE_SYNC)
			return -EBUSY;
		if (!mutex_trylock(&fi->inmem_lock))
			return -EAGAIN;
	}
3829

3830 3831
	/* one extra reference was held for atomic_write page */
	extra_count = atomic_written ? 1 : 0;
3832
	rc = migrate_page_move_mapping(mapping, newpage,
3833
				page, extra_count);
3834 3835 3836 3837 3838 3839 3840 3841
	if (rc != MIGRATEPAGE_SUCCESS) {
		if (atomic_written)
			mutex_unlock(&fi->inmem_lock);
		return rc;
	}

	if (atomic_written) {
		struct inmem_pages *cur;
Yi Zhuang's avatar
Yi Zhuang committed
3842

3843 3844 3845 3846 3847 3848 3849 3850 3851 3852
		list_for_each_entry(cur, &fi->inmem_pages, list)
			if (cur->page == page) {
				cur->page = newpage;
				break;
			}
		mutex_unlock(&fi->inmem_lock);
		put_page(page);
		get_page(newpage);
	}

3853 3854
	/* guarantee to start from no stale private field */
	set_page_private(newpage, 0);
3855
	if (PagePrivate(page)) {
3856 3857 3858 3859 3860 3861 3862
		set_page_private(newpage, page_private(page));
		SetPagePrivate(newpage);
		get_page(newpage);

		set_page_private(page, 0);
		ClearPagePrivate(page);
		put_page(page);
3863
	}
3864

3865 3866 3867 3868
	if (mode != MIGRATE_SYNC_NO_COPY)
		migrate_page_copy(newpage, page);
	else
		migrate_page_states(newpage, page);
3869 3870 3871 3872 3873

	return MIGRATEPAGE_SUCCESS;
}
#endif

Jaegeuk Kim's avatar
Jaegeuk Kim committed
3874
#ifdef CONFIG_SWAP
3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933
static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk,
							unsigned int blkcnt)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	unsigned int blkofs;
	unsigned int blk_per_sec = BLKS_PER_SEC(sbi);
	unsigned int secidx = start_blk / blk_per_sec;
	unsigned int end_sec = secidx + blkcnt / blk_per_sec;
	int ret = 0;

	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
	down_write(&F2FS_I(inode)->i_mmap_sem);

	set_inode_flag(inode, FI_ALIGNED_WRITE);

	for (; secidx < end_sec; secidx++) {
		down_write(&sbi->pin_sem);

		f2fs_lock_op(sbi);
		f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
		f2fs_unlock_op(sbi);

		set_inode_flag(inode, FI_DO_DEFRAG);

		for (blkofs = 0; blkofs < blk_per_sec; blkofs++) {
			struct page *page;
			unsigned int blkidx = secidx * blk_per_sec + blkofs;

			page = f2fs_get_lock_data_page(inode, blkidx, true);
			if (IS_ERR(page)) {
				up_write(&sbi->pin_sem);
				ret = PTR_ERR(page);
				goto done;
			}

			set_page_dirty(page);
			f2fs_put_page(page, 1);
		}

		clear_inode_flag(inode, FI_DO_DEFRAG);

		ret = filemap_fdatawrite(inode->i_mapping);

		up_write(&sbi->pin_sem);

		if (ret)
			break;
	}

done:
	clear_inode_flag(inode, FI_DO_DEFRAG);
	clear_inode_flag(inode, FI_ALIGNED_WRITE);

	up_write(&F2FS_I(inode)->i_mmap_sem);
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);

	return ret;
}

Chao Yu's avatar
Chao Yu committed
3934
static int check_swap_activate(struct swap_info_struct *sis,
3935 3936 3937 3938
				struct file *swap_file, sector_t *span)
{
	struct address_space *mapping = swap_file->f_mapping;
	struct inode *inode = mapping->host;
3939
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3940 3941 3942 3943 3944 3945 3946
	sector_t cur_lblock;
	sector_t last_lblock;
	sector_t pblock;
	sector_t lowest_pblock = -1;
	sector_t highest_pblock = 0;
	int nr_extents = 0;
	unsigned long nr_pblocks;
3947 3948
	unsigned int blks_per_sec = BLKS_PER_SEC(sbi);
	unsigned int sec_blks_mask = BLKS_PER_SEC(sbi) - 1;
3949
	unsigned int not_aligned = 0;
3950
	int ret = 0;
3951 3952 3953 3954 3955 3956

	/*
	 * Map all the blocks into the extent list.  This code doesn't try
	 * to be very smart.
	 */
	cur_lblock = 0;
3957
	last_lblock = bytes_to_blks(inode, i_size_read(inode));
3958

3959
	while (cur_lblock < last_lblock && cur_lblock < sis->max) {
3960
		struct f2fs_map_blocks map;
3961
retry:
3962 3963
		cond_resched();

3964 3965
		memset(&map, 0, sizeof(map));
		map.m_lblk = cur_lblock;
3966 3967 3968
		map.m_len = last_lblock - cur_lblock;
		map.m_next_pgofs = NULL;
		map.m_next_extent = NULL;
3969
		map.m_seg_type = NO_CHECK_TYPE;
3970
		map.m_may_create = false;
3971

3972
		ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
3973
		if (ret)
3974
			goto out;
3975 3976

		/* hole */
3977
		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
Joe Perches's avatar
Joe Perches committed
3978
			f2fs_err(sbi, "Swapfile has holes");
3979
			ret = -EINVAL;
3980 3981
			goto out;
		}
3982

3983 3984
		pblock = map.m_pblk;
		nr_pblocks = map.m_len;
3985

3986 3987
		if ((pblock - SM_I(sbi)->main_blkaddr) & sec_blks_mask ||
				nr_pblocks & sec_blks_mask) {
3988
			not_aligned++;
3989

3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007
			nr_pblocks = roundup(nr_pblocks, blks_per_sec);
			if (cur_lblock + nr_pblocks > sis->max)
				nr_pblocks -= blks_per_sec;

			if (!nr_pblocks) {
				/* this extent is last one */
				nr_pblocks = map.m_len;
				f2fs_warn(sbi, "Swapfile: last extent is not aligned to section");
				goto next;
			}

			ret = f2fs_migrate_blocks(inode, cur_lblock,
							nr_pblocks);
			if (ret)
				goto out;
			goto retry;
		}
next:
4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034
		if (cur_lblock + nr_pblocks >= sis->max)
			nr_pblocks = sis->max - cur_lblock;

		if (cur_lblock) {	/* exclude the header page */
			if (pblock < lowest_pblock)
				lowest_pblock = pblock;
			if (pblock + nr_pblocks - 1 > highest_pblock)
				highest_pblock = pblock + nr_pblocks - 1;
		}

		/*
		 * We found a PAGE_SIZE-length, PAGE_SIZE-aligned run of blocks
		 */
		ret = add_swap_extent(sis, cur_lblock, nr_pblocks, pblock);
		if (ret < 0)
			goto out;
		nr_extents += ret;
		cur_lblock += nr_pblocks;
	}
	ret = nr_extents;
	*span = 1 + highest_pblock - lowest_pblock;
	if (cur_lblock == 0)
		cur_lblock = 1;	/* force Empty message */
	sis->max = cur_lblock;
	sis->pages = cur_lblock - 1;
	sis->highest_bit = cur_lblock - 1;
out:
4035 4036 4037
	if (not_aligned)
		f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate(%u * N)",
			  not_aligned, blks_per_sec * F2FS_BLKSIZE);
4038 4039 4040
	return ret;
}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052
static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
				sector_t *span)
{
	struct inode *inode = file_inode(file);
	int ret;

	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

	if (f2fs_readonly(F2FS_I_SB(inode)->sb))
		return -EROFS;

4053 4054 4055 4056 4057 4058
	if (f2fs_lfs_mode(F2FS_I_SB(inode))) {
		f2fs_err(F2FS_I_SB(inode),
			"Swapfile not supported in LFS mode");
		return -EINVAL;
	}

Jaegeuk Kim's avatar
Jaegeuk Kim committed
4059 4060 4061 4062
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;

4063
	if (!f2fs_disable_compressed_file(inode))
Chao Yu's avatar
Chao Yu committed
4064 4065
		return -EINVAL;

4066 4067
	f2fs_precache_extents(inode);

4068 4069
	ret = check_swap_activate(sis, file, span);
	if (ret < 0)
Jaegeuk Kim's avatar
Jaegeuk Kim committed
4070 4071 4072 4073
		return ret;

	set_inode_flag(inode, FI_PIN_FILE);
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
4074
	return ret;
Jaegeuk Kim's avatar
Jaegeuk Kim committed
4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094
}

static void f2fs_swap_deactivate(struct file *file)
{
	struct inode *inode = file_inode(file);

	clear_inode_flag(inode, FI_PIN_FILE);
}
#else
static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
				sector_t *span)
{
	return -EOPNOTSUPP;
}

static void f2fs_swap_deactivate(struct file *file)
{
}
#endif

4095 4096
const struct address_space_operations f2fs_dblock_aops = {
	.readpage	= f2fs_read_data_page,
4097
	.readahead	= f2fs_readahead,
4098 4099 4100
	.writepage	= f2fs_write_data_page,
	.writepages	= f2fs_write_data_pages,
	.write_begin	= f2fs_write_begin,
4101
	.write_end	= f2fs_write_end,
4102
	.set_page_dirty	= f2fs_set_data_page_dirty,
4103 4104
	.invalidatepage	= f2fs_invalidate_page,
	.releasepage	= f2fs_release_page,
4105
	.direct_IO	= f2fs_direct_IO,
Jaegeuk Kim's avatar
Jaegeuk Kim committed
4106
	.bmap		= f2fs_bmap,
Jaegeuk Kim's avatar
Jaegeuk Kim committed
4107 4108
	.swap_activate  = f2fs_swap_activate,
	.swap_deactivate = f2fs_swap_deactivate,
4109 4110 4111
#ifdef CONFIG_MIGRATION
	.migratepage    = f2fs_migrate_page,
#endif
4112
};
4113

Matthew Wilcox's avatar
Matthew Wilcox committed
4114
void f2fs_clear_page_cache_dirty_tag(struct page *page)
4115 4116 4117 4118 4119
{
	struct address_space *mapping = page_mapping(page);
	unsigned long flags;

	xa_lock_irqsave(&mapping->i_pages, flags);
Matthew Wilcox's avatar
Matthew Wilcox committed
4120
	__xa_clear_mark(&mapping->i_pages, page_index(page),
4121 4122 4123 4124
						PAGECACHE_TAG_DIRTY);
	xa_unlock_irqrestore(&mapping->i_pages, flags);
}

4125 4126
int __init f2fs_init_post_read_processing(void)
{
Eric Biggers's avatar
Eric Biggers committed
4127 4128 4129
	bio_post_read_ctx_cache =
		kmem_cache_create("f2fs_bio_post_read_ctx",
				  sizeof(struct bio_post_read_ctx), 0, 0, NULL);
4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144
	if (!bio_post_read_ctx_cache)
		goto fail;
	bio_post_read_ctx_pool =
		mempool_create_slab_pool(NUM_PREALLOC_POST_READ_CTXS,
					 bio_post_read_ctx_cache);
	if (!bio_post_read_ctx_pool)
		goto fail_free_cache;
	return 0;

fail_free_cache:
	kmem_cache_destroy(bio_post_read_ctx_cache);
fail:
	return -ENOMEM;
}

Chao Yu's avatar
Chao Yu committed
4145
void f2fs_destroy_post_read_processing(void)
4146 4147 4148 4149
{
	mempool_destroy(bio_post_read_ctx_pool);
	kmem_cache_destroy(bio_post_read_ctx_cache);
}
Chao Yu's avatar
Chao Yu committed
4150

Chao Yu's avatar
Chao Yu committed
4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171
int f2fs_init_post_read_wq(struct f2fs_sb_info *sbi)
{
	if (!f2fs_sb_has_encrypt(sbi) &&
		!f2fs_sb_has_verity(sbi) &&
		!f2fs_sb_has_compression(sbi))
		return 0;

	sbi->post_read_wq = alloc_workqueue("f2fs_post_read_wq",
						 WQ_UNBOUND | WQ_HIGHPRI,
						 num_online_cpus());
	if (!sbi->post_read_wq)
		return -ENOMEM;
	return 0;
}

void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi)
{
	if (sbi->post_read_wq)
		destroy_workqueue(sbi->post_read_wq);
}

Chao Yu's avatar
Chao Yu committed
4172 4173
int __init f2fs_init_bio_entry_cache(void)
{
4174
	bio_entry_slab = f2fs_kmem_cache_create("f2fs_bio_entry_slab",
Chao Yu's avatar
Chao Yu committed
4175 4176 4177 4178 4179 4180
			sizeof(struct bio_entry));
	if (!bio_entry_slab)
		return -ENOMEM;
	return 0;
}

Chao Yu's avatar
Chao Yu committed
4181
void f2fs_destroy_bio_entry_cache(void)
Chao Yu's avatar
Chao Yu committed
4182 4183 4184
{
	kmem_cache_destroy(bio_entry_slab);
}