file.c 87.6 KB
Newer Older
C
Chao Yu 已提交
1
// SPDX-License-Identifier: GPL-2.0
J
Jaegeuk Kim 已提交
2
/*
J
Jaegeuk Kim 已提交
3 4 5 6 7 8 9 10 11 12
 * fs/f2fs/file.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 */
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/stat.h>
#include <linux/buffer_head.h>
#include <linux/writeback.h>
13
#include <linux/blkdev.h>
J
Jaegeuk Kim 已提交
14 15
#include <linux/falloc.h>
#include <linux/types.h>
16
#include <linux/compat.h>
J
Jaegeuk Kim 已提交
17 18
#include <linux/uaccess.h>
#include <linux/mount.h>
19
#include <linux/pagevec.h>
20
#include <linux/uio.h>
21
#include <linux/uuid.h>
22
#include <linux/file.h>
C
Chao Yu 已提交
23
#include <linux/nls.h>
J
Jaegeuk Kim 已提交
24 25 26 27 28 29

#include "f2fs.h"
#include "node.h"
#include "segment.h"
#include "xattr.h"
#include "acl.h"
30
#include "gc.h"
J
Jaegeuk Kim 已提交
31
#include "trace.h"
32
#include <trace/events/f2fs.h>
J
Jaegeuk Kim 已提交
33

34
static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
35 36
{
	struct inode *inode = file_inode(vmf->vma->vm_file);
37
	vm_fault_t ret;
38 39

	down_read(&F2FS_I(inode)->i_mmap_sem);
40
	ret = filemap_fault(vmf);
41 42
	up_read(&F2FS_I(inode)->i_mmap_sem);

C
Chao Yu 已提交
43 44 45 46
	if (!ret)
		f2fs_update_iostat(F2FS_I_SB(inode), APP_MAPPED_READ_IO,
							F2FS_BLKSIZE);

47 48
	trace_f2fs_filemap_fault(inode, vmf->pgoff, (unsigned long)ret);

49
	return ret;
50 51
}

52
static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
J
Jaegeuk Kim 已提交
53 54
{
	struct page *page = vmf->page;
55
	struct inode *inode = file_inode(vmf->vma->vm_file);
56
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
57
	struct dnode_of_data dn;
C
Chao Yu 已提交
58 59
	bool need_alloc = true;
	int err = 0;
J
Jaegeuk Kim 已提交
60

61 62 63 64 65
	if (unlikely(f2fs_cp_error(sbi))) {
		err = -EIO;
		goto err;
	}

66 67
	if (!f2fs_is_checkpoint_ready(sbi)) {
		err = -ENOSPC;
68
		goto err;
69
	}
70

C
Chao Yu 已提交
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#ifdef CONFIG_F2FS_FS_COMPRESSION
	if (f2fs_compressed_file(inode)) {
		int ret = f2fs_is_compressed_cluster(inode, page->index);

		if (ret < 0) {
			err = ret;
			goto err;
		} else if (ret) {
			if (ret < F2FS_I(inode)->i_cluster_size) {
				err = -EAGAIN;
				goto err;
			}
			need_alloc = false;
		}
	}
#endif
87
	/* should do out of any locked page */
C
Chao Yu 已提交
88 89
	if (need_alloc)
		f2fs_balance_fs(sbi, true);
90

J
Jaegeuk Kim 已提交
91
	sb_start_pagefault(inode->i_sb);
92 93

	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
94

95
	file_update_time(vmf->vma->vm_file);
96
	down_read(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
97
	lock_page(page);
98
	if (unlikely(page->mapping != inode->i_mapping ||
99
			page_offset(page) > i_size_read(inode) ||
100
			!PageUptodate(page))) {
J
Jaegeuk Kim 已提交
101 102
		unlock_page(page);
		err = -EFAULT;
103
		goto out_sem;
J
Jaegeuk Kim 已提交
104 105
	}

C
Chao Yu 已提交
106 107 108 109 110 111 112
	if (need_alloc) {
		/* block allocation */
		__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
		set_new_dnode(&dn, inode, NULL, NULL, 0);
		err = f2fs_get_block(&dn, page->index);
		f2fs_put_dnode(&dn);
		__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
C
Chao Yu 已提交
113 114
	}

115 116 117 118 119 120 121 122 123 124
#ifdef CONFIG_F2FS_FS_COMPRESSION
	if (!need_alloc) {
		set_new_dnode(&dn, inode, NULL, NULL, 0);
		err = f2fs_get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
		f2fs_put_dnode(&dn);
	}
#endif
	if (err) {
		unlock_page(page);
		goto out_sem;
C
Chao Yu 已提交
125 126
	}

127
	f2fs_wait_on_page_writeback(page, DATA, false, true);
C
Chao Yu 已提交
128 129 130 131

	/* wait for GCed page writeback via META_MAPPING */
	f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);

J
Jaegeuk Kim 已提交
132 133 134 135
	/*
	 * check to see if the page is mapped already (no holes)
	 */
	if (PageMappedToDisk(page))
C
Chao Yu 已提交
136
		goto out_sem;
J
Jaegeuk Kim 已提交
137 138

	/* page is wholly or partially inside EOF */
139
	if (((loff_t)(page->index + 1) << PAGE_SHIFT) >
C
Chao Yu 已提交
140
						i_size_read(inode)) {
141
		loff_t offset;
142

143 144
		offset = i_size_read(inode) & ~PAGE_MASK;
		zero_user_segment(page, offset, PAGE_SIZE);
J
Jaegeuk Kim 已提交
145 146
	}
	set_page_dirty(page);
147 148
	if (!PageUptodate(page))
		SetPageUptodate(page);
J
Jaegeuk Kim 已提交
149

C
Chao Yu 已提交
150
	f2fs_update_iostat(sbi, APP_MAPPED_IO, F2FS_BLKSIZE);
151
	f2fs_update_time(sbi, REQ_TIME);
C
Chao Yu 已提交
152

153
	trace_f2fs_vm_page_mkwrite(page, DATA);
154 155
out_sem:
	up_read(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
156

J
Jaegeuk Kim 已提交
157
	sb_end_pagefault(inode->i_sb);
158
err:
J
Jaegeuk Kim 已提交
159 160 161 162
	return block_page_mkwrite_return(err);
}

static const struct vm_operations_struct f2fs_file_vm_ops = {
163
	.fault		= f2fs_filemap_fault,
164
	.map_pages	= filemap_map_pages,
165
	.page_mkwrite	= f2fs_vm_page_mkwrite,
J
Jaegeuk Kim 已提交
166 167
};

168 169 170 171
static int get_parent_ino(struct inode *inode, nid_t *pino)
{
	struct dentry *dentry;

172 173 174 175 176
	/*
	 * Make sure to get the non-deleted alias.  The alias associated with
	 * the open file descriptor being fsync()'ed may be deleted already.
	 */
	dentry = d_find_alias(inode);
177 178 179
	if (!dentry)
		return 0;

180 181
	*pino = parent_ino(dentry);
	dput(dentry);
182 183 184
	return 1;
}

C
Chao Yu 已提交
185
static inline enum cp_reason_type need_do_checkpoint(struct inode *inode)
186
{
187
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
C
Chao Yu 已提交
188
	enum cp_reason_type cp_reason = CP_NO_NEEDED;
189

C
Chao Yu 已提交
190 191
	if (!S_ISREG(inode->i_mode))
		cp_reason = CP_NON_REGULAR;
C
Chao Yu 已提交
192 193
	else if (f2fs_compressed_file(inode))
		cp_reason = CP_COMPRESSED;
C
Chao Yu 已提交
194 195
	else if (inode->i_nlink != 1)
		cp_reason = CP_HARDLINK;
196
	else if (is_sbi_flag_set(sbi, SBI_NEED_CP))
C
Chao Yu 已提交
197
		cp_reason = CP_SB_NEED_CP;
198
	else if (file_wrong_pino(inode))
C
Chao Yu 已提交
199
		cp_reason = CP_WRONG_PINO;
C
Chao Yu 已提交
200
	else if (!f2fs_space_for_roll_forward(sbi))
C
Chao Yu 已提交
201
		cp_reason = CP_NO_SPC_ROLL;
C
Chao Yu 已提交
202
	else if (!f2fs_is_checkpointed_node(sbi, F2FS_I(inode)->i_pino))
C
Chao Yu 已提交
203
		cp_reason = CP_NODE_NEED_CP;
204
	else if (test_opt(sbi, FASTBOOT))
C
Chao Yu 已提交
205
		cp_reason = CP_FASTBOOT_MODE;
206
	else if (F2FS_OPTION(sbi).active_logs == 2)
C
Chao Yu 已提交
207
		cp_reason = CP_SPEC_LOG_NUM;
208
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT &&
C
Chao Yu 已提交
209 210 211
		f2fs_need_dentry_mark(sbi, inode->i_ino) &&
		f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino,
							TRANS_DIR_INO))
212
		cp_reason = CP_RECOVER_DIR;
213

C
Chao Yu 已提交
214
	return cp_reason;
215 216
}

217 218 219 220 221
static bool need_inode_page_update(struct f2fs_sb_info *sbi, nid_t ino)
{
	struct page *i = find_get_page(NODE_MAPPING(sbi), ino);
	bool ret = false;
	/* But we need to avoid that there are some inode updates */
C
Chao Yu 已提交
222
	if ((i && PageDirty(i)) || f2fs_need_inode_block_update(sbi, ino))
223 224 225 226 227
		ret = true;
	f2fs_put_page(i, 0);
	return ret;
}

228 229 230 231 232 233 234 235
static void try_to_fix_pino(struct inode *inode)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	nid_t pino;

	down_write(&fi->i_sem);
	if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
			get_parent_ino(inode, &pino)) {
236
		f2fs_i_pino_write(inode, pino);
237 238
		file_got_pino(inode);
	}
239
	up_write(&fi->i_sem);
240 241
}

242 243
static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
						int datasync, bool atomic)
J
Jaegeuk Kim 已提交
244 245
{
	struct inode *inode = file->f_mapping->host;
246
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
247
	nid_t ino = inode->i_ino;
J
Jaegeuk Kim 已提交
248
	int ret = 0;
C
Chao Yu 已提交
249
	enum cp_reason_type cp_reason = 0;
J
Jaegeuk Kim 已提交
250
	struct writeback_control wbc = {
251
		.sync_mode = WB_SYNC_ALL,
J
Jaegeuk Kim 已提交
252 253 254
		.nr_to_write = LONG_MAX,
		.for_reclaim = 0,
	};
255
	unsigned int seq_id = 0;
J
Jaegeuk Kim 已提交
256

D
Daniel Rosenberg 已提交
257 258
	if (unlikely(f2fs_readonly(inode->i_sb) ||
				is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
259 260
		return 0;

261
	trace_f2fs_sync_file_enter(inode);
262

263 264 265
	if (S_ISDIR(inode->i_mode))
		goto go_write;

266
	/* if fdatasync is triggered, let's do in-place-update */
J
Jaegeuk Kim 已提交
267
	if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
268
		set_inode_flag(inode, FI_NEED_IPU);
269
	ret = file_write_and_wait_range(file, start, end);
270
	clear_inode_flag(inode, FI_NEED_IPU);
271

272
	if (ret) {
C
Chao Yu 已提交
273
		trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
J
Jaegeuk Kim 已提交
274
		return ret;
275
	}
J
Jaegeuk Kim 已提交
276

277
	/* if the inode is dirty, let's recover all the time */
C
Chao Yu 已提交
278
	if (!f2fs_skip_inode_update(inode, datasync)) {
279
		f2fs_write_inode(inode, NULL);
280 281 282
		goto go_write;
	}

283 284 285
	/*
	 * if there is no written data, don't waste time to write recovery info.
	 */
286
	if (!is_inode_flag_set(inode, FI_APPEND_WRITE) &&
C
Chao Yu 已提交
287
			!f2fs_exist_written_data(sbi, ino, APPEND_INO)) {
288

289 290
		/* it may call write_inode just prior to fsync */
		if (need_inode_page_update(sbi, ino))
291 292
			goto go_write;

293
		if (is_inode_flag_set(inode, FI_UPDATE_WRITE) ||
C
Chao Yu 已提交
294
				f2fs_exist_written_data(sbi, ino, UPDATE_INO))
295 296 297
			goto flush_out;
		goto out;
	}
298
go_write:
299 300 301 302
	/*
	 * Both of fdatasync() and fsync() are able to be recovered from
	 * sudden-power-off.
	 */
303
	down_read(&F2FS_I(inode)->i_sem);
C
Chao Yu 已提交
304
	cp_reason = need_do_checkpoint(inode);
305
	up_read(&F2FS_I(inode)->i_sem);
306

C
Chao Yu 已提交
307
	if (cp_reason) {
J
Jaegeuk Kim 已提交
308 309
		/* all the dirty node pages should be flushed for POR */
		ret = f2fs_sync_fs(inode->i_sb, 1);
310

311 312 313 314 315
		/*
		 * We've secured consistency through sync_fs. Following pino
		 * will be used only for fsynced inodes after checkpoint.
		 */
		try_to_fix_pino(inode);
316 317
		clear_inode_flag(inode, FI_APPEND_WRITE);
		clear_inode_flag(inode, FI_UPDATE_WRITE);
318 319
		goto out;
	}
320
sync_nodes:
321
	atomic_inc(&sbi->wb_sync_req[NODE]);
322
	ret = f2fs_fsync_node_pages(sbi, inode, &wbc, atomic, &seq_id);
323
	atomic_dec(&sbi->wb_sync_req[NODE]);
324 325
	if (ret)
		goto out;
326

327
	/* if cp_error was enabled, we should avoid infinite loop */
C
Chao Yu 已提交
328 329
	if (unlikely(f2fs_cp_error(sbi))) {
		ret = -EIO;
330
		goto out;
C
Chao Yu 已提交
331
	}
332

C
Chao Yu 已提交
333
	if (f2fs_need_inode_block_update(sbi, ino)) {
334
		f2fs_mark_inode_dirty_sync(inode, true);
335 336
		f2fs_write_inode(inode, NULL);
		goto sync_nodes;
J
Jaegeuk Kim 已提交
337
	}
338

339 340 341 342 343 344 345 346 347
	/*
	 * If it's atomic_write, it's just fine to keep write ordering. So
	 * here we don't need to wait for node write completion, since we use
	 * node chain which serializes node blocks. If one of node writes are
	 * reordered, we can see simply broken chain, resulting in stopping
	 * roll-forward recovery. It means we'll recover all or none node blocks
	 * given fsync mark.
	 */
	if (!atomic) {
348
		ret = f2fs_wait_on_node_pages_writeback(sbi, seq_id);
349 350 351
		if (ret)
			goto out;
	}
352 353

	/* once recovery info is written, don't need to tack this */
C
Chao Yu 已提交
354
	f2fs_remove_ino_entry(sbi, ino, APPEND_INO);
355
	clear_inode_flag(inode, FI_APPEND_WRITE);
356
flush_out:
357
	if (!atomic && F2FS_OPTION(sbi).fsync_mode != FSYNC_MODE_NOBARRIER)
C
Chao Yu 已提交
358
		ret = f2fs_issue_flush(sbi, inode->i_ino);
359
	if (!ret) {
C
Chao Yu 已提交
360
		f2fs_remove_ino_entry(sbi, ino, UPDATE_INO);
361
		clear_inode_flag(inode, FI_UPDATE_WRITE);
C
Chao Yu 已提交
362
		f2fs_remove_ino_entry(sbi, ino, FLUSH_INO);
363
	}
364
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
365
out:
C
Chao Yu 已提交
366
	trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
367
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
368 369 370
	return ret;
}

371 372
int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
{
373 374
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file)))))
		return -EIO;
375 376 377
	return f2fs_do_sync_file(file, start, end, datasync, false);
}

378 379 380
static pgoff_t __get_first_dirty_index(struct address_space *mapping,
						pgoff_t pgofs, int whence)
{
381
	struct page *page;
382 383 384 385 386 387
	int nr_pages;

	if (whence != SEEK_DATA)
		return 0;

	/* find first dirty page index */
388 389 390 391 392 393
	nr_pages = find_get_pages_tag(mapping, &pgofs, PAGECACHE_TAG_DIRTY,
				      1, &page);
	if (!nr_pages)
		return ULONG_MAX;
	pgofs = page->index;
	put_page(page);
394 395 396
	return pgofs;
}

397 398
static bool __found_offset(struct f2fs_sb_info *sbi, block_t blkaddr,
				pgoff_t dirty, pgoff_t pgofs, int whence)
399 400 401 402
{
	switch (whence) {
	case SEEK_DATA:
		if ((blkaddr == NEW_ADDR && dirty == pgofs) ||
C
Chao Yu 已提交
403
			__is_valid_data_blkaddr(blkaddr))
404 405 406 407 408 409 410 411 412 413
			return true;
		break;
	case SEEK_HOLE:
		if (blkaddr == NULL_ADDR)
			return true;
		break;
	}
	return false;
}

414 415 416 417 418
static loff_t f2fs_seek_block(struct file *file, loff_t offset, int whence)
{
	struct inode *inode = file->f_mapping->host;
	loff_t maxbytes = inode->i_sb->s_maxbytes;
	struct dnode_of_data dn;
419 420 421
	pgoff_t pgofs, end_offset, dirty;
	loff_t data_ofs = offset;
	loff_t isize;
422 423
	int err = 0;

A
Al Viro 已提交
424
	inode_lock(inode);
425 426 427 428 429 430

	isize = i_size_read(inode);
	if (offset >= isize)
		goto fail;

	/* handle inline data case */
C
Chao Yu 已提交
431
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
432 433 434 435 436
		if (whence == SEEK_HOLE)
			data_ofs = isize;
		goto found;
	}

437
	pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
438

439 440
	dirty = __get_first_dirty_index(inode->i_mapping, pgofs, whence);

441
	for (; data_ofs < isize; data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
442
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
443
		err = f2fs_get_dnode_of_data(&dn, pgofs, LOOKUP_NODE);
444 445 446
		if (err && err != -ENOENT) {
			goto fail;
		} else if (err == -ENOENT) {
A
arter97 已提交
447
			/* direct node does not exists */
448
			if (whence == SEEK_DATA) {
C
Chao Yu 已提交
449
				pgofs = f2fs_get_next_page_offset(&dn, pgofs);
450 451 452 453 454 455
				continue;
			} else {
				goto found;
			}
		}

456
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
457 458 459 460

		/* find data/hole in dnode block */
		for (; dn.ofs_in_node < end_offset;
				dn.ofs_in_node++, pgofs++,
461
				data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
462
			block_t blkaddr;
463

464
			blkaddr = f2fs_data_blkaddr(&dn);
465

466 467
			if (__is_valid_data_blkaddr(blkaddr) &&
				!f2fs_is_valid_blkaddr(F2FS_I_SB(inode),
C
Chao Yu 已提交
468
					blkaddr, DATA_GENERIC_ENHANCE)) {
469 470 471 472
				f2fs_put_dnode(&dn);
				goto fail;
			}

473 474
			if (__found_offset(F2FS_I_SB(inode), blkaddr, dirty,
							pgofs, whence)) {
475 476 477 478 479 480 481 482 483 484
				f2fs_put_dnode(&dn);
				goto found;
			}
		}
		f2fs_put_dnode(&dn);
	}

	if (whence == SEEK_DATA)
		goto fail;
found:
485 486
	if (whence == SEEK_HOLE && data_ofs > isize)
		data_ofs = isize;
A
Al Viro 已提交
487
	inode_unlock(inode);
488 489
	return vfs_setpos(file, data_ofs, maxbytes);
fail:
A
Al Viro 已提交
490
	inode_unlock(inode);
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
	return -ENXIO;
}

static loff_t f2fs_llseek(struct file *file, loff_t offset, int whence)
{
	struct inode *inode = file->f_mapping->host;
	loff_t maxbytes = inode->i_sb->s_maxbytes;

	switch (whence) {
	case SEEK_SET:
	case SEEK_CUR:
	case SEEK_END:
		return generic_file_llseek_size(file, offset, whence,
						maxbytes, i_size_read(inode));
	case SEEK_DATA:
	case SEEK_HOLE:
507 508
		if (offset < 0)
			return -ENXIO;
509 510 511 512 513 514
		return f2fs_seek_block(file, offset, whence);
	}

	return -EINVAL;
}

J
Jaegeuk Kim 已提交
515 516
static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
{
517
	struct inode *inode = file_inode(file);
518
	int err;
519

520 521 522
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

C
Chao Yu 已提交
523 524 525
	if (!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;

526
	/* we don't need to use inline_data strictly */
527 528 529
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
530

J
Jaegeuk Kim 已提交
531 532
	file_accessed(file);
	vma->vm_ops = &f2fs_file_vm_ops;
C
Chao Yu 已提交
533
	set_inode_flag(inode, FI_MMAP_FILE);
J
Jaegeuk Kim 已提交
534 535 536
	return 0;
}

537 538
static int f2fs_file_open(struct inode *inode, struct file *filp)
{
539
	int err = fscrypt_file_open(inode, filp);
540

E
Eric Biggers 已提交
541 542 543
	if (err)
		return err;

C
Chao Yu 已提交
544 545 546
	if (!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;

E
Eric Biggers 已提交
547
	err = fsverity_file_open(inode, filp);
548 549
	if (err)
		return err;
H
Hyunchul Lee 已提交
550 551 552

	filp->f_mode |= FMODE_NOWAIT;

C
Chao Yu 已提交
553
	return dquot_file_open(inode, filp);
554 555
}

C
Chao Yu 已提交
556
void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count)
J
Jaegeuk Kim 已提交
557
{
558
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
J
Jaegeuk Kim 已提交
559
	struct f2fs_node *raw_node;
C
Chao Yu 已提交
560
	int nr_free = 0, ofs = dn->ofs_in_node, len = count;
J
Jaegeuk Kim 已提交
561
	__le32 *addr;
562
	int base = 0;
C
Chao Yu 已提交
563 564 565
	bool compressed_cluster = false;
	int cluster_index = 0, valid_blocks = 0;
	int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
566 567 568

	if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
		base = get_extra_isize(dn->inode);
J
Jaegeuk Kim 已提交
569

570
	raw_node = F2FS_NODE(dn->node_page);
571
	addr = blkaddr_in_node(raw_node) + base + ofs;
J
Jaegeuk Kim 已提交
572

C
Chao Yu 已提交
573 574
	/* Assumption: truncateion starts with cluster */
	for (; count > 0; count--, addr++, dn->ofs_in_node++, cluster_index++) {
J
Jaegeuk Kim 已提交
575
		block_t blkaddr = le32_to_cpu(*addr);
576

C
Chao Yu 已提交
577 578 579 580 581 582 583 584 585
		if (f2fs_compressed_file(dn->inode) &&
					!(cluster_index & (cluster_size - 1))) {
			if (compressed_cluster)
				f2fs_i_compr_blocks_update(dn->inode,
							valid_blocks, false);
			compressed_cluster = (blkaddr == COMPRESS_ADDR);
			valid_blocks = 0;
		}

J
Jaegeuk Kim 已提交
586 587 588
		if (blkaddr == NULL_ADDR)
			continue;

J
Jaegeuk Kim 已提交
589
		dn->data_blkaddr = NULL_ADDR;
C
Chao Yu 已提交
590
		f2fs_set_data_blkaddr(dn);
591

C
Chao Yu 已提交
592 593
		if (__is_valid_data_blkaddr(blkaddr)) {
			if (!f2fs_is_valid_blkaddr(sbi, blkaddr,
C
Chao Yu 已提交
594
					DATA_GENERIC_ENHANCE))
C
Chao Yu 已提交
595 596 597 598
				continue;
			if (compressed_cluster)
				valid_blocks++;
		}
599

600
		if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
601
			clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
C
Chao Yu 已提交
602 603

		f2fs_invalidate_blocks(sbi, blkaddr);
J
Jaegeuk Kim 已提交
604 605
		nr_free++;
	}
C
Chao Yu 已提交
606

C
Chao Yu 已提交
607 608 609
	if (compressed_cluster)
		f2fs_i_compr_blocks_update(dn->inode, valid_blocks, false);

J
Jaegeuk Kim 已提交
610
	if (nr_free) {
C
Chao Yu 已提交
611 612 613 614 615
		pgoff_t fofs;
		/*
		 * once we invalidate valid blkaddr in range [ofs, ofs + count],
		 * we will invalidate all blkaddr in the whole range.
		 */
C
Chao Yu 已提交
616
		fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page),
617
							dn->inode) + ofs;
C
Chao Yu 已提交
618
		f2fs_update_extent_cache_range(dn, fofs, 0, len);
619
		dec_valid_block_count(sbi, dn->inode, nr_free);
J
Jaegeuk Kim 已提交
620 621
	}
	dn->ofs_in_node = ofs;
622

623
	f2fs_update_time(sbi, REQ_TIME);
624 625
	trace_f2fs_truncate_data_blocks_range(dn->inode, dn->nid,
					 dn->ofs_in_node, nr_free);
J
Jaegeuk Kim 已提交
626 627
}

C
Chao Yu 已提交
628
void f2fs_truncate_data_blocks(struct dnode_of_data *dn)
J
Jaegeuk Kim 已提交
629
{
630
	f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK(dn->inode));
J
Jaegeuk Kim 已提交
631 632
}

633
static int truncate_partial_data_page(struct inode *inode, u64 from,
634
								bool cache_only)
J
Jaegeuk Kim 已提交
635
{
636
	loff_t offset = from & (PAGE_SIZE - 1);
637
	pgoff_t index = from >> PAGE_SHIFT;
638
	struct address_space *mapping = inode->i_mapping;
J
Jaegeuk Kim 已提交
639 640
	struct page *page;

641
	if (!offset && !cache_only)
642
		return 0;
J
Jaegeuk Kim 已提交
643

644
	if (cache_only) {
645
		page = find_lock_page(mapping, index);
646 647 648
		if (page && PageUptodate(page))
			goto truncate_out;
		f2fs_put_page(page, 1);
649
		return 0;
650
	}
J
Jaegeuk Kim 已提交
651

C
Chao Yu 已提交
652
	page = f2fs_get_lock_data_page(inode, index, true);
653
	if (IS_ERR(page))
654
		return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
655
truncate_out:
656
	f2fs_wait_on_page_writeback(page, DATA, true, true);
657
	zero_user(page, offset, PAGE_SIZE - offset);
658 659

	/* An encrypted inode should have a key and truncate the last page. */
660
	f2fs_bug_on(F2FS_I_SB(inode), cache_only && IS_ENCRYPTED(inode));
661
	if (!cache_only)
662
		set_page_dirty(page);
J
Jaegeuk Kim 已提交
663
	f2fs_put_page(page, 1);
664
	return 0;
J
Jaegeuk Kim 已提交
665 666
}

667
int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock)
J
Jaegeuk Kim 已提交
668
{
669
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
670 671
	struct dnode_of_data dn;
	pgoff_t free_from;
H
Huajun Li 已提交
672
	int count = 0, err = 0;
673
	struct page *ipage;
674
	bool truncate_page = false;
J
Jaegeuk Kim 已提交
675

676 677
	trace_f2fs_truncate_blocks_enter(inode, from);

C
Chao Yu 已提交
678
	free_from = (pgoff_t)F2FS_BLK_ALIGN(from);
J
Jaegeuk Kim 已提交
679

680 681 682
	if (free_from >= sbi->max_file_blocks)
		goto free_partial;

683
	if (lock)
684
		f2fs_lock_op(sbi);
H
Huajun Li 已提交
685

C
Chao Yu 已提交
686
	ipage = f2fs_get_node_page(sbi, inode->i_ino);
687 688 689 690 691 692
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto out;
	}

	if (f2fs_has_inline_data(inode)) {
C
Chao Yu 已提交
693
		f2fs_truncate_inline_inode(inode, ipage, from);
694
		f2fs_put_page(ipage, 1);
695
		truncate_page = true;
696 697 698 699
		goto out;
	}

	set_new_dnode(&dn, inode, ipage, NULL, 0);
C
Chao Yu 已提交
700
	err = f2fs_get_dnode_of_data(&dn, free_from, LOOKUP_NODE_RA);
J
Jaegeuk Kim 已提交
701 702 703
	if (err) {
		if (err == -ENOENT)
			goto free_next;
704
		goto out;
705 706
	}

707
	count = ADDRS_PER_PAGE(dn.node_page, inode);
J
Jaegeuk Kim 已提交
708 709

	count -= dn.ofs_in_node;
710
	f2fs_bug_on(sbi, count < 0);
711

J
Jaegeuk Kim 已提交
712
	if (dn.ofs_in_node || IS_INODE(dn.node_page)) {
C
Chao Yu 已提交
713
		f2fs_truncate_data_blocks_range(&dn, count);
J
Jaegeuk Kim 已提交
714 715 716 717 718
		free_from += count;
	}

	f2fs_put_dnode(&dn);
free_next:
C
Chao Yu 已提交
719
	err = f2fs_truncate_inode_blocks(inode, free_from);
720 721
out:
	if (lock)
722
		f2fs_unlock_op(sbi);
723
free_partial:
724 725
	/* lastly zero out the first data page */
	if (!err)
726
		err = truncate_partial_data_page(inode, from, truncate_page);
J
Jaegeuk Kim 已提交
727

728
	trace_f2fs_truncate_blocks_exit(inode, err);
J
Jaegeuk Kim 已提交
729 730 731
	return err;
}

C
Chao Yu 已提交
732 733 734
int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock)
{
	u64 free_from = from;
735
	int err;
C
Chao Yu 已提交
736

737
#ifdef CONFIG_F2FS_FS_COMPRESSION
C
Chao Yu 已提交
738 739 740 741 742 743 744 745 746 747 748 749 750 751
	/*
	 * for compressed file, only support cluster size
	 * aligned truncation.
	 */
	if (f2fs_compressed_file(inode)) {
		size_t cluster_shift = PAGE_SHIFT +
					F2FS_I(inode)->i_log_cluster_size;
		size_t cluster_mask = (1 << cluster_shift) - 1;

		free_from = from >> cluster_shift;
		if (from & cluster_mask)
			free_from++;
		free_from <<= cluster_shift;
	}
752 753 754 755 756 757 758 759 760 761
#endif

	err = f2fs_do_truncate_blocks(inode, free_from, lock);
	if (err)
		return err;

#ifdef CONFIG_F2FS_FS_COMPRESSION
	if (from != free_from)
		err = f2fs_truncate_partial_cluster(inode, from, lock);
#endif
C
Chao Yu 已提交
762

763
	return err;
C
Chao Yu 已提交
764 765
}

766
int f2fs_truncate(struct inode *inode)
J
Jaegeuk Kim 已提交
767
{
768 769
	int err;

770 771 772
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

J
Jaegeuk Kim 已提交
773 774
	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
				S_ISLNK(inode->i_mode)))
775
		return 0;
J
Jaegeuk Kim 已提交
776

777 778
	trace_f2fs_truncate(inode);

779
	if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
780
		f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_TRUNCATE);
781 782
		return -EIO;
	}
783

784
	/* we should check inline_data size */
785
	if (!f2fs_may_inline_data(inode)) {
786 787 788
		err = f2fs_convert_inline_inode(inode);
		if (err)
			return err;
789 790
	}

791
	err = f2fs_truncate_blocks(inode, i_size_read(inode), true);
792 793 794
	if (err)
		return err;

795
	inode->i_mtime = inode->i_ctime = current_time(inode);
796
	f2fs_mark_inode_dirty_sync(inode, false);
797
	return 0;
J
Jaegeuk Kim 已提交
798 799
}

800
int f2fs_getattr(const struct path *path, struct kstat *stat,
C
Chao Yu 已提交
801
		 u32 request_mask, unsigned int query_flags)
J
Jaegeuk Kim 已提交
802
{
803
	struct inode *inode = d_inode(path->dentry);
C
Chao Yu 已提交
804
	struct f2fs_inode_info *fi = F2FS_I(inode);
C
Chao Yu 已提交
805
	struct f2fs_inode *ri;
C
Chao Yu 已提交
806 807
	unsigned int flags;

C
Chao Yu 已提交
808
	if (f2fs_has_extra_attr(inode) &&
809
			f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)) &&
C
Chao Yu 已提交
810 811 812 813 814 815
			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
		stat->result_mask |= STATX_BTIME;
		stat->btime.tv_sec = fi->i_crtime.tv_sec;
		stat->btime.tv_nsec = fi->i_crtime.tv_nsec;
	}

816
	flags = fi->i_flags;
C
Chao Yu 已提交
817 818
	if (flags & F2FS_COMPR_FL)
		stat->attributes |= STATX_ATTR_COMPRESSED;
819
	if (flags & F2FS_APPEND_FL)
C
Chao Yu 已提交
820
		stat->attributes |= STATX_ATTR_APPEND;
821
	if (IS_ENCRYPTED(inode))
C
Chao Yu 已提交
822
		stat->attributes |= STATX_ATTR_ENCRYPTED;
823
	if (flags & F2FS_IMMUTABLE_FL)
C
Chao Yu 已提交
824
		stat->attributes |= STATX_ATTR_IMMUTABLE;
825
	if (flags & F2FS_NODUMP_FL)
C
Chao Yu 已提交
826
		stat->attributes |= STATX_ATTR_NODUMP;
E
Eric Biggers 已提交
827 828
	if (IS_VERITY(inode))
		stat->attributes |= STATX_ATTR_VERITY;
C
Chao Yu 已提交
829

C
Chao Yu 已提交
830 831
	stat->attributes_mask |= (STATX_ATTR_COMPRESSED |
				  STATX_ATTR_APPEND |
C
Chao Yu 已提交
832 833
				  STATX_ATTR_ENCRYPTED |
				  STATX_ATTR_IMMUTABLE |
E
Eric Biggers 已提交
834 835
				  STATX_ATTR_NODUMP |
				  STATX_ATTR_VERITY);
C
Chao Yu 已提交
836

J
Jaegeuk Kim 已提交
837
	generic_fillattr(inode, stat);
838 839 840 841 842 843

	/* we need to show initial sectors used for inline_data/dentries */
	if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) ||
					f2fs_has_inline_dentry(inode))
		stat->blocks += (stat->size + 511) >> 9;

J
Jaegeuk Kim 已提交
844 845 846 847 848 849 850 851 852 853 854 855
	return 0;
}

#ifdef CONFIG_F2FS_FS_POSIX_ACL
static void __setattr_copy(struct inode *inode, const struct iattr *attr)
{
	unsigned int ia_valid = attr->ia_valid;

	if (ia_valid & ATTR_UID)
		inode->i_uid = attr->ia_uid;
	if (ia_valid & ATTR_GID)
		inode->i_gid = attr->ia_gid;
856 857 858 859 860 861
	if (ia_valid & ATTR_ATIME)
		inode->i_atime = attr->ia_atime;
	if (ia_valid & ATTR_MTIME)
		inode->i_mtime = attr->ia_mtime;
	if (ia_valid & ATTR_CTIME)
		inode->i_ctime = attr->ia_ctime;
J
Jaegeuk Kim 已提交
862 863 864 865 866
	if (ia_valid & ATTR_MODE) {
		umode_t mode = attr->ia_mode;

		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
			mode &= ~S_ISGID;
867
		set_acl_inode(inode, mode);
J
Jaegeuk Kim 已提交
868 869 870 871 872 873 874 875
	}
}
#else
#define __setattr_copy setattr_copy
#endif

int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
{
876
	struct inode *inode = d_inode(dentry);
J
Jaegeuk Kim 已提交
877 878
	int err;

879 880 881
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

C
Chao Yu 已提交
882 883 884 885
	if ((attr->ia_valid & ATTR_SIZE) &&
		!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;

886
	err = setattr_prepare(dentry, attr);
J
Jaegeuk Kim 已提交
887 888 889
	if (err)
		return err;

890 891 892 893
	err = fscrypt_prepare_setattr(dentry, attr);
	if (err)
		return err;

E
Eric Biggers 已提交
894 895 896 897
	err = fsverity_prepare_setattr(dentry, attr);
	if (err)
		return err;

C
Chao Yu 已提交
898 899 900 901 902 903 904 905 906
	if (is_quota_modification(inode, attr)) {
		err = dquot_initialize(inode);
		if (err)
			return err;
	}
	if ((attr->ia_valid & ATTR_UID &&
		!uid_eq(attr->ia_uid, inode->i_uid)) ||
		(attr->ia_valid & ATTR_GID &&
		!gid_eq(attr->ia_gid, inode->i_gid))) {
907
		f2fs_lock_op(F2FS_I_SB(inode));
C
Chao Yu 已提交
908
		err = dquot_transfer(inode, attr);
909 910 911 912
		if (err) {
			set_sbi_flag(F2FS_I_SB(inode),
					SBI_QUOTA_NEED_REPAIR);
			f2fs_unlock_op(F2FS_I_SB(inode));
C
Chao Yu 已提交
913
			return err;
914 915 916 917 918 919 920 921 922 923 924
		}
		/*
		 * update uid/gid under lock_op(), so that dquot and inode can
		 * be updated atomically.
		 */
		if (attr->ia_valid & ATTR_UID)
			inode->i_uid = attr->ia_uid;
		if (attr->ia_valid & ATTR_GID)
			inode->i_gid = attr->ia_gid;
		f2fs_mark_inode_dirty_sync(inode, true);
		f2fs_unlock_op(F2FS_I_SB(inode));
C
Chao Yu 已提交
925 926
	}

927
	if (attr->ia_valid & ATTR_SIZE) {
928 929 930 931 932 933 934 935 936 937 938
		loff_t old_size = i_size_read(inode);

		if (attr->ia_size > MAX_INLINE_DATA(inode)) {
			/*
			 * should convert inline inode before i_size_write to
			 * keep smaller than inline_data size with inline flag.
			 */
			err = f2fs_convert_inline_inode(inode);
			if (err)
				return err;
		}
939 940

		down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
941
		down_write(&F2FS_I(inode)->i_mmap_sem);
942 943 944

		truncate_setsize(inode, attr->ia_size);

945
		if (attr->ia_size <= old_size)
946
			err = f2fs_truncate(inode);
947 948 949 950 951
		/*
		 * do not trim all blocks after i_size if target size is
		 * larger than i_size.
		 */
		up_write(&F2FS_I(inode)->i_mmap_sem);
952
		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
953 954
		if (err)
			return err;
955

956
		spin_lock(&F2FS_I(inode)->i_size_lock);
957
		inode->i_mtime = inode->i_ctime = current_time(inode);
958
		F2FS_I(inode)->last_disk_size = i_size_read(inode);
959
		spin_unlock(&F2FS_I(inode)->i_size_lock);
J
Jaegeuk Kim 已提交
960 961 962 963 964
	}

	__setattr_copy(inode, attr);

	if (attr->ia_valid & ATTR_MODE) {
C
Chao Yu 已提交
965
		err = posix_acl_chmod(inode, f2fs_get_inode_mode(inode));
966 967 968
		if (err || is_inode_flag_set(inode, FI_ACL_MODE)) {
			inode->i_mode = F2FS_I(inode)->i_acl_mode;
			clear_inode_flag(inode, FI_ACL_MODE);
J
Jaegeuk Kim 已提交
969 970 971
		}
	}

972
	/* file size may changed here */
973
	f2fs_mark_inode_dirty_sync(inode, true);
974 975 976 977

	/* inode change will produce dirty node pages flushed by checkpoint */
	f2fs_balance_fs(F2FS_I_SB(inode), true);

J
Jaegeuk Kim 已提交
978 979 980 981 982 983 984
	return err;
}

const struct inode_operations f2fs_file_inode_operations = {
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
985
	.set_acl	= f2fs_set_acl,
J
Jaegeuk Kim 已提交
986 987 988
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
J
Jaegeuk Kim 已提交
989
	.fiemap		= f2fs_fiemap,
J
Jaegeuk Kim 已提交
990 991
};

C
Chao Yu 已提交
992
static int fill_zero(struct inode *inode, pgoff_t index,
J
Jaegeuk Kim 已提交
993 994
					loff_t start, loff_t len)
{
995
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
996 997 998
	struct page *page;

	if (!len)
C
Chao Yu 已提交
999
		return 0;
J
Jaegeuk Kim 已提交
1000

J
Jaegeuk Kim 已提交
1001
	f2fs_balance_fs(sbi, true);
1002

1003
	f2fs_lock_op(sbi);
C
Chao Yu 已提交
1004
	page = f2fs_get_new_data_page(inode, NULL, index, false);
1005
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
1006

C
Chao Yu 已提交
1007 1008 1009
	if (IS_ERR(page))
		return PTR_ERR(page);

1010
	f2fs_wait_on_page_writeback(page, DATA, true, true);
C
Chao Yu 已提交
1011 1012 1013 1014
	zero_user(page, start, len);
	set_page_dirty(page);
	f2fs_put_page(page, 1);
	return 0;
J
Jaegeuk Kim 已提交
1015 1016
}

C
Chao Yu 已提交
1017
int f2fs_truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end)
J
Jaegeuk Kim 已提交
1018 1019 1020
{
	int err;

1021
	while (pg_start < pg_end) {
J
Jaegeuk Kim 已提交
1022
		struct dnode_of_data dn;
1023
		pgoff_t end_offset, count;
1024

J
Jaegeuk Kim 已提交
1025
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1026
		err = f2fs_get_dnode_of_data(&dn, pg_start, LOOKUP_NODE);
J
Jaegeuk Kim 已提交
1027
		if (err) {
1028
			if (err == -ENOENT) {
C
Chao Yu 已提交
1029 1030
				pg_start = f2fs_get_next_page_offset(&dn,
								pg_start);
J
Jaegeuk Kim 已提交
1031
				continue;
1032
			}
J
Jaegeuk Kim 已提交
1033 1034 1035
			return err;
		}

1036
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
1037 1038 1039 1040
		count = min(end_offset - dn.ofs_in_node, pg_end - pg_start);

		f2fs_bug_on(F2FS_I_SB(inode), count == 0 || count > end_offset);

C
Chao Yu 已提交
1041
		f2fs_truncate_data_blocks_range(&dn, count);
J
Jaegeuk Kim 已提交
1042
		f2fs_put_dnode(&dn);
1043 1044

		pg_start += count;
J
Jaegeuk Kim 已提交
1045 1046 1047 1048
	}
	return 0;
}

C
Chao Yu 已提交
1049
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
J
Jaegeuk Kim 已提交
1050 1051 1052
{
	pgoff_t pg_start, pg_end;
	loff_t off_start, off_end;
1053
	int ret;
J
Jaegeuk Kim 已提交
1054

1055 1056 1057
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
H
Huajun Li 已提交
1058

1059 1060
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
J
Jaegeuk Kim 已提交
1061

1062 1063
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
1064 1065

	if (pg_start == pg_end) {
C
Chao Yu 已提交
1066
		ret = fill_zero(inode, pg_start, off_start,
J
Jaegeuk Kim 已提交
1067
						off_end - off_start);
C
Chao Yu 已提交
1068 1069
		if (ret)
			return ret;
J
Jaegeuk Kim 已提交
1070
	} else {
C
Chao Yu 已提交
1071 1072
		if (off_start) {
			ret = fill_zero(inode, pg_start++, off_start,
1073
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
1074 1075 1076 1077 1078 1079 1080 1081
			if (ret)
				return ret;
		}
		if (off_end) {
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				return ret;
		}
J
Jaegeuk Kim 已提交
1082 1083 1084 1085

		if (pg_start < pg_end) {
			struct address_space *mapping = inode->i_mapping;
			loff_t blk_start, blk_end;
1086
			struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1087

J
Jaegeuk Kim 已提交
1088
			f2fs_balance_fs(sbi, true);
J
Jaegeuk Kim 已提交
1089

1090 1091
			blk_start = (loff_t)pg_start << PAGE_SHIFT;
			blk_end = (loff_t)pg_end << PAGE_SHIFT;
1092 1093

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

J
Jaegeuk Kim 已提交
1096 1097
			truncate_inode_pages_range(mapping, blk_start,
					blk_end - 1);
1098

1099
			f2fs_lock_op(sbi);
C
Chao Yu 已提交
1100
			ret = f2fs_truncate_hole(inode, pg_start, pg_end);
1101
			f2fs_unlock_op(sbi);
1102

1103
			up_write(&F2FS_I(inode)->i_mmap_sem);
1104
			up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
J
Jaegeuk Kim 已提交
1105 1106 1107 1108 1109 1110
		}
	}

	return ret;
}

1111 1112
static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
				int *do_replace, pgoff_t off, pgoff_t len)
C
Chao Yu 已提交
1113 1114 1115
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct dnode_of_data dn;
1116
	int ret, done, i;
1117

1118
next_dnode:
1119
	set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1120
	ret = f2fs_get_dnode_of_data(&dn, off, LOOKUP_NODE_RA);
1121 1122 1123
	if (ret && ret != -ENOENT) {
		return ret;
	} else if (ret == -ENOENT) {
1124 1125
		if (dn.max_level == 0)
			return -ENOENT;
C
Chao Yu 已提交
1126 1127
		done = min((pgoff_t)ADDRS_PER_BLOCK(inode) -
						dn.ofs_in_node, len);
1128 1129 1130 1131 1132 1133 1134 1135
		blkaddr += done;
		do_replace += done;
		goto next;
	}

	done = min((pgoff_t)ADDRS_PER_PAGE(dn.node_page, inode) -
							dn.ofs_in_node, len);
	for (i = 0; i < done; i++, blkaddr++, do_replace++, dn.ofs_in_node++) {
1136
		*blkaddr = f2fs_data_blkaddr(&dn);
C
Chao Yu 已提交
1137 1138 1139 1140 1141

		if (__is_valid_data_blkaddr(*blkaddr) &&
			!f2fs_is_valid_blkaddr(sbi, *blkaddr,
					DATA_GENERIC_ENHANCE)) {
			f2fs_put_dnode(&dn);
1142
			return -EFSCORRUPTED;
C
Chao Yu 已提交
1143 1144
		}

C
Chao Yu 已提交
1145
		if (!f2fs_is_checkpointed_data(sbi, *blkaddr)) {
1146

1147
			if (f2fs_lfs_mode(sbi)) {
1148
				f2fs_put_dnode(&dn);
1149
				return -EOPNOTSUPP;
1150 1151
			}

1152
			/* do not invalidate this block address */
1153
			f2fs_update_data_blkaddr(&dn, NULL_ADDR);
1154
			*do_replace = 1;
C
Chao Yu 已提交
1155
		}
1156
	}
1157 1158 1159 1160 1161 1162 1163 1164
	f2fs_put_dnode(&dn);
next:
	len -= done;
	off += done;
	if (len)
		goto next_dnode;
	return 0;
}
C
Chao Yu 已提交
1165

1166 1167 1168 1169 1170 1171
static int __roll_back_blkaddrs(struct inode *inode, block_t *blkaddr,
				int *do_replace, pgoff_t off, int len)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct dnode_of_data dn;
	int ret, i;
C
Chao Yu 已提交
1172

1173 1174 1175
	for (i = 0; i < len; i++, do_replace++, blkaddr++) {
		if (*do_replace == 0)
			continue;
C
Chao Yu 已提交
1176

1177
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1178
		ret = f2fs_get_dnode_of_data(&dn, off + i, LOOKUP_NODE_RA);
1179 1180
		if (ret) {
			dec_valid_block_count(sbi, inode, 1);
C
Chao Yu 已提交
1181
			f2fs_invalidate_blocks(sbi, *blkaddr);
1182 1183
		} else {
			f2fs_update_data_blkaddr(&dn, *blkaddr);
1184
		}
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
		f2fs_put_dnode(&dn);
	}
	return 0;
}

static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
			block_t *blkaddr, int *do_replace,
			pgoff_t src, pgoff_t dst, pgoff_t len, bool full)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(src_inode);
	pgoff_t i = 0;
	int ret;
1197

1198 1199 1200 1201
	while (i < len) {
		if (blkaddr[i] == NULL_ADDR && !full) {
			i++;
			continue;
1202
		}
C
Chao Yu 已提交
1203

1204 1205 1206 1207 1208
		if (do_replace[i] || blkaddr[i] == NULL_ADDR) {
			struct dnode_of_data dn;
			struct node_info ni;
			size_t new_size;
			pgoff_t ilen;
C
Chao Yu 已提交
1209

1210
			set_new_dnode(&dn, dst_inode, NULL, NULL, 0);
C
Chao Yu 已提交
1211
			ret = f2fs_get_dnode_of_data(&dn, dst + i, ALLOC_NODE);
1212 1213
			if (ret)
				return ret;
C
Chao Yu 已提交
1214

1215 1216 1217 1218 1219 1220
			ret = f2fs_get_node_info(sbi, dn.nid, &ni);
			if (ret) {
				f2fs_put_dnode(&dn);
				return ret;
			}

1221 1222 1223 1224
			ilen = min((pgoff_t)
				ADDRS_PER_PAGE(dn.node_page, dst_inode) -
						dn.ofs_in_node, len - i);
			do {
1225
				dn.data_blkaddr = f2fs_data_blkaddr(&dn);
C
Chao Yu 已提交
1226
				f2fs_truncate_data_blocks_range(&dn, 1);
1227 1228 1229

				if (do_replace[i]) {
					f2fs_i_blocks_write(src_inode,
C
Chao Yu 已提交
1230
							1, false, false);
1231
					f2fs_i_blocks_write(dst_inode,
C
Chao Yu 已提交
1232
							1, true, false);
1233 1234 1235 1236 1237 1238 1239
					f2fs_replace_block(sbi, &dn, dn.data_blkaddr,
					blkaddr[i], ni.version, true, false);

					do_replace[i] = 0;
				}
				dn.ofs_in_node++;
				i++;
C
Chao Yu 已提交
1240
				new_size = (loff_t)(dst + i) << PAGE_SHIFT;
1241 1242
				if (dst_inode->i_size < new_size)
					f2fs_i_size_write(dst_inode, new_size);
1243
			} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
1244

1245 1246 1247 1248
			f2fs_put_dnode(&dn);
		} else {
			struct page *psrc, *pdst;

C
Chao Yu 已提交
1249 1250
			psrc = f2fs_get_lock_data_page(src_inode,
							src + i, true);
1251 1252
			if (IS_ERR(psrc))
				return PTR_ERR(psrc);
C
Chao Yu 已提交
1253
			pdst = f2fs_get_new_data_page(dst_inode, NULL, dst + i,
1254 1255 1256 1257 1258 1259 1260 1261
								true);
			if (IS_ERR(pdst)) {
				f2fs_put_page(psrc, 1);
				return PTR_ERR(pdst);
			}
			f2fs_copy_page(psrc, pdst);
			set_page_dirty(pdst);
			f2fs_put_page(pdst, 1);
1262
			f2fs_put_page(psrc, 1);
C
Chao Yu 已提交
1263

C
Chao Yu 已提交
1264 1265
			ret = f2fs_truncate_hole(src_inode,
						src + i, src + i + 1);
1266 1267 1268 1269
			if (ret)
				return ret;
			i++;
		}
1270 1271
	}
	return 0;
1272
}
C
Chao Yu 已提交
1273

1274 1275
static int __exchange_data_block(struct inode *src_inode,
			struct inode *dst_inode, pgoff_t src, pgoff_t dst,
1276
			pgoff_t len, bool full)
1277 1278 1279
{
	block_t *src_blkaddr;
	int *do_replace;
1280
	pgoff_t olen;
1281 1282
	int ret;

1283
	while (len) {
1284
		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK(src_inode), len);
1285

C
Chao Yu 已提交
1286
		src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode),
1287
					array_size(olen, sizeof(block_t)),
1288
					GFP_NOFS);
1289 1290
		if (!src_blkaddr)
			return -ENOMEM;
1291

C
Chao Yu 已提交
1292
		do_replace = f2fs_kvzalloc(F2FS_I_SB(src_inode),
1293
					array_size(olen, sizeof(int)),
1294
					GFP_NOFS);
1295 1296 1297 1298
		if (!do_replace) {
			kvfree(src_blkaddr);
			return -ENOMEM;
		}
1299

1300 1301 1302 1303
		ret = __read_out_blkaddrs(src_inode, src_blkaddr,
					do_replace, src, olen);
		if (ret)
			goto roll_back;
1304

1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
		ret = __clone_blkaddrs(src_inode, dst_inode, src_blkaddr,
					do_replace, src, dst, olen, full);
		if (ret)
			goto roll_back;

		src += olen;
		dst += olen;
		len -= olen;

		kvfree(src_blkaddr);
		kvfree(do_replace);
	}
1317 1318 1319
	return 0;

roll_back:
1320
	__roll_back_blkaddrs(src_inode, src_blkaddr, do_replace, src, olen);
1321 1322
	kvfree(src_blkaddr);
	kvfree(do_replace);
1323 1324
	return ret;
}
C
Chao Yu 已提交
1325

1326
static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
1327 1328
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1329
	pgoff_t nrpages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1330 1331
	pgoff_t start = offset >> PAGE_SHIFT;
	pgoff_t end = (offset + len) >> PAGE_SHIFT;
1332
	int ret;
1333

1334
	f2fs_balance_fs(sbi, true);
1335

1336 1337 1338
	/* avoid gc operation during block exchange */
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
	down_write(&F2FS_I(inode)->i_mmap_sem);
1339

1340 1341 1342
	f2fs_lock_op(sbi);
	f2fs_drop_extent_tree(inode);
	truncate_pagecache(inode, offset);
1343 1344
	ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
	f2fs_unlock_op(sbi);
1345 1346 1347

	up_write(&F2FS_I(inode)->i_mmap_sem);
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
C
Chao Yu 已提交
1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362
	return ret;
}

static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
{
	loff_t new_size;
	int ret;

	if (offset + len >= i_size_read(inode))
		return -EINVAL;

	/* collapse range should be aligned to block size of f2fs. */
	if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1))
		return -EINVAL;

1363 1364 1365
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1366

C
Chao Yu 已提交
1367 1368 1369
	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1370
		return ret;
C
Chao Yu 已提交
1371

1372
	ret = f2fs_do_collapse(inode, offset, len);
C
Chao Yu 已提交
1373
	if (ret)
1374
		return ret;
C
Chao Yu 已提交
1375

1376
	/* write out all moved pages, if possible */
1377
	down_write(&F2FS_I(inode)->i_mmap_sem);
1378 1379 1380
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);

C
Chao Yu 已提交
1381
	new_size = i_size_read(inode) - len;
1382
	truncate_pagecache(inode, new_size);
C
Chao Yu 已提交
1383

1384
	ret = f2fs_truncate_blocks(inode, new_size, true);
1385
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1386
	if (!ret)
1387
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1388 1389 1390
	return ret;
}

1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
static int f2fs_do_zero_range(struct dnode_of_data *dn, pgoff_t start,
								pgoff_t end)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
	pgoff_t index = start;
	unsigned int ofs_in_node = dn->ofs_in_node;
	blkcnt_t count = 0;
	int ret;

	for (; index < end; index++, dn->ofs_in_node++) {
1401
		if (f2fs_data_blkaddr(dn) == NULL_ADDR)
1402 1403 1404 1405
			count++;
	}

	dn->ofs_in_node = ofs_in_node;
C
Chao Yu 已提交
1406
	ret = f2fs_reserve_new_blocks(dn, count);
1407 1408 1409 1410 1411
	if (ret)
		return ret;

	dn->ofs_in_node = ofs_in_node;
	for (index = start; index < end; index++, dn->ofs_in_node++) {
1412
		dn->data_blkaddr = f2fs_data_blkaddr(dn);
1413
		/*
C
Chao Yu 已提交
1414
		 * f2fs_reserve_new_blocks will not guarantee entire block
1415 1416 1417 1418 1419 1420 1421
		 * allocation.
		 */
		if (dn->data_blkaddr == NULL_ADDR) {
			ret = -ENOSPC;
			break;
		}
		if (dn->data_blkaddr != NEW_ADDR) {
C
Chao Yu 已提交
1422
			f2fs_invalidate_blocks(sbi, dn->data_blkaddr);
1423
			dn->data_blkaddr = NEW_ADDR;
C
Chao Yu 已提交
1424
			f2fs_set_data_blkaddr(dn);
1425 1426 1427 1428 1429 1430 1431 1432
		}
	}

	f2fs_update_extent_cache_range(dn, start, 0, index - start);

	return ret;
}

C
Chao Yu 已提交
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
								int mode)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct address_space *mapping = inode->i_mapping;
	pgoff_t index, pg_start, pg_end;
	loff_t new_size = i_size_read(inode);
	loff_t off_start, off_end;
	int ret = 0;

	ret = inode_newsize_ok(inode, (len + offset));
	if (ret)
		return ret;

1447 1448 1449
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
C
Chao Yu 已提交
1450 1451 1452

	ret = filemap_write_and_wait_range(mapping, offset, offset + len - 1);
	if (ret)
1453
		return ret;
C
Chao Yu 已提交
1454

1455 1456
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1457

1458 1459
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
C
Chao Yu 已提交
1460 1461

	if (pg_start == pg_end) {
C
Chao Yu 已提交
1462 1463 1464
		ret = fill_zero(inode, pg_start, off_start,
						off_end - off_start);
		if (ret)
1465
			return ret;
C
Chao Yu 已提交
1466

C
Chao Yu 已提交
1467 1468 1469
		new_size = max_t(loff_t, new_size, offset + len);
	} else {
		if (off_start) {
C
Chao Yu 已提交
1470
			ret = fill_zero(inode, pg_start++, off_start,
1471
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
1472
			if (ret)
1473
				return ret;
C
Chao Yu 已提交
1474

C
Chao Yu 已提交
1475
			new_size = max_t(loff_t, new_size,
1476
					(loff_t)pg_start << PAGE_SHIFT);
C
Chao Yu 已提交
1477 1478
		}

1479
		for (index = pg_start; index < pg_end;) {
C
Chao Yu 已提交
1480
			struct dnode_of_data dn;
1481 1482
			unsigned int end_offset;
			pgoff_t end;
C
Chao Yu 已提交
1483

1484
			down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1485
			down_write(&F2FS_I(inode)->i_mmap_sem);
1486 1487 1488 1489 1490

			truncate_pagecache_range(inode,
				(loff_t)index << PAGE_SHIFT,
				((loff_t)pg_end << PAGE_SHIFT) - 1);

C
Chao Yu 已提交
1491 1492
			f2fs_lock_op(sbi);

1493
			set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1494
			ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE);
C
Chao Yu 已提交
1495 1496
			if (ret) {
				f2fs_unlock_op(sbi);
1497
				up_write(&F2FS_I(inode)->i_mmap_sem);
1498
				up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
C
Chao Yu 已提交
1499 1500 1501
				goto out;
			}

1502 1503 1504 1505
			end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
			end = min(pg_end, end_offset - dn.ofs_in_node + index);

			ret = f2fs_do_zero_range(&dn, index, end);
C
Chao Yu 已提交
1506
			f2fs_put_dnode(&dn);
1507

C
Chao Yu 已提交
1508
			f2fs_unlock_op(sbi);
1509
			up_write(&F2FS_I(inode)->i_mmap_sem);
1510
			up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1511 1512 1513

			f2fs_balance_fs(sbi, dn.node_changed);

1514 1515
			if (ret)
				goto out;
C
Chao Yu 已提交
1516

1517
			index = end;
C
Chao Yu 已提交
1518
			new_size = max_t(loff_t, new_size,
1519
					(loff_t)index << PAGE_SHIFT);
C
Chao Yu 已提交
1520 1521 1522
		}

		if (off_end) {
C
Chao Yu 已提交
1523 1524 1525 1526
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				goto out;

C
Chao Yu 已提交
1527 1528 1529 1530 1531
			new_size = max_t(loff_t, new_size, offset + len);
		}
	}

out:
1532 1533 1534 1535 1536 1537
	if (new_size > i_size_read(inode)) {
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
		else
			f2fs_i_size_write(inode, new_size);
	}
C
Chao Yu 已提交
1538 1539 1540
	return ret;
}

C
Chao Yu 已提交
1541 1542 1543
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1544
	pgoff_t nr, pg_start, pg_end, delta, idx;
C
Chao Yu 已提交
1545
	loff_t new_size;
1546
	int ret = 0;
C
Chao Yu 已提交
1547 1548

	new_size = i_size_read(inode) + len;
1549 1550 1551
	ret = inode_newsize_ok(inode, new_size);
	if (ret)
		return ret;
C
Chao Yu 已提交
1552 1553 1554 1555 1556 1557 1558 1559

	if (offset >= i_size_read(inode))
		return -EINVAL;

	/* insert range should be aligned to block size of f2fs. */
	if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1))
		return -EINVAL;

1560 1561 1562
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1563

J
Jaegeuk Kim 已提交
1564
	f2fs_balance_fs(sbi, true);
1565

1566
	down_write(&F2FS_I(inode)->i_mmap_sem);
1567
	ret = f2fs_truncate_blocks(inode, i_size_read(inode), true);
1568
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1569
	if (ret)
1570
		return ret;
C
Chao Yu 已提交
1571 1572 1573 1574

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1575
		return ret;
C
Chao Yu 已提交
1576

1577 1578
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1579
	delta = pg_end - pg_start;
1580
	idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1581

1582 1583 1584 1585 1586
	/* avoid gc operation during block exchange */
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
	down_write(&F2FS_I(inode)->i_mmap_sem);
	truncate_pagecache(inode, offset);

1587 1588 1589 1590 1591
	while (!ret && idx > pg_start) {
		nr = idx - pg_start;
		if (nr > delta)
			nr = delta;
		idx -= nr;
C
Chao Yu 已提交
1592 1593

		f2fs_lock_op(sbi);
1594 1595
		f2fs_drop_extent_tree(inode);

1596 1597
		ret = __exchange_data_block(inode, inode, idx,
					idx + delta, nr, false);
C
Chao Yu 已提交
1598 1599
		f2fs_unlock_op(sbi);
	}
1600 1601
	up_write(&F2FS_I(inode)->i_mmap_sem);
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
C
Chao Yu 已提交
1602

1603
	/* write out all moved pages, if possible */
1604
	down_write(&F2FS_I(inode)->i_mmap_sem);
1605 1606
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);
1607
	up_write(&F2FS_I(inode)->i_mmap_sem);
1608 1609

	if (!ret)
1610
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1611 1612 1613
	return ret;
}

J
Jaegeuk Kim 已提交
1614 1615 1616
static int expand_inode_data(struct inode *inode, loff_t offset,
					loff_t len, int mode)
{
1617
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1618
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL,
C
Chao Yu 已提交
1619 1620
			.m_next_extent = NULL, .m_seg_type = NO_CHECK_TYPE,
			.m_may_create = true };
1621
	pgoff_t pg_end;
J
Jaegeuk Kim 已提交
1622
	loff_t new_size = i_size_read(inode);
1623
	loff_t off_end;
1624
	int err;
J
Jaegeuk Kim 已提交
1625

1626 1627 1628
	err = inode_newsize_ok(inode, (len + offset));
	if (err)
		return err;
J
Jaegeuk Kim 已提交
1629

1630 1631 1632
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
1633

J
Jaegeuk Kim 已提交
1634
	f2fs_balance_fs(sbi, true);
1635

1636
	pg_end = ((unsigned long long)offset + len) >> PAGE_SHIFT;
1637
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
1638

1639 1640 1641 1642
	map.m_lblk = ((unsigned long long)offset) >> PAGE_SHIFT;
	map.m_len = pg_end - map.m_lblk;
	if (off_end)
		map.m_len++;
1643

J
Jaegeuk Kim 已提交
1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
	if (!map.m_len)
		return 0;

	if (f2fs_is_pinned_file(inode)) {
		block_t len = (map.m_len >> sbi->log_blocks_per_seg) <<
					sbi->log_blocks_per_seg;
		block_t done = 0;

		if (map.m_len % sbi->blocks_per_seg)
			len += sbi->blocks_per_seg;

		map.m_len = sbi->blocks_per_seg;
next_alloc:
		if (has_not_enough_free_secs(sbi, 0,
			GET_SEC_FROM_SEG(sbi, overprovision_segments(sbi)))) {
C
Chao Yu 已提交
1659
			down_write(&sbi->gc_lock);
J
Jaegeuk Kim 已提交
1660 1661 1662 1663 1664 1665 1666 1667 1668 1669
			err = f2fs_gc(sbi, true, false, NULL_SEGNO);
			if (err && err != -ENODATA && err != -EAGAIN)
				goto out_err;
		}

		down_write(&sbi->pin_sem);
		map.m_seg_type = CURSEG_COLD_DATA_PINNED;
		f2fs_allocate_new_segments(sbi, CURSEG_COLD_DATA);
		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
		up_write(&sbi->pin_sem);
1670

J
Jaegeuk Kim 已提交
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681
		done += map.m_len;
		len -= map.m_len;
		map.m_lblk += map.m_len;
		if (!err && len)
			goto next_alloc;

		map.m_len = done;
	} else {
		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
	}
out_err:
1682
	if (err) {
1683
		pgoff_t last_off;
J
Jaegeuk Kim 已提交
1684

1685
		if (!map.m_len)
1686
			return err;
1687

1688 1689 1690
		last_off = map.m_lblk + map.m_len - 1;

		/* update new size to the failed position */
1691
		new_size = (last_off == pg_end) ? offset + len :
1692 1693 1694
					(loff_t)(last_off + 1) << PAGE_SHIFT;
	} else {
		new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end;
J
Jaegeuk Kim 已提交
1695 1696
	}

1697 1698 1699 1700 1701 1702
	if (new_size > i_size_read(inode)) {
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
		else
			f2fs_i_size_write(inode, new_size);
	}
J
Jaegeuk Kim 已提交
1703

1704
	return err;
J
Jaegeuk Kim 已提交
1705 1706 1707 1708 1709
}

static long f2fs_fallocate(struct file *file, int mode,
				loff_t offset, loff_t len)
{
A
Al Viro 已提交
1710
	struct inode *inode = file_inode(file);
1711
	long ret = 0;
J
Jaegeuk Kim 已提交
1712

1713 1714
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;
1715 1716
	if (!f2fs_is_checkpoint_ready(F2FS_I_SB(inode)))
		return -ENOSPC;
C
Chao Yu 已提交
1717 1718
	if (!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;
1719

1720 1721 1722 1723
	/* f2fs only support ->fallocate for regular file */
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

1724
	if (IS_ENCRYPTED(inode) &&
C
Chao Yu 已提交
1725
		(mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))
1726 1727
		return -EOPNOTSUPP;

C
Chao Yu 已提交
1728 1729 1730 1731 1732
	if (f2fs_compressed_file(inode) &&
		(mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE |
			FALLOC_FL_ZERO_RANGE | FALLOC_FL_INSERT_RANGE)))
		return -EOPNOTSUPP;

C
Chao Yu 已提交
1733
	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
C
Chao Yu 已提交
1734 1735
			FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
			FALLOC_FL_INSERT_RANGE))
J
Jaegeuk Kim 已提交
1736 1737
		return -EOPNOTSUPP;

A
Al Viro 已提交
1738
	inode_lock(inode);
1739

1740 1741 1742 1743
	if (mode & FALLOC_FL_PUNCH_HOLE) {
		if (offset >= inode->i_size)
			goto out;

C
Chao Yu 已提交
1744
		ret = punch_hole(inode, offset, len);
C
Chao Yu 已提交
1745 1746
	} else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
		ret = f2fs_collapse_range(inode, offset, len);
C
Chao Yu 已提交
1747 1748
	} else if (mode & FALLOC_FL_ZERO_RANGE) {
		ret = f2fs_zero_range(inode, offset, len, mode);
C
Chao Yu 已提交
1749 1750
	} else if (mode & FALLOC_FL_INSERT_RANGE) {
		ret = f2fs_insert_range(inode, offset, len);
C
Chao Yu 已提交
1751
	} else {
J
Jaegeuk Kim 已提交
1752
		ret = expand_inode_data(inode, offset, len, mode);
C
Chao Yu 已提交
1753
	}
J
Jaegeuk Kim 已提交
1754

1755
	if (!ret) {
1756
		inode->i_mtime = inode->i_ctime = current_time(inode);
1757
		f2fs_mark_inode_dirty_sync(inode, false);
1758
		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1759
	}
1760

1761
out:
A
Al Viro 已提交
1762
	inode_unlock(inode);
1763

1764
	trace_f2fs_fallocate(inode, mode, offset, len, ret);
J
Jaegeuk Kim 已提交
1765 1766 1767
	return ret;
}

1768 1769
static int f2fs_release_file(struct inode *inode, struct file *filp)
{
1770 1771 1772 1773 1774 1775 1776 1777
	/*
	 * f2fs_relase_file is called at every close calls. So we should
	 * not drop any inmemory pages by close called by other process.
	 */
	if (!(filp->f_mode & FMODE_WRITE) ||
			atomic_read(&inode->i_writecount) != 1)
		return 0;

1778 1779
	/* some remained atomic pages should discarded */
	if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
1780
		f2fs_drop_inmem_pages(inode);
1781
	if (f2fs_is_volatile_file(inode)) {
1782
		set_inode_flag(inode, FI_DROP_CACHE);
1783
		filemap_fdatawrite(inode->i_mapping);
1784
		clear_inode_flag(inode, FI_DROP_CACHE);
1785 1786
		clear_inode_flag(inode, FI_VOLATILE_FILE);
		stat_dec_volatile_write(inode);
1787 1788 1789 1790
	}
	return 0;
}

1791
static int f2fs_file_flush(struct file *file, fl_owner_t id)
J
Jaegeuk Kim 已提交
1792
{
1793 1794 1795 1796 1797 1798 1799 1800 1801 1802
	struct inode *inode = file_inode(file);

	/*
	 * If the process doing a transaction is crashed, we should do
	 * roll-back. Otherwise, other reader/write can see corrupted database
	 * until all the writers close its file. Since this should be done
	 * before dropping file lock, it needs to do in ->flush.
	 */
	if (f2fs_is_atomic_file(inode) &&
			F2FS_I(inode)->inmem_task == current)
C
Chao Yu 已提交
1803
		f2fs_drop_inmem_pages(inode);
1804
	return 0;
J
Jaegeuk Kim 已提交
1805 1806
}

1807
static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
1808 1809
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
1810 1811 1812
	u32 masked_flags = fi->i_flags & mask;

	f2fs_bug_on(F2FS_I_SB(inode), (iflags & ~mask));
1813 1814 1815 1816 1817

	/* Is it quota file? Do not allow user to mess with it */
	if (IS_NOQUOTA(inode))
		return -EPERM;

1818
	if ((iflags ^ masked_flags) & F2FS_CASEFOLD_FL) {
1819 1820 1821 1822 1823 1824
		if (!f2fs_sb_has_casefold(F2FS_I_SB(inode)))
			return -EOPNOTSUPP;
		if (!f2fs_empty_dir(inode))
			return -ENOTEMPTY;
	}

C
Chao Yu 已提交
1825 1826 1827 1828 1829 1830 1831
	if (iflags & (F2FS_COMPR_FL | F2FS_NOCOMP_FL)) {
		if (!f2fs_sb_has_compression(F2FS_I_SB(inode)))
			return -EOPNOTSUPP;
		if ((iflags & F2FS_COMPR_FL) && (iflags & F2FS_NOCOMP_FL))
			return -EINVAL;
	}

1832
	if ((iflags ^ masked_flags) & F2FS_COMPR_FL) {
1833
		if (masked_flags & F2FS_COMPR_FL) {
1834 1835 1836
			if (f2fs_disable_compressed_file(inode))
				return -EINVAL;
		}
C
Chao Yu 已提交
1837 1838 1839 1840 1841 1842 1843 1844 1845
		if (iflags & F2FS_NOCOMP_FL)
			return -EINVAL;
		if (iflags & F2FS_COMPR_FL) {
			if (!f2fs_may_compress(inode))
				return -EINVAL;

			set_compress_context(inode);
		}
	}
1846 1847
	if ((iflags ^ masked_flags) & F2FS_NOCOMP_FL) {
		if (masked_flags & F2FS_COMPR_FL)
C
Chao Yu 已提交
1848 1849 1850
			return -EINVAL;
	}

1851
	fi->i_flags = iflags | (fi->i_flags & ~mask);
C
Chao Yu 已提交
1852 1853
	f2fs_bug_on(F2FS_I_SB(inode), (fi->i_flags & F2FS_COMPR_FL) &&
					(fi->i_flags & F2FS_NOCOMP_FL));
1854

1855
	if (fi->i_flags & F2FS_PROJINHERIT_FL)
1856 1857 1858 1859 1860 1861
		set_inode_flag(inode, FI_PROJ_INHERIT);
	else
		clear_inode_flag(inode, FI_PROJ_INHERIT);

	inode->i_ctime = current_time(inode);
	f2fs_set_inode_flags(inode);
C
Chao Yu 已提交
1862
	f2fs_mark_inode_dirty_sync(inode, true);
1863 1864 1865
	return 0;
}

1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878
/* FS_IOC_GETFLAGS and FS_IOC_SETFLAGS support */

/*
 * To make a new on-disk f2fs i_flag gettable via FS_IOC_GETFLAGS, add an entry
 * for it to f2fs_fsflags_map[], and add its FS_*_FL equivalent to
 * F2FS_GETTABLE_FS_FL.  To also make it settable via FS_IOC_SETFLAGS, also add
 * its FS_*_FL equivalent to F2FS_SETTABLE_FS_FL.
 */

static const struct {
	u32 iflag;
	u32 fsflag;
} f2fs_fsflags_map[] = {
C
Chao Yu 已提交
1879
	{ F2FS_COMPR_FL,	FS_COMPR_FL },
1880 1881 1882 1883 1884
	{ F2FS_SYNC_FL,		FS_SYNC_FL },
	{ F2FS_IMMUTABLE_FL,	FS_IMMUTABLE_FL },
	{ F2FS_APPEND_FL,	FS_APPEND_FL },
	{ F2FS_NODUMP_FL,	FS_NODUMP_FL },
	{ F2FS_NOATIME_FL,	FS_NOATIME_FL },
C
Chao Yu 已提交
1885
	{ F2FS_NOCOMP_FL,	FS_NOCOMP_FL },
1886 1887 1888
	{ F2FS_INDEX_FL,	FS_INDEX_FL },
	{ F2FS_DIRSYNC_FL,	FS_DIRSYNC_FL },
	{ F2FS_PROJINHERIT_FL,	FS_PROJINHERIT_FL },
1889
	{ F2FS_CASEFOLD_FL,	FS_CASEFOLD_FL },
1890 1891 1892
};

#define F2FS_GETTABLE_FS_FL (		\
C
Chao Yu 已提交
1893
		FS_COMPR_FL |		\
1894 1895 1896 1897 1898
		FS_SYNC_FL |		\
		FS_IMMUTABLE_FL |	\
		FS_APPEND_FL |		\
		FS_NODUMP_FL |		\
		FS_NOATIME_FL |		\
C
Chao Yu 已提交
1899
		FS_NOCOMP_FL |		\
1900 1901 1902 1903 1904
		FS_INDEX_FL |		\
		FS_DIRSYNC_FL |		\
		FS_PROJINHERIT_FL |	\
		FS_ENCRYPT_FL |		\
		FS_INLINE_DATA_FL |	\
E
Eric Biggers 已提交
1905
		FS_NOCOW_FL |		\
1906
		FS_VERITY_FL |		\
1907
		FS_CASEFOLD_FL)
1908 1909

#define F2FS_SETTABLE_FS_FL (		\
C
Chao Yu 已提交
1910
		FS_COMPR_FL |		\
1911 1912 1913 1914 1915
		FS_SYNC_FL |		\
		FS_IMMUTABLE_FL |	\
		FS_APPEND_FL |		\
		FS_NODUMP_FL |		\
		FS_NOATIME_FL |		\
C
Chao Yu 已提交
1916
		FS_NOCOMP_FL |		\
1917
		FS_DIRSYNC_FL |		\
1918 1919
		FS_PROJINHERIT_FL |	\
		FS_CASEFOLD_FL)
1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954

/* Convert f2fs on-disk i_flags to FS_IOC_{GET,SET}FLAGS flags */
static inline u32 f2fs_iflags_to_fsflags(u32 iflags)
{
	u32 fsflags = 0;
	int i;

	for (i = 0; i < ARRAY_SIZE(f2fs_fsflags_map); i++)
		if (iflags & f2fs_fsflags_map[i].iflag)
			fsflags |= f2fs_fsflags_map[i].fsflag;

	return fsflags;
}

/* Convert FS_IOC_{GET,SET}FLAGS flags to f2fs on-disk i_flags */
static inline u32 f2fs_fsflags_to_iflags(u32 fsflags)
{
	u32 iflags = 0;
	int i;

	for (i = 0; i < ARRAY_SIZE(f2fs_fsflags_map); i++)
		if (fsflags & f2fs_fsflags_map[i].fsflag)
			iflags |= f2fs_fsflags_map[i].iflag;

	return iflags;
}

static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_inode_info *fi = F2FS_I(inode);
	u32 fsflags = f2fs_iflags_to_fsflags(fi->i_flags);

	if (IS_ENCRYPTED(inode))
		fsflags |= FS_ENCRYPT_FL;
E
Eric Biggers 已提交
1955 1956
	if (IS_VERITY(inode))
		fsflags |= FS_VERITY_FL;
1957 1958 1959 1960 1961 1962 1963 1964 1965 1966
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode))
		fsflags |= FS_INLINE_DATA_FL;
	if (is_inode_flag_set(inode, FI_PIN_FILE))
		fsflags |= FS_NOCOW_FL;

	fsflags &= F2FS_GETTABLE_FS_FL;

	return put_user(fsflags, (int __user *)arg);
}

1967 1968 1969
static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
1970 1971
	struct f2fs_inode_info *fi = F2FS_I(inode);
	u32 fsflags, old_fsflags;
1972
	u32 iflags;
1973
	int ret;
J
Jaegeuk Kim 已提交
1974

1975 1976 1977
	if (!inode_owner_or_capable(inode))
		return -EACCES;

1978
	if (get_user(fsflags, (int __user *)arg))
1979 1980
		return -EFAULT;

1981 1982 1983 1984 1985 1986 1987 1988
	if (fsflags & ~F2FS_GETTABLE_FS_FL)
		return -EOPNOTSUPP;
	fsflags &= F2FS_SETTABLE_FS_FL;

	iflags = f2fs_fsflags_to_iflags(fsflags);
	if (f2fs_mask_flags(inode->i_mode, iflags) != iflags)
		return -EOPNOTSUPP;

1989 1990 1991
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;
J
Jaegeuk Kim 已提交
1992

A
Al Viro 已提交
1993
	inode_lock(inode);
J
Jaegeuk Kim 已提交
1994

1995 1996 1997 1998 1999
	old_fsflags = f2fs_iflags_to_fsflags(fi->i_flags);
	ret = vfs_ioc_setflags_prepare(inode, old_fsflags, fsflags);
	if (ret)
		goto out;

2000 2001
	ret = f2fs_setflags_common(inode, iflags,
			f2fs_fsflags_to_iflags(F2FS_SETTABLE_FS_FL));
2002
out:
2003
	inode_unlock(inode);
2004 2005 2006
	mnt_drop_write_file(filp);
	return ret;
}
2007

C
Chao Yu 已提交
2008 2009 2010 2011 2012 2013 2014
static int f2fs_ioc_getversion(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);

	return put_user(inode->i_generation, (int __user *)arg);
}

J
Jaegeuk Kim 已提交
2015 2016 2017
static int f2fs_ioc_start_atomic_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
2018 2019
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2020
	int ret;
J
Jaegeuk Kim 已提交
2021 2022 2023 2024

	if (!inode_owner_or_capable(inode))
		return -EACCES;

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

2028 2029 2030
	if (filp->f_flags & O_DIRECT)
		return -EINVAL;

2031 2032 2033 2034
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2035 2036
	inode_lock(inode);

C
Chao Yu 已提交
2037 2038
	f2fs_disable_compressed_file(inode);

2039 2040 2041
	if (f2fs_is_atomic_file(inode)) {
		if (is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST))
			ret = -EINVAL;
2042
		goto out;
2043
	}
J
Jaegeuk Kim 已提交
2044

2045 2046
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
2047
		goto out;
J
Jaegeuk Kim 已提交
2048

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

2051 2052 2053 2054 2055
	/*
	 * Should wait end_io to count F2FS_WB_CP_DATA correctly by
	 * f2fs_is_atomic_file.
	 */
	if (get_dirty_pages(inode))
2056 2057
		f2fs_warn(F2FS_I_SB(inode), "Unexpected flush for atomic writes: ino=%lu, npages=%u",
			  inode->i_ino, get_dirty_pages(inode));
2058
	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
2059 2060
	if (ret) {
		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2061
		goto out;
2062
	}
2063

2064 2065 2066
	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
	if (list_empty(&fi->inmem_ilist))
		list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
2067
	sbi->atomic_files++;
2068 2069 2070
	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);

	/* add inode in inmem_list first and set atomic_file */
2071
	set_inode_flag(inode, FI_ATOMIC_FILE);
2072
	clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
2073
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2074

2075
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2076
	F2FS_I(inode)->inmem_task = current;
2077
	stat_update_max_atomic_write(inode);
2078
out:
2079
	inode_unlock(inode);
2080
	mnt_drop_write_file(filp);
2081
	return ret;
J
Jaegeuk Kim 已提交
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095
}

static int f2fs_ioc_commit_atomic_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
	int ret;

	if (!inode_owner_or_capable(inode))
		return -EACCES;

	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2096
	f2fs_balance_fs(F2FS_I_SB(inode), true);
2097

2098
	inode_lock(inode);
2099

2100 2101
	if (f2fs_is_volatile_file(inode)) {
		ret = -EINVAL;
2102
		goto err_out;
2103
	}
2104

2105
	if (f2fs_is_atomic_file(inode)) {
C
Chao Yu 已提交
2106
		ret = f2fs_commit_inmem_pages(inode);
C
Chao Yu 已提交
2107
		if (ret)
2108
			goto err_out;
C
Chao Yu 已提交
2109

2110
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
2111 2112
		if (!ret)
			f2fs_drop_inmem_pages(inode);
2113
	} else {
2114
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false);
2115
	}
2116
err_out:
2117 2118 2119 2120
	if (is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST)) {
		clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
		ret = -EINVAL;
	}
2121
	inode_unlock(inode);
J
Jaegeuk Kim 已提交
2122 2123 2124 2125
	mnt_drop_write_file(filp);
	return ret;
}

2126 2127 2128
static int f2fs_ioc_start_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
2129
	int ret;
2130 2131 2132 2133

	if (!inode_owner_or_capable(inode))
		return -EACCES;

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

2137 2138 2139 2140
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2141 2142
	inode_lock(inode);

2143
	if (f2fs_is_volatile_file(inode))
2144
		goto out;
2145

2146 2147
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
2148
		goto out;
2149

2150 2151 2152
	stat_inc_volatile_write(inode);
	stat_update_max_volatile_write(inode);

2153
	set_inode_flag(inode, FI_VOLATILE_FILE);
2154
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2155
out:
2156
	inode_unlock(inode);
2157 2158
	mnt_drop_write_file(filp);
	return ret;
2159 2160
}

2161 2162 2163
static int f2fs_ioc_release_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
2164
	int ret;
2165 2166 2167 2168

	if (!inode_owner_or_capable(inode))
		return -EACCES;

2169 2170 2171 2172
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2173 2174
	inode_lock(inode);

2175
	if (!f2fs_is_volatile_file(inode))
2176
		goto out;
2177

2178 2179 2180 2181
	if (!f2fs_is_first_block_written(inode)) {
		ret = truncate_partial_data_page(inode, 0, true);
		goto out;
	}
2182

2183 2184
	ret = punch_hole(inode, 0, F2FS_BLKSIZE);
out:
2185
	inode_unlock(inode);
2186 2187
	mnt_drop_write_file(filp);
	return ret;
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201
}

static int f2fs_ioc_abort_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
	int ret;

	if (!inode_owner_or_capable(inode))
		return -EACCES;

	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2202 2203
	inode_lock(inode);

2204
	if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
2205
		f2fs_drop_inmem_pages(inode);
2206
	if (f2fs_is_volatile_file(inode)) {
2207
		clear_inode_flag(inode, FI_VOLATILE_FILE);
2208
		stat_dec_volatile_write(inode);
2209
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
2210
	}
2211

2212 2213
	clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);

2214 2215
	inode_unlock(inode);

2216
	mnt_drop_write_file(filp);
2217
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2218 2219 2220
	return ret;
}

J
Jaegeuk Kim 已提交
2221 2222 2223 2224 2225 2226
static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct super_block *sb = sbi->sb;
	__u32 in;
2227
	int ret = 0;
J
Jaegeuk Kim 已提交
2228 2229 2230 2231 2232 2233 2234

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	if (get_user(in, (__u32 __user *)arg))
		return -EFAULT;

2235 2236 2237 2238 2239
	if (in != F2FS_GOING_DOWN_FULLSYNC) {
		ret = mnt_want_write_file(filp);
		if (ret)
			return ret;
	}
2240

J
Jaegeuk Kim 已提交
2241 2242 2243
	switch (in) {
	case F2FS_GOING_DOWN_FULLSYNC:
		sb = freeze_bdev(sb->s_bdev);
2244 2245 2246 2247 2248
		if (IS_ERR(sb)) {
			ret = PTR_ERR(sb);
			goto out;
		}
		if (sb) {
2249
			f2fs_stop_checkpoint(sbi, false);
2250
			set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
J
Jaegeuk Kim 已提交
2251 2252 2253 2254 2255
			thaw_bdev(sb->s_bdev, sb);
		}
		break;
	case F2FS_GOING_DOWN_METASYNC:
		/* do checkpoint only */
2256 2257 2258
		ret = f2fs_sync_fs(sb, 1);
		if (ret)
			goto out;
2259
		f2fs_stop_checkpoint(sbi, false);
2260
		set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
J
Jaegeuk Kim 已提交
2261 2262
		break;
	case F2FS_GOING_DOWN_NOSYNC:
2263
		f2fs_stop_checkpoint(sbi, false);
2264
		set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
J
Jaegeuk Kim 已提交
2265
		break;
2266
	case F2FS_GOING_DOWN_METAFLUSH:
C
Chao Yu 已提交
2267
		f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_META_IO);
2268
		f2fs_stop_checkpoint(sbi, false);
2269
		set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
2270
		break;
2271 2272
	case F2FS_GOING_DOWN_NEED_FSCK:
		set_sbi_flag(sbi, SBI_NEED_FSCK);
2273 2274
		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
		set_sbi_flag(sbi, SBI_IS_DIRTY);
2275 2276
		/* do checkpoint only */
		ret = f2fs_sync_fs(sb, 1);
2277
		goto out;
J
Jaegeuk Kim 已提交
2278
	default:
2279 2280
		ret = -EINVAL;
		goto out;
J
Jaegeuk Kim 已提交
2281
	}
2282

C
Chao Yu 已提交
2283 2284
	f2fs_stop_gc_thread(sbi);
	f2fs_stop_discard_thread(sbi);
2285

C
Chao Yu 已提交
2286
	f2fs_drop_discard_cmd(sbi);
2287 2288
	clear_opt(sbi, DISCARD);

2289
	f2fs_update_time(sbi, REQ_TIME);
2290
out:
2291 2292
	if (in != F2FS_GOING_DOWN_FULLSYNC)
		mnt_drop_write_file(filp);
C
Chao Yu 已提交
2293 2294 2295

	trace_f2fs_shutdown(sbi, in, ret);

2296
	return ret;
J
Jaegeuk Kim 已提交
2297 2298
}

2299 2300 2301 2302 2303 2304 2305
static int f2fs_ioc_fitrim(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct super_block *sb = inode->i_sb;
	struct request_queue *q = bdev_get_queue(sb->s_bdev);
	struct fstrim_range range;
	int ret;
2306

2307 2308
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;
2309

2310
	if (!f2fs_hw_support_discard(F2FS_SB(sb)))
2311
		return -EOPNOTSUPP;
2312

2313 2314 2315
	if (copy_from_user(&range, (struct fstrim_range __user *)arg,
				sizeof(range)))
		return -EFAULT;
2316

2317 2318 2319 2320
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

2321 2322 2323
	range.minlen = max((unsigned int)range.minlen,
				q->limits.discard_granularity);
	ret = f2fs_trim_fs(F2FS_SB(sb), &range);
2324
	mnt_drop_write_file(filp);
2325 2326
	if (ret < 0)
		return ret;
2327

2328 2329 2330
	if (copy_to_user((struct fstrim_range __user *)arg, &range,
				sizeof(range)))
		return -EFAULT;
2331
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2332 2333 2334
	return 0;
}

2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348
static bool uuid_is_nonzero(__u8 u[16])
{
	int i;

	for (i = 0; i < 16; i++)
		if (u[i])
			return true;
	return false;
}

static int f2fs_ioc_set_encryption_policy(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);

2349
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(inode)))
2350 2351
		return -EOPNOTSUPP;

2352
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2353

2354
	return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
2355 2356 2357 2358
}

static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg)
{
2359
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
2360
		return -EOPNOTSUPP;
2361
	return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
2362 2363 2364 2365 2366 2367 2368 2369
}

static int f2fs_ioc_get_encryption_pwsalt(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	int err;

2370
	if (!f2fs_sb_has_encrypt(sbi))
2371 2372 2373 2374 2375 2376
		return -EOPNOTSUPP;

	err = mnt_want_write_file(filp);
	if (err)
		return err;

2377
	down_write(&sbi->sb_lock);
2378 2379 2380 2381

	if (uuid_is_nonzero(sbi->raw_super->encrypt_pw_salt))
		goto got_it;

2382 2383 2384
	/* update superblock with uuid */
	generate_random_uuid(sbi->raw_super->encrypt_pw_salt);

C
Chao Yu 已提交
2385
	err = f2fs_commit_super(sbi, false);
2386 2387 2388
	if (err) {
		/* undo new data */
		memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
2389
		goto out_err;
2390 2391 2392 2393
	}
got_it:
	if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
									16))
2394 2395
		err = -EFAULT;
out_err:
2396
	up_write(&sbi->sb_lock);
2397 2398
	mnt_drop_write_file(filp);
	return err;
2399 2400
}

E
Eric Biggers 已提交
2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443
static int f2fs_ioc_get_encryption_policy_ex(struct file *filp,
					     unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_get_policy_ex(filp, (void __user *)arg);
}

static int f2fs_ioc_add_encryption_key(struct file *filp, unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_add_key(filp, (void __user *)arg);
}

static int f2fs_ioc_remove_encryption_key(struct file *filp, unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_remove_key(filp, (void __user *)arg);
}

static int f2fs_ioc_remove_encryption_key_all_users(struct file *filp,
						    unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_remove_key_all_users(filp, (void __user *)arg);
}

static int f2fs_ioc_get_encryption_key_status(struct file *filp,
					      unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_get_key_status(filp, (void __user *)arg);
}

2444 2445 2446 2447 2448 2449 2450 2451
static int f2fs_ioc_get_encryption_nonce(struct file *filp, unsigned long arg)
{
	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fscrypt_ioctl_get_nonce(filp, (void __user *)arg);
}

2452 2453 2454 2455
static int f2fs_ioc_gc(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
C
Chao Yu 已提交
2456
	__u32 sync;
2457
	int ret;
2458 2459 2460 2461

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

C
Chao Yu 已提交
2462
	if (get_user(sync, (__u32 __user *)arg))
2463 2464
		return -EFAULT;

C
Chao Yu 已提交
2465 2466
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
2467

2468 2469 2470 2471
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

C
Chao Yu 已提交
2472
	if (!sync) {
C
Chao Yu 已提交
2473
		if (!down_write_trylock(&sbi->gc_lock)) {
2474 2475 2476
			ret = -EBUSY;
			goto out;
		}
C
Chao Yu 已提交
2477
	} else {
C
Chao Yu 已提交
2478
		down_write(&sbi->gc_lock);
2479 2480
	}

2481
	ret = f2fs_gc(sbi, sync, true, NULL_SEGNO);
2482 2483 2484
out:
	mnt_drop_write_file(filp);
	return ret;
2485 2486
}

2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504
static int f2fs_ioc_gc_range(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct f2fs_gc_range range;
	u64 end;
	int ret;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	if (copy_from_user(&range, (struct f2fs_gc_range __user *)arg,
							sizeof(range)))
		return -EFAULT;

	if (f2fs_readonly(sbi->sb))
		return -EROFS;

2505
	end = range.start + range.len;
2506 2507
	if (end < range.start || range.start < MAIN_BLKADDR(sbi) ||
					end >= MAX_BLKADDR(sbi))
2508 2509
		return -EINVAL;

2510 2511 2512 2513 2514 2515
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

do_more:
	if (!range.sync) {
C
Chao Yu 已提交
2516
		if (!down_write_trylock(&sbi->gc_lock)) {
2517 2518 2519 2520
			ret = -EBUSY;
			goto out;
		}
	} else {
C
Chao Yu 已提交
2521
		down_write(&sbi->gc_lock);
2522 2523 2524
	}

	ret = f2fs_gc(sbi, range.sync, true, GET_SEGNO(sbi, range.start));
2525
	range.start += BLKS_PER_SEC(sbi);
2526 2527 2528 2529 2530 2531 2532
	if (range.start <= end)
		goto do_more;
out:
	mnt_drop_write_file(filp);
	return ret;
}

C
Chao Yu 已提交
2533
static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
2534 2535 2536
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2537
	int ret;
2538 2539 2540 2541 2542 2543 2544

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	if (f2fs_readonly(sbi->sb))
		return -EROFS;

D
Daniel Rosenberg 已提交
2545
	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
2546
		f2fs_info(sbi, "Skipping Checkpoint. Checkpoints currently disabled.");
D
Daniel Rosenberg 已提交
2547 2548 2549
		return -EINVAL;
	}

2550 2551 2552 2553 2554 2555 2556 2557
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

	ret = f2fs_sync_fs(sbi->sb, 1);

	mnt_drop_write_file(filp);
	return ret;
2558 2559
}

C
Chao Yu 已提交
2560 2561 2562 2563 2564
static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
					struct file *filp,
					struct f2fs_defragment *range)
{
	struct inode *inode = file_inode(filp);
2565
	struct f2fs_map_blocks map = { .m_next_extent = NULL,
2566 2567
					.m_seg_type = NO_CHECK_TYPE ,
					.m_may_create = false };
2568
	struct extent_info ei = {0, 0, 0};
2569
	pgoff_t pg_start, pg_end, next_pgofs;
2570
	unsigned int blk_per_seg = sbi->blocks_per_seg;
C
Chao Yu 已提交
2571 2572 2573 2574 2575 2576
	unsigned int total = 0, sec_num;
	block_t blk_end = 0;
	bool fragmented = false;
	int err;

	/* if in-place-update policy is enabled, don't waste time here */
C
Chao Yu 已提交
2577
	if (f2fs_should_update_inplace(inode, NULL))
C
Chao Yu 已提交
2578 2579
		return -EINVAL;

2580 2581
	pg_start = range->start >> PAGE_SHIFT;
	pg_end = (range->start + range->len) >> PAGE_SHIFT;
C
Chao Yu 已提交
2582

J
Jaegeuk Kim 已提交
2583
	f2fs_balance_fs(sbi, true);
C
Chao Yu 已提交
2584

A
Al Viro 已提交
2585
	inode_lock(inode);
C
Chao Yu 已提交
2586 2587 2588

	/* writeback all dirty pages in the range */
	err = filemap_write_and_wait_range(inode->i_mapping, range->start,
2589
						range->start + range->len - 1);
C
Chao Yu 已提交
2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602
	if (err)
		goto out;

	/*
	 * lookup mapping info in extent cache, skip defragmenting if physical
	 * block addresses are continuous.
	 */
	if (f2fs_lookup_extent_cache(inode, pg_start, &ei)) {
		if (ei.fofs + ei.len >= pg_end)
			goto out;
	}

	map.m_lblk = pg_start;
2603
	map.m_next_pgofs = &next_pgofs;
C
Chao Yu 已提交
2604 2605 2606 2607 2608 2609 2610

	/*
	 * lookup mapping info in dnode page cache, skip defragmenting if all
	 * physical block addresses are continuous even if there are hole(s)
	 * in logical blocks.
	 */
	while (map.m_lblk < pg_end) {
F
Fan Li 已提交
2611
		map.m_len = pg_end - map.m_lblk;
2612
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
C
Chao Yu 已提交
2613 2614 2615 2616
		if (err)
			goto out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
2617
			map.m_lblk = next_pgofs;
C
Chao Yu 已提交
2618 2619 2620
			continue;
		}

2621
		if (blk_end && blk_end != map.m_pblk)
C
Chao Yu 已提交
2622
			fragmented = true;
2623 2624 2625 2626

		/* record total count of block that we're going to move */
		total += map.m_len;

C
Chao Yu 已提交
2627 2628 2629 2630 2631
		blk_end = map.m_pblk + map.m_len;

		map.m_lblk += map.m_len;
	}

2632 2633
	if (!fragmented) {
		total = 0;
C
Chao Yu 已提交
2634
		goto out;
2635
	}
C
Chao Yu 已提交
2636

2637
	sec_num = DIV_ROUND_UP(total, BLKS_PER_SEC(sbi));
C
Chao Yu 已提交
2638 2639 2640 2641 2642 2643

	/*
	 * make sure there are enough free section for LFS allocation, this can
	 * avoid defragment running in SSR mode when free section are allocated
	 * intensively
	 */
2644
	if (has_not_enough_free_secs(sbi, 0, sec_num)) {
C
Chao Yu 已提交
2645 2646 2647 2648
		err = -EAGAIN;
		goto out;
	}

2649 2650 2651 2652
	map.m_lblk = pg_start;
	map.m_len = pg_end - pg_start;
	total = 0;

C
Chao Yu 已提交
2653 2654 2655 2656 2657
	while (map.m_lblk < pg_end) {
		pgoff_t idx;
		int cnt = 0;

do_map:
F
Fan Li 已提交
2658
		map.m_len = pg_end - map.m_lblk;
2659
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
C
Chao Yu 已提交
2660 2661 2662 2663
		if (err)
			goto clear_out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
2664
			map.m_lblk = next_pgofs;
2665
			goto check;
C
Chao Yu 已提交
2666 2667
		}

2668
		set_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2669 2670 2671 2672 2673

		idx = map.m_lblk;
		while (idx < map.m_lblk + map.m_len && cnt < blk_per_seg) {
			struct page *page;

C
Chao Yu 已提交
2674
			page = f2fs_get_lock_data_page(inode, idx, true);
C
Chao Yu 已提交
2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688
			if (IS_ERR(page)) {
				err = PTR_ERR(page);
				goto clear_out;
			}

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

			idx++;
			cnt++;
			total++;
		}

		map.m_lblk = idx;
2689 2690
check:
		if (map.m_lblk < pg_end && cnt < blk_per_seg)
C
Chao Yu 已提交
2691 2692
			goto do_map;

2693
		clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2694 2695 2696 2697 2698 2699

		err = filemap_fdatawrite(inode->i_mapping);
		if (err)
			goto out;
	}
clear_out:
2700
	clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2701
out:
A
Al Viro 已提交
2702
	inode_unlock(inode);
C
Chao Yu 已提交
2703
	if (!err)
2704
		range->len = (u64)total << PAGE_SHIFT;
C
Chao Yu 已提交
2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717
	return err;
}

static int f2fs_ioc_defragment(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct f2fs_defragment range;
	int err;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

2718
	if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
2719 2720
		return -EINVAL;

2721 2722
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
C
Chao Yu 已提交
2723 2724

	if (copy_from_user(&range, (struct f2fs_defragment __user *)arg,
2725 2726
							sizeof(range)))
		return -EFAULT;
C
Chao Yu 已提交
2727 2728

	/* verify alignment of offset & size */
2729 2730
	if (range.start & (F2FS_BLKSIZE - 1) || range.len & (F2FS_BLKSIZE - 1))
		return -EINVAL;
C
Chao Yu 已提交
2731

S
Sheng Yong 已提交
2732
	if (unlikely((range.start + range.len) >> PAGE_SHIFT >
2733 2734 2735 2736 2737 2738
					sbi->max_file_blocks))
		return -EINVAL;

	err = mnt_want_write_file(filp);
	if (err)
		return err;
S
Sheng Yong 已提交
2739

C
Chao Yu 已提交
2740
	err = f2fs_defragment_range(sbi, filp, &range);
2741 2742
	mnt_drop_write_file(filp);

2743
	f2fs_update_time(sbi, REQ_TIME);
C
Chao Yu 已提交
2744
	if (err < 0)
2745
		return err;
C
Chao Yu 已提交
2746 2747 2748

	if (copy_to_user((struct f2fs_defragment __user *)arg, &range,
							sizeof(range)))
2749 2750 2751
		return -EFAULT;

	return 0;
C
Chao Yu 已提交
2752 2753
}

2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770
static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
			struct file *file_out, loff_t pos_out, size_t len)
{
	struct inode *src = file_inode(file_in);
	struct inode *dst = file_inode(file_out);
	struct f2fs_sb_info *sbi = F2FS_I_SB(src);
	size_t olen = len, dst_max_i_size = 0;
	size_t dst_osize;
	int ret;

	if (file_in->f_path.mnt != file_out->f_path.mnt ||
				src->i_sb != dst->i_sb)
		return -EXDEV;

	if (unlikely(f2fs_readonly(src->i_sb)))
		return -EROFS;

2771 2772
	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode))
		return -EINVAL;
2773

2774
	if (IS_ENCRYPTED(src) || IS_ENCRYPTED(dst))
2775 2776
		return -EOPNOTSUPP;

2777 2778 2779 2780 2781 2782 2783
	if (src == dst) {
		if (pos_in == pos_out)
			return 0;
		if (pos_out > pos_in && pos_out < pos_in + len)
			return -EINVAL;
	}

2784
	inode_lock(src);
2785
	if (src != dst) {
2786 2787 2788
		ret = -EBUSY;
		if (!inode_trylock(dst))
			goto out;
2789
	}
2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832

	ret = -EINVAL;
	if (pos_in + len > src->i_size || pos_in + len < pos_in)
		goto out_unlock;
	if (len == 0)
		olen = len = src->i_size - pos_in;
	if (pos_in + len == src->i_size)
		len = ALIGN(src->i_size, F2FS_BLKSIZE) - pos_in;
	if (len == 0) {
		ret = 0;
		goto out_unlock;
	}

	dst_osize = dst->i_size;
	if (pos_out + olen > dst->i_size)
		dst_max_i_size = pos_out + olen;

	/* verify the end result is block aligned */
	if (!IS_ALIGNED(pos_in, F2FS_BLKSIZE) ||
			!IS_ALIGNED(pos_in + len, F2FS_BLKSIZE) ||
			!IS_ALIGNED(pos_out, F2FS_BLKSIZE))
		goto out_unlock;

	ret = f2fs_convert_inline_inode(src);
	if (ret)
		goto out_unlock;

	ret = f2fs_convert_inline_inode(dst);
	if (ret)
		goto out_unlock;

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(src->i_mapping,
					pos_in, pos_in + len);
	if (ret)
		goto out_unlock;

	ret = filemap_write_and_wait_range(dst->i_mapping,
					pos_out, pos_out + len);
	if (ret)
		goto out_unlock;

	f2fs_balance_fs(sbi, true);
2833 2834 2835 2836 2837 2838 2839 2840

	down_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
	if (src != dst) {
		ret = -EBUSY;
		if (!down_write_trylock(&F2FS_I(dst)->i_gc_rwsem[WRITE]))
			goto out_src;
	}

2841
	f2fs_lock_op(sbi);
2842 2843 2844
	ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
				pos_out >> F2FS_BLKSIZE_BITS,
				len >> F2FS_BLKSIZE_BITS, false);
2845 2846 2847 2848 2849 2850 2851 2852

	if (!ret) {
		if (dst_max_i_size)
			f2fs_i_size_write(dst, dst_max_i_size);
		else if (dst_osize != dst->i_size)
			f2fs_i_size_write(dst, dst_osize);
	}
	f2fs_unlock_op(sbi);
2853 2854

	if (src != dst)
C
Chao Yu 已提交
2855
		up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]);
2856 2857 2858 2859
out_src:
	up_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
out_unlock:
	if (src != dst)
2860
		inode_unlock(dst);
2861
out:
2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896
	inode_unlock(src);
	return ret;
}

static int f2fs_ioc_move_range(struct file *filp, unsigned long arg)
{
	struct f2fs_move_range range;
	struct fd dst;
	int err;

	if (!(filp->f_mode & FMODE_READ) ||
			!(filp->f_mode & FMODE_WRITE))
		return -EBADF;

	if (copy_from_user(&range, (struct f2fs_move_range __user *)arg,
							sizeof(range)))
		return -EFAULT;

	dst = fdget(range.dst_fd);
	if (!dst.file)
		return -EBADF;

	if (!(dst.file->f_mode & FMODE_WRITE)) {
		err = -EBADF;
		goto err_out;
	}

	err = mnt_want_write_file(filp);
	if (err)
		goto err_out;

	err = f2fs_move_file_range(filp, range.pos_in, dst.file,
					range.pos_out, range.len);

	mnt_drop_write_file(filp);
2897 2898
	if (err)
		goto err_out;
2899 2900 2901 2902 2903 2904 2905 2906 2907

	if (copy_to_user((struct f2fs_move_range __user *)arg,
						&range, sizeof(range)))
		err = -EFAULT;
err_out:
	fdput(dst);
	return err;
}

2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct sit_info *sm = SIT_I(sbi);
	unsigned int start_segno = 0, end_segno = 0;
	unsigned int dev_start_segno = 0, dev_end_segno = 0;
	struct f2fs_flush_device range;
	int ret;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	if (f2fs_readonly(sbi->sb))
		return -EROFS;

D
Daniel Rosenberg 已提交
2924 2925 2926
	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
		return -EINVAL;

2927 2928 2929 2930
	if (copy_from_user(&range, (struct f2fs_flush_device __user *)arg,
							sizeof(range)))
		return -EFAULT;

2931
	if (!f2fs_is_multi_device(sbi) || sbi->s_ndevs - 1 <= range.dev_num ||
2932
			__is_large_section(sbi)) {
2933 2934
		f2fs_warn(sbi, "Can't flush %u in %d for segs_per_sec %u != 1",
			  range.dev_num, sbi->s_ndevs, sbi->segs_per_sec);
2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951
		return -EINVAL;
	}

	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

	if (range.dev_num != 0)
		dev_start_segno = GET_SEGNO(sbi, FDEV(range.dev_num).start_blk);
	dev_end_segno = GET_SEGNO(sbi, FDEV(range.dev_num).end_blk);

	start_segno = sm->last_victim[FLUSH_DEVICE];
	if (start_segno < dev_start_segno || start_segno >= dev_end_segno)
		start_segno = dev_start_segno;
	end_segno = min(start_segno + range.segments, dev_end_segno);

	while (start_segno < end_segno) {
C
Chao Yu 已提交
2952
		if (!down_write_trylock(&sbi->gc_lock)) {
2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970
			ret = -EBUSY;
			goto out;
		}
		sm->last_victim[GC_CB] = end_segno + 1;
		sm->last_victim[GC_GREEDY] = end_segno + 1;
		sm->last_victim[ALLOC_NEXT] = end_segno + 1;
		ret = f2fs_gc(sbi, true, true, start_segno);
		if (ret == -EAGAIN)
			ret = 0;
		else if (ret < 0)
			break;
		start_segno++;
	}
out:
	mnt_drop_write_file(filp);
	return ret;
}

2971 2972 2973 2974 2975 2976 2977 2978 2979 2980
static int f2fs_ioc_get_features(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	u32 sb_feature = le32_to_cpu(F2FS_I_SB(inode)->raw_super->feature);

	/* Must validate to set it with SQLite behavior in Android. */
	sb_feature |= F2FS_FEATURE_ATOMIC_WRITE;

	return put_user(sb_feature, (u32 __user *)arg);
}
2981

2982
#ifdef CONFIG_QUOTA
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999
int f2fs_transfer_project_quota(struct inode *inode, kprojid_t kprojid)
{
	struct dquot *transfer_to[MAXQUOTAS] = {};
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct super_block *sb = sbi->sb;
	int err = 0;

	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
	if (!IS_ERR(transfer_to[PRJQUOTA])) {
		err = __dquot_transfer(inode, transfer_to);
		if (err)
			set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
		dqput(transfer_to[PRJQUOTA]);
	}
	return err;
}

3000 3001 3002 3003 3004 3005 3006 3007 3008
static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct page *ipage;
	kprojid_t kprojid;
	int err;

3009
	if (!f2fs_sb_has_project_quota(sbi)) {
3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026
		if (projid != F2FS_DEF_PROJID)
			return -EOPNOTSUPP;
		else
			return 0;
	}

	if (!f2fs_has_extra_attr(inode))
		return -EOPNOTSUPP;

	kprojid = make_kprojid(&init_user_ns, (projid_t)projid);

	if (projid_eq(kprojid, F2FS_I(inode)->i_projid))
		return 0;

	err = -EPERM;
	/* Is it quota file? Do not allow user to mess with it */
	if (IS_NOQUOTA(inode))
3027
		return err;
3028

C
Chao Yu 已提交
3029
	ipage = f2fs_get_node_page(sbi, inode->i_ino);
3030 3031
	if (IS_ERR(ipage))
		return PTR_ERR(ipage);
3032 3033 3034 3035 3036

	if (!F2FS_FITS_IN_INODE(F2FS_INODE(ipage), fi->i_extra_isize,
								i_projid)) {
		err = -EOVERFLOW;
		f2fs_put_page(ipage, 1);
3037
		return err;
3038 3039 3040
	}
	f2fs_put_page(ipage, 1);

3041 3042
	err = dquot_initialize(inode);
	if (err)
3043
		return err;
3044

3045 3046 3047 3048
	f2fs_lock_op(sbi);
	err = f2fs_transfer_project_quota(inode, kprojid);
	if (err)
		goto out_unlock;
3049 3050 3051 3052

	F2FS_I(inode)->i_projid = kprojid;
	inode->i_ctime = current_time(inode);
	f2fs_mark_inode_dirty_sync(inode, true);
3053 3054
out_unlock:
	f2fs_unlock_op(sbi);
3055 3056 3057
	return err;
}
#else
3058 3059 3060 3061 3062
int f2fs_transfer_project_quota(struct inode *inode, kprojid_t kprojid)
{
	return 0;
}

3063 3064 3065 3066 3067 3068 3069 3070
static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
{
	if (projid != F2FS_DEF_PROJID)
		return -EOPNOTSUPP;
	return 0;
}
#endif

3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108
/* FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR support */

/*
 * To make a new on-disk f2fs i_flag gettable via FS_IOC_FSGETXATTR and settable
 * via FS_IOC_FSSETXATTR, add an entry for it to f2fs_xflags_map[], and add its
 * FS_XFLAG_* equivalent to F2FS_SUPPORTED_XFLAGS.
 */

static const struct {
	u32 iflag;
	u32 xflag;
} f2fs_xflags_map[] = {
	{ F2FS_SYNC_FL,		FS_XFLAG_SYNC },
	{ F2FS_IMMUTABLE_FL,	FS_XFLAG_IMMUTABLE },
	{ F2FS_APPEND_FL,	FS_XFLAG_APPEND },
	{ F2FS_NODUMP_FL,	FS_XFLAG_NODUMP },
	{ F2FS_NOATIME_FL,	FS_XFLAG_NOATIME },
	{ F2FS_PROJINHERIT_FL,	FS_XFLAG_PROJINHERIT },
};

#define F2FS_SUPPORTED_XFLAGS (		\
		FS_XFLAG_SYNC |		\
		FS_XFLAG_IMMUTABLE |	\
		FS_XFLAG_APPEND |	\
		FS_XFLAG_NODUMP |	\
		FS_XFLAG_NOATIME |	\
		FS_XFLAG_PROJINHERIT)

/* Convert f2fs on-disk i_flags to FS_IOC_FS{GET,SET}XATTR flags */
static inline u32 f2fs_iflags_to_xflags(u32 iflags)
{
	u32 xflags = 0;
	int i;

	for (i = 0; i < ARRAY_SIZE(f2fs_xflags_map); i++)
		if (iflags & f2fs_xflags_map[i].iflag)
			xflags |= f2fs_xflags_map[i].xflag;

3109 3110 3111
	return xflags;
}

3112 3113
/* Convert FS_IOC_FS{GET,SET}XATTR flags to f2fs on-disk i_flags */
static inline u32 f2fs_xflags_to_iflags(u32 xflags)
3114
{
3115 3116
	u32 iflags = 0;
	int i;
3117

3118 3119 3120
	for (i = 0; i < ARRAY_SIZE(f2fs_xflags_map); i++)
		if (xflags & f2fs_xflags_map[i].xflag)
			iflags |= f2fs_xflags_map[i].iflag;
3121 3122 3123 3124

	return iflags;
}

3125
static void f2fs_fill_fsxattr(struct inode *inode, struct fsxattr *fa)
3126 3127 3128
{
	struct f2fs_inode_info *fi = F2FS_I(inode);

3129
	simple_fill_fsxattr(fa, f2fs_iflags_to_xflags(fi->i_flags));
3130

3131
	if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)))
3132
		fa->fsx_projid = from_kprojid(&init_user_ns, fi->i_projid);
3133 3134
}

3135
static int f2fs_ioc_fsgetxattr(struct file *filp, unsigned long arg)
3136
{
3137 3138
	struct inode *inode = file_inode(filp);
	struct fsxattr fa;
3139

3140
	f2fs_fill_fsxattr(inode, &fa);
3141

3142 3143
	if (copy_to_user((struct fsxattr __user *)arg, &fa, sizeof(fa)))
		return -EFAULT;
3144 3145 3146
	return 0;
}

3147 3148 3149
static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
3150
	struct fsxattr fa, old_fa;
3151
	u32 iflags;
3152 3153 3154 3155 3156 3157 3158 3159 3160
	int err;

	if (copy_from_user(&fa, (struct fsxattr __user *)arg, sizeof(fa)))
		return -EFAULT;

	/* Make sure caller has proper permission */
	if (!inode_owner_or_capable(inode))
		return -EACCES;

3161
	if (fa.fsx_xflags & ~F2FS_SUPPORTED_XFLAGS)
3162 3163
		return -EOPNOTSUPP;

3164 3165
	iflags = f2fs_xflags_to_iflags(fa.fsx_xflags);
	if (f2fs_mask_flags(inode->i_mode, iflags) != iflags)
3166 3167 3168 3169 3170 3171 3172
		return -EOPNOTSUPP;

	err = mnt_want_write_file(filp);
	if (err)
		return err;

	inode_lock(inode);
3173 3174 3175

	f2fs_fill_fsxattr(inode, &old_fa);
	err = vfs_ioc_fssetxattr_check(inode, &old_fa, &fa);
3176 3177
	if (err)
		goto out;
3178

3179 3180
	err = f2fs_setflags_common(inode, iflags,
			f2fs_xflags_to_iflags(F2FS_SUPPORTED_XFLAGS));
3181
	if (err)
3182
		goto out;
3183 3184

	err = f2fs_ioc_setproject(filp, fa.fsx_projid);
3185 3186 3187 3188
out:
	inode_unlock(inode);
	mnt_drop_write_file(filp);
	return err;
3189
}
3190

3191 3192 3193 3194 3195 3196 3197
int f2fs_pin_file_control(struct inode *inode, bool inc)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

	/* Use i_gc_failures for normal file as a risk signal. */
	if (inc)
3198 3199
		f2fs_i_gc_failures_write(inode,
				fi->i_gc_failures[GC_FAILURE_PIN] + 1);
3200

3201
	if (fi->i_gc_failures[GC_FAILURE_PIN] > sbi->gc_pin_file_threshold) {
3202 3203 3204
		f2fs_warn(sbi, "%s: Enable GC = ino %lx after %x GC trials",
			  __func__, inode->i_ino,
			  fi->i_gc_failures[GC_FAILURE_PIN]);
3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231
		clear_inode_flag(inode, FI_PIN_FILE);
		return -EAGAIN;
	}
	return 0;
}

static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	__u32 pin;
	int ret = 0;

	if (get_user(pin, (__u32 __user *)arg))
		return -EFAULT;

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

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

	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

	inode_lock(inode);

C
Chao Yu 已提交
3232
	if (f2fs_should_update_outplace(inode, NULL)) {
C
Chao Yu 已提交
3233 3234 3235 3236
		ret = -EINVAL;
		goto out;
	}

3237 3238
	if (!pin) {
		clear_inode_flag(inode, FI_PIN_FILE);
3239
		f2fs_i_gc_failures_write(inode, 0);
3240 3241 3242 3243 3244 3245 3246
		goto done;
	}

	if (f2fs_pin_file_control(inode, false)) {
		ret = -EAGAIN;
		goto out;
	}
C
Chao Yu 已提交
3247

3248 3249 3250 3251
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		goto out;

C
Chao Yu 已提交
3252 3253 3254 3255 3256
	if (f2fs_disable_compressed_file(inode)) {
		ret = -EOPNOTSUPP;
		goto out;
	}

3257
	set_inode_flag(inode, FI_PIN_FILE);
3258
	ret = F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN];
3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272
done:
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
out:
	inode_unlock(inode);
	mnt_drop_write_file(filp);
	return ret;
}

static int f2fs_ioc_get_pin_file(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	__u32 pin = 0;

	if (is_inode_flag_set(inode, FI_PIN_FILE))
3273
		pin = F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN];
3274 3275 3276
	return put_user(pin, (u32 __user *)arg);
}

3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291
int f2fs_precache_extents(struct inode *inode)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_map_blocks map;
	pgoff_t m_next_extent;
	loff_t end;
	int err;

	if (is_inode_flag_set(inode, FI_NO_EXTENT))
		return -EOPNOTSUPP;

	map.m_lblk = 0;
	map.m_next_pgofs = NULL;
	map.m_next_extent = &m_next_extent;
	map.m_seg_type = NO_CHECK_TYPE;
3292
	map.m_may_create = false;
3293 3294 3295 3296 3297
	end = F2FS_I_SB(inode)->max_file_blocks;

	while (map.m_lblk < end) {
		map.m_len = end - map.m_lblk;

C
Chao Yu 已提交
3298
		down_write(&fi->i_gc_rwsem[WRITE]);
3299
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_PRECACHE);
C
Chao Yu 已提交
3300
		up_write(&fi->i_gc_rwsem[WRITE]);
3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314
		if (err)
			return err;

		map.m_lblk = m_next_extent;
	}

	return err;
}

static int f2fs_ioc_precache_extents(struct file *filp, unsigned long arg)
{
	return f2fs_precache_extents(file_inode(filp));
}

3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335
static int f2fs_ioc_resize_fs(struct file *filp, unsigned long arg)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(file_inode(filp));
	__u64 block_count;
	int ret;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	if (f2fs_readonly(sbi->sb))
		return -EROFS;

	if (copy_from_user(&block_count, (void __user *)arg,
			   sizeof(block_count)))
		return -EFAULT;

	ret = f2fs_resize_fs(sbi, block_count);

	return ret;
}

E
Eric Biggers 已提交
3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359
static int f2fs_ioc_enable_verity(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);

	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);

	if (!f2fs_sb_has_verity(F2FS_I_SB(inode))) {
		f2fs_warn(F2FS_I_SB(inode),
			  "Can't enable fs-verity on inode %lu: the verity feature is not enabled on this filesystem.\n",
			  inode->i_ino);
		return -EOPNOTSUPP;
	}

	return fsverity_ioctl_enable(filp, (const void __user *)arg);
}

static int f2fs_ioc_measure_verity(struct file *filp, unsigned long arg)
{
	if (!f2fs_sb_has_verity(F2FS_I_SB(file_inode(filp))))
		return -EOPNOTSUPP;

	return fsverity_ioctl_measure(filp, (void __user *)arg);
}

C
Chao Yu 已提交
3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421
static int f2fs_get_volume_name(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	char *vbuf;
	int count;
	int err = 0;

	vbuf = f2fs_kzalloc(sbi, MAX_VOLUME_NAME, GFP_KERNEL);
	if (!vbuf)
		return -ENOMEM;

	down_read(&sbi->sb_lock);
	count = utf16s_to_utf8s(sbi->raw_super->volume_name,
			ARRAY_SIZE(sbi->raw_super->volume_name),
			UTF16_LITTLE_ENDIAN, vbuf, MAX_VOLUME_NAME);
	up_read(&sbi->sb_lock);

	if (copy_to_user((char __user *)arg, vbuf,
				min(FSLABEL_MAX, count)))
		err = -EFAULT;

	kvfree(vbuf);
	return err;
}

static int f2fs_set_volume_name(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	char *vbuf;
	int err = 0;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	vbuf = strndup_user((const char __user *)arg, FSLABEL_MAX);
	if (IS_ERR(vbuf))
		return PTR_ERR(vbuf);

	err = mnt_want_write_file(filp);
	if (err)
		goto out;

	down_write(&sbi->sb_lock);

	memset(sbi->raw_super->volume_name, 0,
			sizeof(sbi->raw_super->volume_name));
	utf8s_to_utf16s(vbuf, strlen(vbuf), UTF16_LITTLE_ENDIAN,
			sbi->raw_super->volume_name,
			ARRAY_SIZE(sbi->raw_super->volume_name));

	err = f2fs_commit_super(sbi, false);

	up_write(&sbi->sb_lock);

	mnt_drop_write_file(filp);
out:
	kfree(vbuf);
	return err;
}

3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436
static int f2fs_get_compress_blocks(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	__u64 blocks;

	if (!f2fs_sb_has_compression(F2FS_I_SB(inode)))
		return -EOPNOTSUPP;

	if (!f2fs_compressed_file(inode))
		return -EINVAL;

	blocks = F2FS_I(inode)->i_compr_blocks;
	return put_user(blocks, (u64 __user *)arg);
}

3437 3438
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
3439 3440
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
		return -EIO;
3441 3442
	if (!f2fs_is_checkpoint_ready(F2FS_I_SB(file_inode(filp))))
		return -ENOSPC;
3443

3444 3445 3446 3447 3448
	switch (cmd) {
	case F2FS_IOC_GETFLAGS:
		return f2fs_ioc_getflags(filp, arg);
	case F2FS_IOC_SETFLAGS:
		return f2fs_ioc_setflags(filp, arg);
C
Chao Yu 已提交
3449 3450
	case F2FS_IOC_GETVERSION:
		return f2fs_ioc_getversion(filp, arg);
J
Jaegeuk Kim 已提交
3451 3452 3453 3454
	case F2FS_IOC_START_ATOMIC_WRITE:
		return f2fs_ioc_start_atomic_write(filp);
	case F2FS_IOC_COMMIT_ATOMIC_WRITE:
		return f2fs_ioc_commit_atomic_write(filp);
3455 3456
	case F2FS_IOC_START_VOLATILE_WRITE:
		return f2fs_ioc_start_volatile_write(filp);
3457 3458 3459 3460
	case F2FS_IOC_RELEASE_VOLATILE_WRITE:
		return f2fs_ioc_release_volatile_write(filp);
	case F2FS_IOC_ABORT_VOLATILE_WRITE:
		return f2fs_ioc_abort_volatile_write(filp);
J
Jaegeuk Kim 已提交
3461 3462
	case F2FS_IOC_SHUTDOWN:
		return f2fs_ioc_shutdown(filp, arg);
3463 3464
	case FITRIM:
		return f2fs_ioc_fitrim(filp, arg);
3465 3466 3467 3468 3469 3470
	case F2FS_IOC_SET_ENCRYPTION_POLICY:
		return f2fs_ioc_set_encryption_policy(filp, arg);
	case F2FS_IOC_GET_ENCRYPTION_POLICY:
		return f2fs_ioc_get_encryption_policy(filp, arg);
	case F2FS_IOC_GET_ENCRYPTION_PWSALT:
		return f2fs_ioc_get_encryption_pwsalt(filp, arg);
E
Eric Biggers 已提交
3471 3472 3473 3474 3475 3476 3477 3478 3479 3480
	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
		return f2fs_ioc_get_encryption_policy_ex(filp, arg);
	case FS_IOC_ADD_ENCRYPTION_KEY:
		return f2fs_ioc_add_encryption_key(filp, arg);
	case FS_IOC_REMOVE_ENCRYPTION_KEY:
		return f2fs_ioc_remove_encryption_key(filp, arg);
	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
		return f2fs_ioc_remove_encryption_key_all_users(filp, arg);
	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
		return f2fs_ioc_get_encryption_key_status(filp, arg);
3481 3482
	case FS_IOC_GET_ENCRYPTION_NONCE:
		return f2fs_ioc_get_encryption_nonce(filp, arg);
3483 3484
	case F2FS_IOC_GARBAGE_COLLECT:
		return f2fs_ioc_gc(filp, arg);
3485 3486
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
		return f2fs_ioc_gc_range(filp, arg);
3487
	case F2FS_IOC_WRITE_CHECKPOINT:
C
Chao Yu 已提交
3488
		return f2fs_ioc_write_checkpoint(filp, arg);
C
Chao Yu 已提交
3489 3490
	case F2FS_IOC_DEFRAGMENT:
		return f2fs_ioc_defragment(filp, arg);
3491 3492
	case F2FS_IOC_MOVE_RANGE:
		return f2fs_ioc_move_range(filp, arg);
3493 3494
	case F2FS_IOC_FLUSH_DEVICE:
		return f2fs_ioc_flush_device(filp, arg);
3495 3496
	case F2FS_IOC_GET_FEATURES:
		return f2fs_ioc_get_features(filp, arg);
3497 3498 3499 3500
	case F2FS_IOC_FSGETXATTR:
		return f2fs_ioc_fsgetxattr(filp, arg);
	case F2FS_IOC_FSSETXATTR:
		return f2fs_ioc_fssetxattr(filp, arg);
3501 3502 3503 3504
	case F2FS_IOC_GET_PIN_FILE:
		return f2fs_ioc_get_pin_file(filp, arg);
	case F2FS_IOC_SET_PIN_FILE:
		return f2fs_ioc_set_pin_file(filp, arg);
3505 3506
	case F2FS_IOC_PRECACHE_EXTENTS:
		return f2fs_ioc_precache_extents(filp, arg);
3507 3508
	case F2FS_IOC_RESIZE_FS:
		return f2fs_ioc_resize_fs(filp, arg);
E
Eric Biggers 已提交
3509 3510 3511 3512
	case FS_IOC_ENABLE_VERITY:
		return f2fs_ioc_enable_verity(filp, arg);
	case FS_IOC_MEASURE_VERITY:
		return f2fs_ioc_measure_verity(filp, arg);
C
Chao Yu 已提交
3513 3514 3515 3516
	case F2FS_IOC_GET_VOLUME_NAME:
		return f2fs_get_volume_name(filp, arg);
	case F2FS_IOC_SET_VOLUME_NAME:
		return f2fs_set_volume_name(filp, arg);
3517 3518
	case F2FS_IOC_GET_COMPRESS_BLOCKS:
		return f2fs_get_compress_blocks(filp, arg);
J
Jaegeuk Kim 已提交
3519 3520 3521 3522 3523
	default:
		return -ENOTTY;
	}
}

C
Chao Yu 已提交
3524 3525 3526 3527
static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
C
Chao Yu 已提交
3528
	int ret;
C
Chao Yu 已提交
3529 3530 3531 3532

	if (!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;

C
Chao Yu 已提交
3533 3534 3535 3536 3537 3538
	ret = generic_file_read_iter(iocb, iter);

	if (ret > 0)
		f2fs_update_iostat(F2FS_I_SB(inode), APP_READ_IO, ret);

	return ret;
C
Chao Yu 已提交
3539 3540
}

3541 3542
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
3543 3544 3545
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
	ssize_t ret;
3546

3547 3548 3549 3550
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) {
		ret = -EIO;
		goto out;
	}
3551

C
Chao Yu 已提交
3552 3553 3554 3555
	if (!f2fs_is_compress_backend_ready(inode)) {
		ret = -EOPNOTSUPP;
		goto out;
	}
C
Chao Yu 已提交
3556

3557 3558
	if (iocb->ki_flags & IOCB_NOWAIT) {
		if (!inode_trylock(inode)) {
3559 3560 3561
			ret = -EAGAIN;
			goto out;
		}
3562
	} else {
H
Hyunchul Lee 已提交
3563 3564 3565
		inode_lock(inode);
	}

3566 3567
	ret = generic_write_checks(iocb, from);
	if (ret > 0) {
3568 3569
		bool preallocated = false;
		size_t target_size = 0;
3570
		int err;
3571

3572 3573
		if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
			set_inode_flag(inode, FI_NO_PREALLOC);
3574

3575 3576
		if ((iocb->ki_flags & IOCB_NOWAIT)) {
			if (!f2fs_overwrite_io(inode, iocb->ki_pos,
H
Hyunchul Lee 已提交
3577
						iov_iter_count(from)) ||
3578 3579 3580 3581 3582 3583 3584
				f2fs_has_inline_data(inode) ||
				f2fs_force_buffered_io(inode, iocb, from)) {
				clear_inode_flag(inode, FI_NO_PREALLOC);
				inode_unlock(inode);
				ret = -EAGAIN;
				goto out;
			}
3585 3586
			goto write;
		}
3587

3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617
		if (is_inode_flag_set(inode, FI_NO_PREALLOC))
			goto write;

		if (iocb->ki_flags & IOCB_DIRECT) {
			/*
			 * Convert inline data for Direct I/O before entering
			 * f2fs_direct_IO().
			 */
			err = f2fs_convert_inline_inode(inode);
			if (err)
				goto out_err;
			/*
			 * If force_buffere_io() is true, we have to allocate
			 * blocks all the time, since f2fs_direct_IO will fall
			 * back to buffered IO.
			 */
			if (!f2fs_force_buffered_io(inode, iocb, from) &&
					allow_outplace_dio(inode, iocb, from))
				goto write;
		}
		preallocated = true;
		target_size = iocb->ki_pos + iov_iter_count(from);

		err = f2fs_preallocate_blocks(iocb, from);
		if (err) {
out_err:
			clear_inode_flag(inode, FI_NO_PREALLOC);
			inode_unlock(inode);
			ret = err;
			goto out;
3618
		}
3619
write:
3620
		ret = __generic_file_write_iter(iocb, from);
3621
		clear_inode_flag(inode, FI_NO_PREALLOC);
C
Chao Yu 已提交
3622

3623 3624 3625 3626
		/* if we couldn't write data, we should deallocate blocks. */
		if (preallocated && i_size_read(inode) < target_size)
			f2fs_truncate(inode);

C
Chao Yu 已提交
3627 3628
		if (ret > 0)
			f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret);
3629 3630
	}
	inode_unlock(inode);
3631 3632 3633
out:
	trace_f2fs_file_write_iter(inode, iocb->ki_pos,
					iov_iter_count(from), ret);
3634 3635
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
3636
	return ret;
3637 3638
}

3639 3640 3641 3642 3643 3644 3645 3646 3647 3648
#ifdef CONFIG_COMPAT
long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	switch (cmd) {
	case F2FS_IOC32_GETFLAGS:
		cmd = F2FS_IOC_GETFLAGS;
		break;
	case F2FS_IOC32_SETFLAGS:
		cmd = F2FS_IOC_SETFLAGS;
		break;
3649 3650 3651 3652 3653 3654 3655 3656 3657
	case F2FS_IOC32_GETVERSION:
		cmd = F2FS_IOC_GETVERSION;
		break;
	case F2FS_IOC_START_ATOMIC_WRITE:
	case F2FS_IOC_COMMIT_ATOMIC_WRITE:
	case F2FS_IOC_START_VOLATILE_WRITE:
	case F2FS_IOC_RELEASE_VOLATILE_WRITE:
	case F2FS_IOC_ABORT_VOLATILE_WRITE:
	case F2FS_IOC_SHUTDOWN:
3658
	case FITRIM:
3659 3660 3661
	case F2FS_IOC_SET_ENCRYPTION_POLICY:
	case F2FS_IOC_GET_ENCRYPTION_PWSALT:
	case F2FS_IOC_GET_ENCRYPTION_POLICY:
E
Eric Biggers 已提交
3662 3663 3664 3665 3666
	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
	case FS_IOC_ADD_ENCRYPTION_KEY:
	case FS_IOC_REMOVE_ENCRYPTION_KEY:
	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
3667
	case FS_IOC_GET_ENCRYPTION_NONCE:
3668
	case F2FS_IOC_GARBAGE_COLLECT:
3669
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
3670 3671
	case F2FS_IOC_WRITE_CHECKPOINT:
	case F2FS_IOC_DEFRAGMENT:
3672
	case F2FS_IOC_MOVE_RANGE:
3673
	case F2FS_IOC_FLUSH_DEVICE:
3674
	case F2FS_IOC_GET_FEATURES:
3675 3676
	case F2FS_IOC_FSGETXATTR:
	case F2FS_IOC_FSSETXATTR:
3677 3678
	case F2FS_IOC_GET_PIN_FILE:
	case F2FS_IOC_SET_PIN_FILE:
3679
	case F2FS_IOC_PRECACHE_EXTENTS:
3680
	case F2FS_IOC_RESIZE_FS:
E
Eric Biggers 已提交
3681 3682
	case FS_IOC_ENABLE_VERITY:
	case FS_IOC_MEASURE_VERITY:
C
Chao Yu 已提交
3683 3684
	case F2FS_IOC_GET_VOLUME_NAME:
	case F2FS_IOC_SET_VOLUME_NAME:
3685
	case F2FS_IOC_GET_COMPRESS_BLOCKS:
3686
		break;
3687 3688 3689 3690 3691 3692 3693
	default:
		return -ENOIOCTLCMD;
	}
	return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
}
#endif

J
Jaegeuk Kim 已提交
3694
const struct file_operations f2fs_file_operations = {
3695
	.llseek		= f2fs_llseek,
C
Chao Yu 已提交
3696
	.read_iter	= f2fs_file_read_iter,
3697 3698
	.write_iter	= f2fs_file_write_iter,
	.open		= f2fs_file_open,
3699
	.release	= f2fs_release_file,
J
Jaegeuk Kim 已提交
3700
	.mmap		= f2fs_file_mmap,
3701
	.flush		= f2fs_file_flush,
J
Jaegeuk Kim 已提交
3702 3703 3704
	.fsync		= f2fs_sync_file,
	.fallocate	= f2fs_fallocate,
	.unlocked_ioctl	= f2fs_ioctl,
3705 3706 3707
#ifdef CONFIG_COMPAT
	.compat_ioctl	= f2fs_compat_ioctl,
#endif
J
Jaegeuk Kim 已提交
3708
	.splice_read	= generic_file_splice_read,
A
Al Viro 已提交
3709
	.splice_write	= iter_file_splice_write,
J
Jaegeuk Kim 已提交
3710
};