file.c 63.9 KB
Newer Older
J
Jaegeuk Kim 已提交
1
/*
J
Jaegeuk Kim 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15
 * fs/f2fs/file.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/stat.h>
#include <linux/buffer_head.h>
#include <linux/writeback.h>
16
#include <linux/blkdev.h>
J
Jaegeuk Kim 已提交
17 18
#include <linux/falloc.h>
#include <linux/types.h>
19
#include <linux/compat.h>
J
Jaegeuk Kim 已提交
20 21
#include <linux/uaccess.h>
#include <linux/mount.h>
22
#include <linux/pagevec.h>
23
#include <linux/uio.h>
24
#include <linux/uuid.h>
25
#include <linux/file.h>
J
Jaegeuk Kim 已提交
26 27 28 29 30 31

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

36 37 38 39 40 41 42 43 44 45 46 47
static int f2fs_filemap_fault(struct vm_fault *vmf)
{
	struct inode *inode = file_inode(vmf->vma->vm_file);
	int err;

	down_read(&F2FS_I(inode)->i_mmap_sem);
	err = filemap_fault(vmf);
	up_read(&F2FS_I(inode)->i_mmap_sem);

	return err;
}

48
static int f2fs_vm_page_mkwrite(struct vm_fault *vmf)
J
Jaegeuk Kim 已提交
49 50
{
	struct page *page = vmf->page;
51
	struct inode *inode = file_inode(vmf->vma->vm_file);
52
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
53
	struct dnode_of_data dn;
54
	int err;
J
Jaegeuk Kim 已提交
55 56

	sb_start_pagefault(inode->i_sb);
57 58

	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
59

J
Jaegeuk Kim 已提交
60
	/* block allocation */
61
	f2fs_lock_op(sbi);
62
	set_new_dnode(&dn, inode, NULL, NULL, 0);
63
	err = f2fs_reserve_block(&dn, page->index);
64 65
	if (err) {
		f2fs_unlock_op(sbi);
66
		goto out;
67 68 69
	}
	f2fs_put_dnode(&dn);
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
70

J
Jaegeuk Kim 已提交
71
	f2fs_balance_fs(sbi, dn.node_changed);
72

73
	file_update_time(vmf->vma->vm_file);
74
	down_read(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
75
	lock_page(page);
76
	if (unlikely(page->mapping != inode->i_mapping ||
77
			page_offset(page) > i_size_read(inode) ||
78
			!PageUptodate(page))) {
J
Jaegeuk Kim 已提交
79 80
		unlock_page(page);
		err = -EFAULT;
81
		goto out_sem;
J
Jaegeuk Kim 已提交
82 83 84 85 86 87
	}

	/*
	 * check to see if the page is mapped already (no holes)
	 */
	if (PageMappedToDisk(page))
88
		goto mapped;
J
Jaegeuk Kim 已提交
89 90

	/* page is wholly or partially inside EOF */
91
	if (((loff_t)(page->index + 1) << PAGE_SHIFT) >
C
Chao Yu 已提交
92
						i_size_read(inode)) {
J
Jaegeuk Kim 已提交
93
		unsigned offset;
94 95
		offset = i_size_read(inode) & ~PAGE_MASK;
		zero_user_segment(page, offset, PAGE_SIZE);
J
Jaegeuk Kim 已提交
96 97
	}
	set_page_dirty(page);
98 99
	if (!PageUptodate(page))
		SetPageUptodate(page);
J
Jaegeuk Kim 已提交
100

101
	trace_f2fs_vm_page_mkwrite(page, DATA);
102 103
mapped:
	/* fill the page */
104
	f2fs_wait_on_page_writeback(page, DATA, false);
105 106 107 108 109

	/* wait for GCed encrypted page writeback */
	if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
		f2fs_wait_on_encrypted_page_writeback(sbi, dn.data_blkaddr);

110 111
out_sem:
	up_read(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
112 113
out:
	sb_end_pagefault(inode->i_sb);
114
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
115 116 117 118
	return block_page_mkwrite_return(err);
}

static const struct vm_operations_struct f2fs_file_vm_ops = {
119
	.fault		= f2fs_filemap_fault,
120
	.map_pages	= filemap_map_pages,
121
	.page_mkwrite	= f2fs_vm_page_mkwrite,
J
Jaegeuk Kim 已提交
122 123
};

124 125 126 127 128 129 130 131 132 133
static int get_parent_ino(struct inode *inode, nid_t *pino)
{
	struct dentry *dentry;

	inode = igrab(inode);
	dentry = d_find_any_alias(inode);
	iput(inode);
	if (!dentry)
		return 0;

134 135
	*pino = parent_ino(dentry);
	dput(dentry);
136 137 138
	return 1;
}

139 140
static inline bool need_do_checkpoint(struct inode *inode)
{
141
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
142 143 144 145
	bool need_cp = false;

	if (!S_ISREG(inode->i_mode) || inode->i_nlink != 1)
		need_cp = true;
146
	else if (is_sbi_flag_set(sbi, SBI_NEED_CP))
147
		need_cp = true;
148 149 150 151 152 153
	else if (file_wrong_pino(inode))
		need_cp = true;
	else if (!space_for_roll_forward(sbi))
		need_cp = true;
	else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino))
		need_cp = true;
154 155
	else if (test_opt(sbi, FASTBOOT))
		need_cp = true;
156 157
	else if (sbi->active_logs == 2)
		need_cp = true;
158 159 160 161

	return need_cp;
}

162 163 164 165 166 167 168 169 170 171 172
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 */
	if ((i && PageDirty(i)) || need_inode_block_update(sbi, ino))
		ret = true;
	f2fs_put_page(i, 0);
	return ret;
}

173 174 175 176 177 178 179 180
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)) {
181
		f2fs_i_pino_write(inode, pino);
182 183
		file_got_pino(inode);
	}
184
	up_write(&fi->i_sem);
185 186
}

187 188
static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
						int datasync, bool atomic)
J
Jaegeuk Kim 已提交
189 190
{
	struct inode *inode = file->f_mapping->host;
191
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
192
	nid_t ino = inode->i_ino;
J
Jaegeuk Kim 已提交
193 194 195
	int ret = 0;
	bool need_cp = false;
	struct writeback_control wbc = {
196
		.sync_mode = WB_SYNC_ALL,
J
Jaegeuk Kim 已提交
197 198 199 200
		.nr_to_write = LONG_MAX,
		.for_reclaim = 0,
	};

201
	if (unlikely(f2fs_readonly(inode->i_sb)))
202 203
		return 0;

204
	trace_f2fs_sync_file_enter(inode);
205 206

	/* if fdatasync is triggered, let's do in-place-update */
J
Jaegeuk Kim 已提交
207
	if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
208
		set_inode_flag(inode, FI_NEED_IPU);
J
Jaegeuk Kim 已提交
209
	ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
210
	clear_inode_flag(inode, FI_NEED_IPU);
211

212 213
	if (ret) {
		trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret);
J
Jaegeuk Kim 已提交
214
		return ret;
215
	}
J
Jaegeuk Kim 已提交
216

217
	/* if the inode is dirty, let's recover all the time */
C
Chao Yu 已提交
218
	if (!f2fs_skip_inode_update(inode, datasync)) {
219
		f2fs_write_inode(inode, NULL);
220 221 222
		goto go_write;
	}

223 224 225
	/*
	 * if there is no written data, don't waste time to write recovery info.
	 */
226
	if (!is_inode_flag_set(inode, FI_APPEND_WRITE) &&
J
Jaegeuk Kim 已提交
227
			!exist_written_data(sbi, ino, APPEND_INO)) {
228

229 230
		/* it may call write_inode just prior to fsync */
		if (need_inode_page_update(sbi, ino))
231 232
			goto go_write;

233
		if (is_inode_flag_set(inode, FI_UPDATE_WRITE) ||
J
Jaegeuk Kim 已提交
234
				exist_written_data(sbi, ino, UPDATE_INO))
235 236 237
			goto flush_out;
		goto out;
	}
238
go_write:
239 240 241 242
	/*
	 * Both of fdatasync() and fsync() are able to be recovered from
	 * sudden-power-off.
	 */
243
	down_read(&F2FS_I(inode)->i_sem);
244
	need_cp = need_do_checkpoint(inode);
245
	up_read(&F2FS_I(inode)->i_sem);
246

J
Jaegeuk Kim 已提交
247 248 249
	if (need_cp) {
		/* all the dirty node pages should be flushed for POR */
		ret = f2fs_sync_fs(inode->i_sb, 1);
250

251 252 253 254 255
		/*
		 * We've secured consistency through sync_fs. Following pino
		 * will be used only for fsynced inodes after checkpoint.
		 */
		try_to_fix_pino(inode);
256 257
		clear_inode_flag(inode, FI_APPEND_WRITE);
		clear_inode_flag(inode, FI_UPDATE_WRITE);
258 259
		goto out;
	}
260
sync_nodes:
261
	ret = fsync_node_pages(sbi, inode, &wbc, atomic);
262 263
	if (ret)
		goto out;
264

265
	/* if cp_error was enabled, we should avoid infinite loop */
C
Chao Yu 已提交
266 267
	if (unlikely(f2fs_cp_error(sbi))) {
		ret = -EIO;
268
		goto out;
C
Chao Yu 已提交
269
	}
270

271
	if (need_inode_block_update(sbi, ino)) {
272
		f2fs_mark_inode_dirty_sync(inode, true);
273 274
		f2fs_write_inode(inode, NULL);
		goto sync_nodes;
J
Jaegeuk Kim 已提交
275
	}
276

277 278 279 280 281 282 283 284 285 286 287 288 289
	/*
	 * 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) {
		ret = wait_on_node_pages_writeback(sbi, ino);
		if (ret)
			goto out;
	}
290 291

	/* once recovery info is written, don't need to tack this */
292
	remove_ino_entry(sbi, ino, APPEND_INO);
293
	clear_inode_flag(inode, FI_APPEND_WRITE);
294
flush_out:
295
	remove_ino_entry(sbi, ino, UPDATE_INO);
296
	clear_inode_flag(inode, FI_UPDATE_WRITE);
297 298
	if (!atomic)
		ret = f2fs_issue_flush(sbi);
299
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
300
out:
301
	trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret);
302
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
303 304 305
	return ret;
}

306 307 308 309 310
int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
{
	return f2fs_do_sync_file(file, start, end, datasync, false);
}

311 312 313 314 315 316 317 318 319 320 321
static pgoff_t __get_first_dirty_index(struct address_space *mapping,
						pgoff_t pgofs, int whence)
{
	struct pagevec pvec;
	int nr_pages;

	if (whence != SEEK_DATA)
		return 0;

	/* find first dirty page index */
	pagevec_init(&pvec, 0);
J
Jaegeuk Kim 已提交
322 323
	nr_pages = pagevec_lookup_tag(&pvec, mapping, &pgofs,
					PAGECACHE_TAG_DIRTY, 1);
324
	pgofs = nr_pages ? pvec.pages[0]->index : ULONG_MAX;
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
	pagevec_release(&pvec);
	return pgofs;
}

static bool __found_offset(block_t blkaddr, pgoff_t dirty, pgoff_t pgofs,
							int whence)
{
	switch (whence) {
	case SEEK_DATA:
		if ((blkaddr == NEW_ADDR && dirty == pgofs) ||
			(blkaddr != NEW_ADDR && blkaddr != NULL_ADDR))
			return true;
		break;
	case SEEK_HOLE:
		if (blkaddr == NULL_ADDR)
			return true;
		break;
	}
	return false;
}

346 347 348 349 350
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;
351 352 353
	pgoff_t pgofs, end_offset, dirty;
	loff_t data_ofs = offset;
	loff_t isize;
354 355
	int err = 0;

A
Al Viro 已提交
356
	inode_lock(inode);
357 358 359 360 361 362

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

	/* handle inline data case */
C
Chao Yu 已提交
363
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
364 365 366 367 368
		if (whence == SEEK_HOLE)
			data_ofs = isize;
		goto found;
	}

369
	pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
370

371 372
	dirty = __get_first_dirty_index(inode->i_mapping, pgofs, whence);

373
	for (; data_ofs < isize; data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
374
		set_new_dnode(&dn, inode, NULL, NULL, 0);
375
		err = get_dnode_of_data(&dn, pgofs, LOOKUP_NODE);
376 377 378
		if (err && err != -ENOENT) {
			goto fail;
		} else if (err == -ENOENT) {
A
arter97 已提交
379
			/* direct node does not exists */
380
			if (whence == SEEK_DATA) {
381
				pgofs = get_next_page_offset(&dn, pgofs);
382 383 384 385 386 387
				continue;
			} else {
				goto found;
			}
		}

388
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
389 390 391 392

		/* find data/hole in dnode block */
		for (; dn.ofs_in_node < end_offset;
				dn.ofs_in_node++, pgofs++,
393
				data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
394
			block_t blkaddr;
395 396
			blkaddr = datablock_addr(dn.inode,
					dn.node_page, dn.ofs_in_node);
397

398
			if (__found_offset(blkaddr, dirty, pgofs, whence)) {
399 400 401 402 403 404 405 406 407 408
				f2fs_put_dnode(&dn);
				goto found;
			}
		}
		f2fs_put_dnode(&dn);
	}

	if (whence == SEEK_DATA)
		goto fail;
found:
409 410
	if (whence == SEEK_HOLE && data_ofs > isize)
		data_ofs = isize;
A
Al Viro 已提交
411
	inode_unlock(inode);
412 413
	return vfs_setpos(file, data_ofs, maxbytes);
fail:
A
Al Viro 已提交
414
	inode_unlock(inode);
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
	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:
431 432
		if (offset < 0)
			return -ENXIO;
433 434 435 436 437 438
		return f2fs_seek_block(file, offset, whence);
	}

	return -EINVAL;
}

J
Jaegeuk Kim 已提交
439 440
static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
{
441
	struct inode *inode = file_inode(file);
442
	int err;
443 444

	/* we don't need to use inline_data strictly */
445 446 447
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
448

J
Jaegeuk Kim 已提交
449 450 451 452 453
	file_accessed(file);
	vma->vm_ops = &f2fs_file_vm_ops;
	return 0;
}

454 455
static int f2fs_file_open(struct inode *inode, struct file *filp)
{
456
	struct dentry *dir;
457

C
Chao Yu 已提交
458 459
	if (f2fs_encrypted_inode(inode)) {
		int ret = fscrypt_get_encryption_info(inode);
460
		if (ret)
461
			return -EACCES;
462
		if (!fscrypt_has_encryption_key(inode))
463
			return -ENOKEY;
464
	}
465 466 467 468
	dir = dget_parent(file_dentry(filp));
	if (f2fs_encrypted_inode(d_inode(dir)) &&
			!fscrypt_has_permitted_context(d_inode(dir), inode)) {
		dput(dir);
469
		return -EPERM;
470 471
	}
	dput(dir);
C
Chao Yu 已提交
472
	return dquot_file_open(inode, filp);
473 474
}

475
int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
J
Jaegeuk Kim 已提交
476
{
477
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
J
Jaegeuk Kim 已提交
478
	struct f2fs_node *raw_node;
C
Chao Yu 已提交
479
	int nr_free = 0, ofs = dn->ofs_in_node, len = count;
J
Jaegeuk Kim 已提交
480
	__le32 *addr;
481 482 483 484
	int base = 0;

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

486
	raw_node = F2FS_NODE(dn->node_page);
487
	addr = blkaddr_in_node(raw_node) + base + ofs;
J
Jaegeuk Kim 已提交
488

C
Chris Fries 已提交
489
	for (; count > 0; count--, addr++, dn->ofs_in_node++) {
J
Jaegeuk Kim 已提交
490 491 492 493
		block_t blkaddr = le32_to_cpu(*addr);
		if (blkaddr == NULL_ADDR)
			continue;

J
Jaegeuk Kim 已提交
494
		dn->data_blkaddr = NULL_ADDR;
495
		set_data_blkaddr(dn);
J
Jaegeuk Kim 已提交
496
		invalidate_blocks(sbi, blkaddr);
497
		if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
498
			clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
J
Jaegeuk Kim 已提交
499 500
		nr_free++;
	}
C
Chao Yu 已提交
501

J
Jaegeuk Kim 已提交
502
	if (nr_free) {
C
Chao Yu 已提交
503 504 505 506 507 508
		pgoff_t fofs;
		/*
		 * once we invalidate valid blkaddr in range [ofs, ofs + count],
		 * we will invalidate all blkaddr in the whole range.
		 */
		fofs = start_bidx_of_node(ofs_of_node(dn->node_page),
509
							dn->inode) + ofs;
C
Chao Yu 已提交
510
		f2fs_update_extent_cache_range(dn, fofs, 0, len);
511
		dec_valid_block_count(sbi, dn->inode, nr_free);
J
Jaegeuk Kim 已提交
512 513
	}
	dn->ofs_in_node = ofs;
514

515
	f2fs_update_time(sbi, REQ_TIME);
516 517
	trace_f2fs_truncate_data_blocks_range(dn->inode, dn->nid,
					 dn->ofs_in_node, nr_free);
J
Jaegeuk Kim 已提交
518 519 520 521 522 523 524 525
	return nr_free;
}

void truncate_data_blocks(struct dnode_of_data *dn)
{
	truncate_data_blocks_range(dn, ADDRS_PER_BLOCK);
}

526
static int truncate_partial_data_page(struct inode *inode, u64 from,
527
								bool cache_only)
J
Jaegeuk Kim 已提交
528
{
529 530
	unsigned offset = from & (PAGE_SIZE - 1);
	pgoff_t index = from >> PAGE_SHIFT;
531
	struct address_space *mapping = inode->i_mapping;
J
Jaegeuk Kim 已提交
532 533
	struct page *page;

534
	if (!offset && !cache_only)
535
		return 0;
J
Jaegeuk Kim 已提交
536

537
	if (cache_only) {
538
		page = find_lock_page(mapping, index);
539 540 541
		if (page && PageUptodate(page))
			goto truncate_out;
		f2fs_put_page(page, 1);
542
		return 0;
543
	}
J
Jaegeuk Kim 已提交
544

545
	page = get_lock_data_page(inode, index, true);
546
	if (IS_ERR(page))
547
		return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
548
truncate_out:
549
	f2fs_wait_on_page_writeback(page, DATA, true);
550
	zero_user(page, offset, PAGE_SIZE - offset);
551 552 553 554

	/* An encrypted inode should have a key and truncate the last page. */
	f2fs_bug_on(F2FS_I_SB(inode), cache_only && f2fs_encrypted_inode(inode));
	if (!cache_only)
555
		set_page_dirty(page);
J
Jaegeuk Kim 已提交
556
	f2fs_put_page(page, 1);
557
	return 0;
J
Jaegeuk Kim 已提交
558 559
}

560
int truncate_blocks(struct inode *inode, u64 from, bool lock)
J
Jaegeuk Kim 已提交
561
{
562
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
563 564 565
	unsigned int blocksize = inode->i_sb->s_blocksize;
	struct dnode_of_data dn;
	pgoff_t free_from;
H
Huajun Li 已提交
566
	int count = 0, err = 0;
567
	struct page *ipage;
568
	bool truncate_page = false;
J
Jaegeuk Kim 已提交
569

570 571
	trace_f2fs_truncate_blocks_enter(inode, from);

572
	free_from = (pgoff_t)F2FS_BYTES_TO_BLK(from + blocksize - 1);
J
Jaegeuk Kim 已提交
573

574 575 576
	if (free_from >= sbi->max_file_blocks)
		goto free_partial;

577 578
	if (lock)
		f2fs_lock_op(sbi);
H
Huajun Li 已提交
579

580 581 582 583 584 585 586
	ipage = get_node_page(sbi, inode->i_ino);
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto out;
	}

	if (f2fs_has_inline_data(inode)) {
587
		truncate_inline_inode(inode, ipage, from);
588
		f2fs_put_page(ipage, 1);
589
		truncate_page = true;
590 591 592 593
		goto out;
	}

	set_new_dnode(&dn, inode, ipage, NULL, 0);
594
	err = get_dnode_of_data(&dn, free_from, LOOKUP_NODE_RA);
J
Jaegeuk Kim 已提交
595 596 597
	if (err) {
		if (err == -ENOENT)
			goto free_next;
598
		goto out;
599 600
	}

601
	count = ADDRS_PER_PAGE(dn.node_page, inode);
J
Jaegeuk Kim 已提交
602 603

	count -= dn.ofs_in_node;
604
	f2fs_bug_on(sbi, count < 0);
605

J
Jaegeuk Kim 已提交
606 607 608 609 610 611 612 613
	if (dn.ofs_in_node || IS_INODE(dn.node_page)) {
		truncate_data_blocks_range(&dn, count);
		free_from += count;
	}

	f2fs_put_dnode(&dn);
free_next:
	err = truncate_inode_blocks(inode, free_from);
614 615 616
out:
	if (lock)
		f2fs_unlock_op(sbi);
617
free_partial:
618 619
	/* lastly zero out the first data page */
	if (!err)
620
		err = truncate_partial_data_page(inode, from, truncate_page);
J
Jaegeuk Kim 已提交
621

622
	trace_f2fs_truncate_blocks_exit(inode, err);
J
Jaegeuk Kim 已提交
623 624 625
	return err;
}

626
int f2fs_truncate(struct inode *inode)
J
Jaegeuk Kim 已提交
627
{
628 629
	int err;

J
Jaegeuk Kim 已提交
630 631
	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
				S_ISLNK(inode->i_mode)))
632
		return 0;
J
Jaegeuk Kim 已提交
633

634 635
	trace_f2fs_truncate(inode);

636 637 638 639 640 641
#ifdef CONFIG_F2FS_FAULT_INJECTION
	if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
		f2fs_show_injection_info(FAULT_TRUNCATE);
		return -EIO;
	}
#endif
642
	/* we should check inline_data size */
643
	if (!f2fs_may_inline_data(inode)) {
644 645 646
		err = f2fs_convert_inline_inode(inode);
		if (err)
			return err;
647 648
	}

649
	err = truncate_blocks(inode, i_size_read(inode), true);
650 651 652
	if (err)
		return err;

653
	inode->i_mtime = inode->i_ctime = current_time(inode);
654
	f2fs_mark_inode_dirty_sync(inode, false);
655
	return 0;
J
Jaegeuk Kim 已提交
656 657
}

658
int f2fs_getattr(const struct path *path, struct kstat *stat,
C
Chao Yu 已提交
659
		 u32 request_mask, unsigned int query_flags)
J
Jaegeuk Kim 已提交
660
{
661
	struct inode *inode = d_inode(path->dentry);
C
Chao Yu 已提交
662 663 664
	struct f2fs_inode_info *fi = F2FS_I(inode);
	unsigned int flags;

665
	flags = fi->i_flags & (FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL);
C
Chao Yu 已提交
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
	if (flags & FS_APPEND_FL)
		stat->attributes |= STATX_ATTR_APPEND;
	if (flags & FS_COMPR_FL)
		stat->attributes |= STATX_ATTR_COMPRESSED;
	if (f2fs_encrypted_inode(inode))
		stat->attributes |= STATX_ATTR_ENCRYPTED;
	if (flags & FS_IMMUTABLE_FL)
		stat->attributes |= STATX_ATTR_IMMUTABLE;
	if (flags & FS_NODUMP_FL)
		stat->attributes |= STATX_ATTR_NODUMP;

	stat->attributes_mask |= (STATX_ATTR_APPEND |
				  STATX_ATTR_COMPRESSED |
				  STATX_ATTR_ENCRYPTED |
				  STATX_ATTR_IMMUTABLE |
				  STATX_ATTR_NODUMP);

J
Jaegeuk Kim 已提交
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
	generic_fillattr(inode, stat);
	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;
	if (ia_valid & ATTR_ATIME)
		inode->i_atime = timespec_trunc(attr->ia_atime,
						inode->i_sb->s_time_gran);
	if (ia_valid & ATTR_MTIME)
		inode->i_mtime = timespec_trunc(attr->ia_mtime,
						inode->i_sb->s_time_gran);
	if (ia_valid & ATTR_CTIME)
		inode->i_ctime = timespec_trunc(attr->ia_ctime,
						inode->i_sb->s_time_gran);
	if (ia_valid & ATTR_MODE) {
		umode_t mode = attr->ia_mode;

		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
			mode &= ~S_ISGID;
710
		set_acl_inode(inode, mode);
J
Jaegeuk Kim 已提交
711 712 713 714 715 716 717 718
	}
}
#else
#define __setattr_copy setattr_copy
#endif

int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
{
719
	struct inode *inode = d_inode(dentry);
J
Jaegeuk Kim 已提交
720
	int err;
721
	bool size_changed = false;
J
Jaegeuk Kim 已提交
722

723
	err = setattr_prepare(dentry, attr);
J
Jaegeuk Kim 已提交
724 725 726
	if (err)
		return err;

C
Chao Yu 已提交
727 728 729 730 731 732 733 734 735 736 737 738 739 740
	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))) {
		err = dquot_transfer(inode, attr);
		if (err)
			return err;
	}

741
	if (attr->ia_valid & ATTR_SIZE) {
742 743 744 745 746 747 748
		if (f2fs_encrypted_inode(inode)) {
			err = fscrypt_get_encryption_info(inode);
			if (err)
				return err;
			if (!fscrypt_has_encryption_key(inode))
				return -ENOKEY;
		}
749

750
		if (attr->ia_size <= i_size_read(inode)) {
751
			down_write(&F2FS_I(inode)->i_mmap_sem);
752
			truncate_setsize(inode, attr->ia_size);
753
			err = f2fs_truncate(inode);
754
			up_write(&F2FS_I(inode)->i_mmap_sem);
755 756
			if (err)
				return err;
757 758
		} else {
			/*
759 760
			 * do not trim all blocks after i_size if target size is
			 * larger than i_size.
761
			 */
762
			down_write(&F2FS_I(inode)->i_mmap_sem);
763
			truncate_setsize(inode, attr->ia_size);
764
			up_write(&F2FS_I(inode)->i_mmap_sem);
765 766

			/* should convert inline inode here */
767
			if (!f2fs_may_inline_data(inode)) {
768 769 770 771
				err = f2fs_convert_inline_inode(inode);
				if (err)
					return err;
			}
772
			inode->i_mtime = inode->i_ctime = current_time(inode);
773
		}
774 775

		size_changed = true;
J
Jaegeuk Kim 已提交
776 777 778 779 780
	}

	__setattr_copy(inode, attr);

	if (attr->ia_valid & ATTR_MODE) {
781
		err = posix_acl_chmod(inode, get_inode_mode(inode));
782 783 784
		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 已提交
785 786 787
		}
	}

788 789
	/* file size may changed here */
	f2fs_mark_inode_dirty_sync(inode, size_changed);
790 791 792 793

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

J
Jaegeuk Kim 已提交
794 795 796 797 798 799 800
	return err;
}

const struct inode_operations f2fs_file_inode_operations = {
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
801
	.set_acl	= f2fs_set_acl,
J
Jaegeuk Kim 已提交
802 803 804
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
J
Jaegeuk Kim 已提交
805
	.fiemap		= f2fs_fiemap,
J
Jaegeuk Kim 已提交
806 807
};

C
Chao Yu 已提交
808
static int fill_zero(struct inode *inode, pgoff_t index,
J
Jaegeuk Kim 已提交
809 810
					loff_t start, loff_t len)
{
811
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
812 813 814
	struct page *page;

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

J
Jaegeuk Kim 已提交
817
	f2fs_balance_fs(sbi, true);
818

819
	f2fs_lock_op(sbi);
820
	page = get_new_data_page(inode, NULL, index, false);
821
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
822

C
Chao Yu 已提交
823 824 825
	if (IS_ERR(page))
		return PTR_ERR(page);

826
	f2fs_wait_on_page_writeback(page, DATA, true);
C
Chao Yu 已提交
827 828 829 830
	zero_user(page, start, len);
	set_page_dirty(page);
	f2fs_put_page(page, 1);
	return 0;
J
Jaegeuk Kim 已提交
831 832 833 834 835 836
}

int truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end)
{
	int err;

837
	while (pg_start < pg_end) {
J
Jaegeuk Kim 已提交
838
		struct dnode_of_data dn;
839
		pgoff_t end_offset, count;
840

J
Jaegeuk Kim 已提交
841
		set_new_dnode(&dn, inode, NULL, NULL, 0);
842
		err = get_dnode_of_data(&dn, pg_start, LOOKUP_NODE);
J
Jaegeuk Kim 已提交
843
		if (err) {
844 845
			if (err == -ENOENT) {
				pg_start++;
J
Jaegeuk Kim 已提交
846
				continue;
847
			}
J
Jaegeuk Kim 已提交
848 849 850
			return err;
		}

851
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
852 853 854 855 856
		count = min(end_offset - dn.ofs_in_node, pg_end - pg_start);

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

		truncate_data_blocks_range(&dn, count);
J
Jaegeuk Kim 已提交
857
		f2fs_put_dnode(&dn);
858 859

		pg_start += count;
J
Jaegeuk Kim 已提交
860 861 862 863
	}
	return 0;
}

C
Chao Yu 已提交
864
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
J
Jaegeuk Kim 已提交
865 866 867
{
	pgoff_t pg_start, pg_end;
	loff_t off_start, off_end;
868
	int ret;
J
Jaegeuk Kim 已提交
869

870 871 872
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
H
Huajun Li 已提交
873

874 875
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
J
Jaegeuk Kim 已提交
876

877 878
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
879 880

	if (pg_start == pg_end) {
C
Chao Yu 已提交
881
		ret = fill_zero(inode, pg_start, off_start,
J
Jaegeuk Kim 已提交
882
						off_end - off_start);
C
Chao Yu 已提交
883 884
		if (ret)
			return ret;
J
Jaegeuk Kim 已提交
885
	} else {
C
Chao Yu 已提交
886 887
		if (off_start) {
			ret = fill_zero(inode, pg_start++, off_start,
888
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
889 890 891 892 893 894 895 896
			if (ret)
				return ret;
		}
		if (off_end) {
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				return ret;
		}
J
Jaegeuk Kim 已提交
897 898 899 900

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

J
Jaegeuk Kim 已提交
903
			f2fs_balance_fs(sbi, true);
J
Jaegeuk Kim 已提交
904

905 906
			blk_start = (loff_t)pg_start << PAGE_SHIFT;
			blk_end = (loff_t)pg_end << PAGE_SHIFT;
907
			down_write(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
908 909
			truncate_inode_pages_range(mapping, blk_start,
					blk_end - 1);
910

911
			f2fs_lock_op(sbi);
J
Jaegeuk Kim 已提交
912
			ret = truncate_hole(inode, pg_start, pg_end);
913
			f2fs_unlock_op(sbi);
914
			up_write(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
915 916 917 918 919 920
		}
	}

	return ret;
}

921 922
static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
				int *do_replace, pgoff_t off, pgoff_t len)
C
Chao Yu 已提交
923 924 925
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct dnode_of_data dn;
926
	int ret, done, i;
927

928
next_dnode:
929
	set_new_dnode(&dn, inode, NULL, NULL, 0);
930
	ret = get_dnode_of_data(&dn, off, LOOKUP_NODE_RA);
931 932 933
	if (ret && ret != -ENOENT) {
		return ret;
	} else if (ret == -ENOENT) {
934 935 936 937 938 939 940 941 942 943 944
		if (dn.max_level == 0)
			return -ENOENT;
		done = min((pgoff_t)ADDRS_PER_BLOCK - dn.ofs_in_node, len);
		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++) {
945 946
		*blkaddr = datablock_addr(dn.inode,
					dn.node_page, dn.ofs_in_node);
947 948 949 950 951 952 953
		if (!is_checkpointed_data(sbi, *blkaddr)) {

			if (test_opt(sbi, LFS)) {
				f2fs_put_dnode(&dn);
				return -ENOTSUPP;
			}

954
			/* do not invalidate this block address */
955
			f2fs_update_data_blkaddr(&dn, NULL_ADDR);
956
			*do_replace = 1;
C
Chao Yu 已提交
957
		}
958
	}
959 960 961 962 963 964 965 966
	f2fs_put_dnode(&dn);
next:
	len -= done;
	off += done;
	if (len)
		goto next_dnode;
	return 0;
}
C
Chao Yu 已提交
967

968 969 970 971 972 973
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 已提交
974

975 976 977
	for (i = 0; i < len; i++, do_replace++, blkaddr++) {
		if (*do_replace == 0)
			continue;
C
Chao Yu 已提交
978

979 980 981 982 983 984 985
		set_new_dnode(&dn, inode, NULL, NULL, 0);
		ret = get_dnode_of_data(&dn, off + i, LOOKUP_NODE_RA);
		if (ret) {
			dec_valid_block_count(sbi, inode, 1);
			invalidate_blocks(sbi, *blkaddr);
		} else {
			f2fs_update_data_blkaddr(&dn, *blkaddr);
986
		}
987 988 989 990 991 992 993 994 995 996 997 998
		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;
999

1000 1001 1002 1003
	while (i < len) {
		if (blkaddr[i] == NULL_ADDR && !full) {
			i++;
			continue;
1004
		}
C
Chao Yu 已提交
1005

1006 1007 1008 1009 1010
		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 已提交
1011

1012 1013 1014 1015
			set_new_dnode(&dn, dst_inode, NULL, NULL, 0);
			ret = get_dnode_of_data(&dn, dst + i, ALLOC_NODE);
			if (ret)
				return ret;
C
Chao Yu 已提交
1016

1017 1018 1019 1020 1021
			get_node_info(sbi, dn.nid, &ni);
			ilen = min((pgoff_t)
				ADDRS_PER_PAGE(dn.node_page, dst_inode) -
						dn.ofs_in_node, len - i);
			do {
1022 1023
				dn.data_blkaddr = datablock_addr(dn.inode,
						dn.node_page, dn.ofs_in_node);
1024 1025 1026 1027
				truncate_data_blocks_range(&dn, 1);

				if (do_replace[i]) {
					f2fs_i_blocks_write(src_inode,
C
Chao Yu 已提交
1028
							1, false, false);
1029
					f2fs_i_blocks_write(dst_inode,
C
Chao Yu 已提交
1030
							1, true, false);
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
					f2fs_replace_block(sbi, &dn, dn.data_blkaddr,
					blkaddr[i], ni.version, true, false);

					do_replace[i] = 0;
				}
				dn.ofs_in_node++;
				i++;
				new_size = (dst + i) << PAGE_SHIFT;
				if (dst_inode->i_size < new_size)
					f2fs_i_size_write(dst_inode, new_size);
1041
			} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
1042

1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
			f2fs_put_dnode(&dn);
		} else {
			struct page *psrc, *pdst;

			psrc = get_lock_data_page(src_inode, src + i, true);
			if (IS_ERR(psrc))
				return PTR_ERR(psrc);
			pdst = get_new_data_page(dst_inode, NULL, dst + i,
								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);
1059
			f2fs_put_page(psrc, 1);
C
Chao Yu 已提交
1060

1061 1062 1063 1064 1065
			ret = truncate_hole(src_inode, src + i, src + i + 1);
			if (ret)
				return ret;
			i++;
		}
1066 1067
	}
	return 0;
1068
}
C
Chao Yu 已提交
1069

1070 1071
static int __exchange_data_block(struct inode *src_inode,
			struct inode *dst_inode, pgoff_t src, pgoff_t dst,
1072
			pgoff_t len, bool full)
1073 1074 1075
{
	block_t *src_blkaddr;
	int *do_replace;
1076
	pgoff_t olen;
1077 1078
	int ret;

1079 1080
	while (len) {
		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len);
1081

M
Michal Hocko 已提交
1082
		src_blkaddr = kvzalloc(sizeof(block_t) * olen, GFP_KERNEL);
1083 1084
		if (!src_blkaddr)
			return -ENOMEM;
1085

M
Michal Hocko 已提交
1086
		do_replace = kvzalloc(sizeof(int) * olen, GFP_KERNEL);
1087 1088 1089 1090
		if (!do_replace) {
			kvfree(src_blkaddr);
			return -ENOMEM;
		}
1091

1092 1093 1094 1095
		ret = __read_out_blkaddrs(src_inode, src_blkaddr,
					do_replace, src, olen);
		if (ret)
			goto roll_back;
1096

1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
		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);
	}
1109 1110 1111 1112 1113 1114
	return 0;

roll_back:
	__roll_back_blkaddrs(src_inode, src_blkaddr, do_replace, src, len);
	kvfree(src_blkaddr);
	kvfree(do_replace);
1115 1116
	return ret;
}
C
Chao Yu 已提交
1117

1118 1119 1120 1121
static int f2fs_do_collapse(struct inode *inode, pgoff_t start, pgoff_t end)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	pgoff_t nrpages = (i_size_read(inode) + PAGE_SIZE - 1) / PAGE_SIZE;
1122
	int ret;
1123

1124 1125
	f2fs_balance_fs(sbi, true);
	f2fs_lock_op(sbi);
1126 1127 1128

	f2fs_drop_extent_tree(inode);

1129 1130
	ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
	f2fs_unlock_op(sbi);
C
Chao Yu 已提交
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
	return ret;
}

static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
{
	pgoff_t pg_start, pg_end;
	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;

1147 1148 1149
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1150

1151 1152
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1153

1154
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1155 1156 1157
	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1158
		goto out;
C
Chao Yu 已提交
1159 1160 1161 1162 1163

	truncate_pagecache(inode, offset);

	ret = f2fs_do_collapse(inode, pg_start, pg_end);
	if (ret)
1164
		goto out;
C
Chao Yu 已提交
1165

1166 1167 1168 1169
	/* write out all moved pages, if possible */
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);

C
Chao Yu 已提交
1170
	new_size = i_size_read(inode) - len;
1171
	truncate_pagecache(inode, new_size);
C
Chao Yu 已提交
1172 1173 1174

	ret = truncate_blocks(inode, new_size, true);
	if (!ret)
1175
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1176

1177 1178
out:
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1179 1180 1181
	return ret;
}

1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
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++) {
1192 1193
		if (datablock_addr(dn->inode, dn->node_page,
					dn->ofs_in_node) == NULL_ADDR)
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203
			count++;
	}

	dn->ofs_in_node = ofs_in_node;
	ret = reserve_new_blocks(dn, count);
	if (ret)
		return ret;

	dn->ofs_in_node = ofs_in_node;
	for (index = start; index < end; index++, dn->ofs_in_node++) {
1204 1205
		dn->data_blkaddr = datablock_addr(dn->inode,
					dn->node_page, dn->ofs_in_node);
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
		/*
		 * reserve_new_blocks will not guarantee entire block
		 * allocation.
		 */
		if (dn->data_blkaddr == NULL_ADDR) {
			ret = -ENOSPC;
			break;
		}
		if (dn->data_blkaddr != NEW_ADDR) {
			invalidate_blocks(sbi, dn->data_blkaddr);
			dn->data_blkaddr = NEW_ADDR;
			set_data_blkaddr(dn);
		}
	}

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

	return ret;
}

C
Chao Yu 已提交
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
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;

1240 1241 1242
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
C
Chao Yu 已提交
1243

1244
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1245 1246
	ret = filemap_write_and_wait_range(mapping, offset, offset + len - 1);
	if (ret)
1247
		goto out_sem;
C
Chao Yu 已提交
1248 1249 1250

	truncate_pagecache_range(inode, offset, offset + len - 1);

1251 1252
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1253

1254 1255
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
C
Chao Yu 已提交
1256 1257

	if (pg_start == pg_end) {
C
Chao Yu 已提交
1258 1259 1260
		ret = fill_zero(inode, pg_start, off_start,
						off_end - off_start);
		if (ret)
1261
			goto out_sem;
C
Chao Yu 已提交
1262

C
Chao Yu 已提交
1263 1264 1265
		new_size = max_t(loff_t, new_size, offset + len);
	} else {
		if (off_start) {
C
Chao Yu 已提交
1266
			ret = fill_zero(inode, pg_start++, off_start,
1267
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
1268
			if (ret)
1269
				goto out_sem;
C
Chao Yu 已提交
1270

C
Chao Yu 已提交
1271
			new_size = max_t(loff_t, new_size,
1272
					(loff_t)pg_start << PAGE_SHIFT);
C
Chao Yu 已提交
1273 1274
		}

1275
		for (index = pg_start; index < pg_end;) {
C
Chao Yu 已提交
1276
			struct dnode_of_data dn;
1277 1278
			unsigned int end_offset;
			pgoff_t end;
C
Chao Yu 已提交
1279 1280 1281

			f2fs_lock_op(sbi);

1282 1283
			set_new_dnode(&dn, inode, NULL, NULL, 0);
			ret = get_dnode_of_data(&dn, index, ALLOC_NODE);
C
Chao Yu 已提交
1284 1285 1286 1287 1288
			if (ret) {
				f2fs_unlock_op(sbi);
				goto out;
			}

1289 1290 1291 1292
			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 已提交
1293 1294
			f2fs_put_dnode(&dn);
			f2fs_unlock_op(sbi);
1295 1296 1297

			f2fs_balance_fs(sbi, dn.node_changed);

1298 1299
			if (ret)
				goto out;
C
Chao Yu 已提交
1300

1301
			index = end;
C
Chao Yu 已提交
1302
			new_size = max_t(loff_t, new_size,
1303
					(loff_t)index << PAGE_SHIFT);
C
Chao Yu 已提交
1304 1305 1306
		}

		if (off_end) {
C
Chao Yu 已提交
1307 1308 1309 1310
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				goto out;

C
Chao Yu 已提交
1311 1312 1313 1314 1315
			new_size = max_t(loff_t, new_size, offset + len);
		}
	}

out:
1316
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
1317
		f2fs_i_size_write(inode, new_size);
1318 1319
out_sem:
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1320 1321 1322 1323

	return ret;
}

C
Chao Yu 已提交
1324 1325 1326
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1327
	pgoff_t nr, pg_start, pg_end, delta, idx;
C
Chao Yu 已提交
1328
	loff_t new_size;
1329
	int ret = 0;
C
Chao Yu 已提交
1330 1331

	new_size = i_size_read(inode) + len;
1332 1333 1334
	ret = inode_newsize_ok(inode, new_size);
	if (ret)
		return ret;
C
Chao Yu 已提交
1335 1336 1337 1338 1339 1340 1341 1342

	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;

1343 1344 1345
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1346

J
Jaegeuk Kim 已提交
1347
	f2fs_balance_fs(sbi, true);
1348

1349
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1350 1351
	ret = truncate_blocks(inode, i_size_read(inode), true);
	if (ret)
1352
		goto out;
C
Chao Yu 已提交
1353 1354 1355 1356

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1357
		goto out;
C
Chao Yu 已提交
1358 1359 1360

	truncate_pagecache(inode, offset);

1361 1362
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1363
	delta = pg_end - pg_start;
1364 1365 1366 1367 1368 1369 1370
	idx = (i_size_read(inode) + PAGE_SIZE - 1) / PAGE_SIZE;

	while (!ret && idx > pg_start) {
		nr = idx - pg_start;
		if (nr > delta)
			nr = delta;
		idx -= nr;
C
Chao Yu 已提交
1371 1372

		f2fs_lock_op(sbi);
1373 1374
		f2fs_drop_extent_tree(inode);

1375 1376
		ret = __exchange_data_block(inode, inode, idx,
					idx + delta, nr, false);
C
Chao Yu 已提交
1377 1378 1379
		f2fs_unlock_op(sbi);
	}

1380 1381 1382 1383 1384
	/* write out all moved pages, if possible */
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);

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

J
Jaegeuk Kim 已提交
1391 1392 1393
static int expand_inode_data(struct inode *inode, loff_t offset,
					loff_t len, int mode)
{
1394
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1395 1396
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL };
	pgoff_t pg_end;
J
Jaegeuk Kim 已提交
1397
	loff_t new_size = i_size_read(inode);
1398
	loff_t off_end;
1399
	int err;
J
Jaegeuk Kim 已提交
1400

1401 1402 1403
	err = inode_newsize_ok(inode, (len + offset));
	if (err)
		return err;
J
Jaegeuk Kim 已提交
1404

1405 1406 1407
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
1408

J
Jaegeuk Kim 已提交
1409
	f2fs_balance_fs(sbi, true);
1410

1411
	pg_end = ((unsigned long long)offset + len) >> PAGE_SHIFT;
1412
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
1413

1414 1415 1416 1417
	map.m_lblk = ((unsigned long long)offset) >> PAGE_SHIFT;
	map.m_len = pg_end - map.m_lblk;
	if (off_end)
		map.m_len++;
1418

1419 1420
	err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
	if (err) {
1421
		pgoff_t last_off;
J
Jaegeuk Kim 已提交
1422

1423
		if (!map.m_len)
1424
			return err;
1425

1426 1427 1428 1429 1430 1431 1432
		last_off = map.m_lblk + map.m_len - 1;

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

1435
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
1436
		f2fs_i_size_write(inode, new_size);
J
Jaegeuk Kim 已提交
1437

1438
	return err;
J
Jaegeuk Kim 已提交
1439 1440 1441 1442 1443
}

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

1447 1448 1449 1450
	/* f2fs only support ->fallocate for regular file */
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

C
Chao Yu 已提交
1451 1452
	if (f2fs_encrypted_inode(inode) &&
		(mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))
1453 1454
		return -EOPNOTSUPP;

C
Chao Yu 已提交
1455
	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
C
Chao Yu 已提交
1456 1457
			FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
			FALLOC_FL_INSERT_RANGE))
J
Jaegeuk Kim 已提交
1458 1459
		return -EOPNOTSUPP;

A
Al Viro 已提交
1460
	inode_lock(inode);
1461

1462 1463 1464 1465
	if (mode & FALLOC_FL_PUNCH_HOLE) {
		if (offset >= inode->i_size)
			goto out;

C
Chao Yu 已提交
1466
		ret = punch_hole(inode, offset, len);
C
Chao Yu 已提交
1467 1468
	} else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
		ret = f2fs_collapse_range(inode, offset, len);
C
Chao Yu 已提交
1469 1470
	} else if (mode & FALLOC_FL_ZERO_RANGE) {
		ret = f2fs_zero_range(inode, offset, len, mode);
C
Chao Yu 已提交
1471 1472
	} else if (mode & FALLOC_FL_INSERT_RANGE) {
		ret = f2fs_insert_range(inode, offset, len);
C
Chao Yu 已提交
1473
	} else {
J
Jaegeuk Kim 已提交
1474
		ret = expand_inode_data(inode, offset, len, mode);
C
Chao Yu 已提交
1475
	}
J
Jaegeuk Kim 已提交
1476

1477
	if (!ret) {
1478
		inode->i_mtime = inode->i_ctime = current_time(inode);
1479
		f2fs_mark_inode_dirty_sync(inode, false);
1480 1481
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
1482
		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1483
	}
1484

1485
out:
A
Al Viro 已提交
1486
	inode_unlock(inode);
1487

1488
	trace_f2fs_fallocate(inode, mode, offset, len, ret);
J
Jaegeuk Kim 已提交
1489 1490 1491
	return ret;
}

1492 1493
static int f2fs_release_file(struct inode *inode, struct file *filp)
{
1494 1495 1496 1497 1498 1499 1500 1501
	/*
	 * 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;

1502 1503
	/* some remained atomic pages should discarded */
	if (f2fs_is_atomic_file(inode))
1504
		drop_inmem_pages(inode);
1505
	if (f2fs_is_volatile_file(inode)) {
1506
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1507
		stat_dec_volatile_write(inode);
1508
		set_inode_flag(inode, FI_DROP_CACHE);
1509
		filemap_fdatawrite(inode->i_mapping);
1510
		clear_inode_flag(inode, FI_DROP_CACHE);
1511 1512 1513 1514
	}
	return 0;
}

1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
static int f2fs_file_flush(struct file *file, fl_owner_t id)
{
	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)
		drop_inmem_pages(inode);
	return 0;
}

1531
static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
J
Jaegeuk Kim 已提交
1532
{
A
Al Viro 已提交
1533
	struct inode *inode = file_inode(filp);
J
Jaegeuk Kim 已提交
1534
	struct f2fs_inode_info *fi = F2FS_I(inode);
1535 1536
	unsigned int flags = fi->i_flags &
			(FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL);
1537 1538
	return put_user(flags, (int __user *)arg);
}
J
Jaegeuk Kim 已提交
1539

1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571
static int __f2fs_ioc_setflags(struct inode *inode, unsigned int flags)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	unsigned int oldflags;

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

	flags = f2fs_mask_flags(inode->i_mode, flags);

	oldflags = fi->i_flags;

	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL))
		if (!capable(CAP_LINUX_IMMUTABLE))
			return -EPERM;

	flags = flags & (FS_FL_USER_MODIFIABLE | FS_PROJINHERIT_FL);
	flags |= oldflags & ~(FS_FL_USER_MODIFIABLE | FS_PROJINHERIT_FL);
	fi->i_flags = flags;

	if (fi->i_flags & FS_PROJINHERIT_FL)
		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);
	f2fs_mark_inode_dirty_sync(inode, false);
	return 0;
}

1572 1573 1574
static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
1575
	unsigned int flags;
1576
	int ret;
J
Jaegeuk Kim 已提交
1577

1578 1579 1580 1581 1582 1583
	if (!inode_owner_or_capable(inode))
		return -EACCES;

	if (get_user(flags, (int __user *)arg))
		return -EFAULT;

1584 1585 1586
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;
J
Jaegeuk Kim 已提交
1587

A
Al Viro 已提交
1588
	inode_lock(inode);
J
Jaegeuk Kim 已提交
1589

1590
	ret = __f2fs_ioc_setflags(inode, flags);
J
Jaegeuk Kim 已提交
1591

1592
	inode_unlock(inode);
1593 1594 1595
	mnt_drop_write_file(filp);
	return ret;
}
1596

C
Chao Yu 已提交
1597 1598 1599 1600 1601 1602 1603
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 已提交
1604 1605 1606
static int f2fs_ioc_start_atomic_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1607
	int ret;
J
Jaegeuk Kim 已提交
1608 1609 1610 1611

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

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

1615 1616 1617 1618
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1619 1620
	inode_lock(inode);

1621
	if (f2fs_is_atomic_file(inode))
1622
		goto out;
J
Jaegeuk Kim 已提交
1623

1624 1625
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1626
		goto out;
J
Jaegeuk Kim 已提交
1627

1628
	set_inode_flag(inode, FI_ATOMIC_FILE);
1629
	set_inode_flag(inode, FI_HOT_DATA);
1630 1631
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);

1632
	if (!get_dirty_pages(inode))
1633
		goto inc_stat;
1634 1635

	f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
1636
		"Unexpected flush for atomic writes: ino=%lu, npages=%u",
1637 1638
					inode->i_ino, get_dirty_pages(inode));
	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
1639
	if (ret) {
1640
		clear_inode_flag(inode, FI_ATOMIC_FILE);
1641 1642 1643 1644
		goto out;
	}

inc_stat:
1645
	F2FS_I(inode)->inmem_task = current;
1646 1647
	stat_inc_atomic_write(inode);
	stat_update_max_atomic_write(inode);
1648
out:
1649
	inode_unlock(inode);
1650
	mnt_drop_write_file(filp);
1651
	return ret;
J
Jaegeuk Kim 已提交
1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665
}

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;

1666 1667
	inode_lock(inode);

1668 1669 1670
	if (f2fs_is_volatile_file(inode))
		goto err_out;

1671
	if (f2fs_is_atomic_file(inode)) {
1672
		ret = commit_inmem_pages(inode);
C
Chao Yu 已提交
1673
		if (ret)
1674
			goto err_out;
C
Chao Yu 已提交
1675

1676
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
C
Chao Yu 已提交
1677 1678 1679
		if (!ret) {
			clear_inode_flag(inode, FI_ATOMIC_FILE);
			stat_dec_atomic_write(inode);
1680
		}
1681 1682
	} else {
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1683
	}
1684
err_out:
1685
	inode_unlock(inode);
J
Jaegeuk Kim 已提交
1686 1687 1688 1689
	mnt_drop_write_file(filp);
	return ret;
}

1690 1691 1692
static int f2fs_ioc_start_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1693
	int ret;
1694 1695 1696 1697

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

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

1701 1702 1703 1704
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1705 1706
	inode_lock(inode);

1707
	if (f2fs_is_volatile_file(inode))
1708
		goto out;
1709

1710 1711
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1712
		goto out;
1713

1714 1715 1716
	stat_inc_volatile_write(inode);
	stat_update_max_volatile_write(inode);

1717
	set_inode_flag(inode, FI_VOLATILE_FILE);
1718
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1719
out:
1720
	inode_unlock(inode);
1721 1722
	mnt_drop_write_file(filp);
	return ret;
1723 1724
}

1725 1726 1727
static int f2fs_ioc_release_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1728
	int ret;
1729 1730 1731 1732

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

1733 1734 1735 1736
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1737 1738
	inode_lock(inode);

1739
	if (!f2fs_is_volatile_file(inode))
1740
		goto out;
1741

1742 1743 1744 1745
	if (!f2fs_is_first_block_written(inode)) {
		ret = truncate_partial_data_page(inode, 0, true);
		goto out;
	}
1746

1747 1748
	ret = punch_hole(inode, 0, F2FS_BLKSIZE);
out:
1749
	inode_unlock(inode);
1750 1751
	mnt_drop_write_file(filp);
	return ret;
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765
}

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;

1766 1767
	inode_lock(inode);

1768
	if (f2fs_is_atomic_file(inode))
1769
		drop_inmem_pages(inode);
1770
	if (f2fs_is_volatile_file(inode)) {
1771
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1772
		stat_dec_volatile_write(inode);
1773
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1774
	}
1775

1776 1777
	inode_unlock(inode);

1778
	mnt_drop_write_file(filp);
1779
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1780 1781 1782
	return ret;
}

J
Jaegeuk Kim 已提交
1783 1784 1785 1786 1787 1788
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;
1789
	int ret;
J
Jaegeuk Kim 已提交
1790 1791 1792 1793 1794 1795 1796

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

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

1797 1798 1799 1800
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

J
Jaegeuk Kim 已提交
1801 1802 1803 1804
	switch (in) {
	case F2FS_GOING_DOWN_FULLSYNC:
		sb = freeze_bdev(sb->s_bdev);
		if (sb && !IS_ERR(sb)) {
1805
			f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1806 1807 1808 1809 1810 1811
			thaw_bdev(sb->s_bdev, sb);
		}
		break;
	case F2FS_GOING_DOWN_METASYNC:
		/* do checkpoint only */
		f2fs_sync_fs(sb, 1);
1812
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1813 1814
		break;
	case F2FS_GOING_DOWN_NOSYNC:
1815
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1816
		break;
1817 1818
	case F2FS_GOING_DOWN_METAFLUSH:
		sync_meta_pages(sbi, META, LONG_MAX);
1819
		f2fs_stop_checkpoint(sbi, false);
1820
		break;
J
Jaegeuk Kim 已提交
1821
	default:
1822 1823
		ret = -EINVAL;
		goto out;
J
Jaegeuk Kim 已提交
1824
	}
1825
	f2fs_update_time(sbi, REQ_TIME);
1826 1827 1828
out:
	mnt_drop_write_file(filp);
	return ret;
J
Jaegeuk Kim 已提交
1829 1830
}

1831 1832 1833 1834 1835 1836 1837
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;
1838

1839 1840
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;
1841

1842 1843
	if (!blk_queue_discard(q))
		return -EOPNOTSUPP;
1844

1845 1846 1847
	if (copy_from_user(&range, (struct fstrim_range __user *)arg,
				sizeof(range)))
		return -EFAULT;
1848

1849 1850 1851 1852
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1853 1854 1855
	range.minlen = max((unsigned int)range.minlen,
				q->limits.discard_granularity);
	ret = f2fs_trim_fs(F2FS_SB(sb), &range);
1856
	mnt_drop_write_file(filp);
1857 1858
	if (ret < 0)
		return ret;
1859

1860 1861 1862
	if (copy_to_user((struct fstrim_range __user *)arg, &range,
				sizeof(range)))
		return -EFAULT;
1863
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1864 1865 1866
	return 0;
}

1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880
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);

1881
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1882

1883
	return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
1884 1885 1886 1887
}

static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg)
{
1888
	return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
}

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;

	if (!f2fs_sb_has_crypto(inode->i_sb))
		return -EOPNOTSUPP;

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

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

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

C
Chao Yu 已提交
1910
	err = f2fs_commit_super(sbi, false);
1911 1912 1913
	if (err) {
		/* undo new data */
		memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
1914
		mnt_drop_write_file(filp);
1915 1916
		return err;
	}
1917
	mnt_drop_write_file(filp);
1918 1919 1920 1921 1922 1923 1924
got_it:
	if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
									16))
		return -EFAULT;
	return 0;
}

1925 1926 1927 1928
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 已提交
1929
	__u32 sync;
1930
	int ret;
1931 1932 1933 1934

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

C
Chao Yu 已提交
1935
	if (get_user(sync, (__u32 __user *)arg))
1936 1937
		return -EFAULT;

C
Chao Yu 已提交
1938 1939
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
1940

1941 1942 1943 1944
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

C
Chao Yu 已提交
1945
	if (!sync) {
1946 1947 1948 1949
		if (!mutex_trylock(&sbi->gc_mutex)) {
			ret = -EBUSY;
			goto out;
		}
C
Chao Yu 已提交
1950 1951
	} else {
		mutex_lock(&sbi->gc_mutex);
1952 1953
	}

1954
	ret = f2fs_gc(sbi, sync, true, NULL_SEGNO);
1955 1956 1957
out:
	mnt_drop_write_file(filp);
	return ret;
1958 1959
}

1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
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;

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

	end = range.start + range.len;
	if (range.start < MAIN_BLKADDR(sbi) || end >= MAX_BLKADDR(sbi))
		return -EINVAL;
do_more:
	if (!range.sync) {
		if (!mutex_trylock(&sbi->gc_mutex)) {
			ret = -EBUSY;
			goto out;
		}
	} else {
		mutex_lock(&sbi->gc_mutex);
	}

	ret = f2fs_gc(sbi, range.sync, true, GET_SEGNO(sbi, range.start));
	range.start += sbi->blocks_per_seg;
	if (range.start <= end)
		goto do_more;
out:
	mnt_drop_write_file(filp);
	return ret;
}

2004 2005 2006 2007
static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2008
	int ret;
2009 2010 2011 2012 2013 2014 2015

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

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

2016 2017 2018 2019 2020 2021 2022 2023
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

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

	mnt_drop_write_file(filp);
	return ret;
2024 2025
}

C
Chao Yu 已提交
2026 2027 2028 2029 2030
static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
					struct file *filp,
					struct f2fs_defragment *range)
{
	struct inode *inode = file_inode(filp);
2031
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL };
2032
	struct extent_info ei = {0,0,0};
C
Chao Yu 已提交
2033
	pgoff_t pg_start, pg_end;
2034
	unsigned int blk_per_seg = sbi->blocks_per_seg;
C
Chao Yu 已提交
2035 2036 2037 2038 2039 2040
	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 */
2041
	if (need_inplace_update_policy(inode, NULL))
C
Chao Yu 已提交
2042 2043
		return -EINVAL;

2044 2045
	pg_start = range->start >> PAGE_SHIFT;
	pg_end = (range->start + range->len) >> PAGE_SHIFT;
C
Chao Yu 已提交
2046

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

A
Al Viro 已提交
2049
	inode_lock(inode);
C
Chao Yu 已提交
2050 2051 2052

	/* writeback all dirty pages in the range */
	err = filemap_write_and_wait_range(inode->i_mapping, range->start,
2053
						range->start + range->len - 1);
C
Chao Yu 已提交
2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073
	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;

	/*
	 * 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 已提交
2074
		map.m_len = pg_end - map.m_lblk;
C
Chao Yu 已提交
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_READ);
		if (err)
			goto out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
			map.m_lblk++;
			continue;
		}

		if (blk_end && blk_end != map.m_pblk) {
			fragmented = true;
			break;
		}
		blk_end = map.m_pblk + map.m_len;

		map.m_lblk += map.m_len;
	}

	if (!fragmented)
		goto out;

	map.m_lblk = pg_start;
	map.m_len = pg_end - pg_start;

2099
	sec_num = (map.m_len + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
C
Chao Yu 已提交
2100 2101 2102 2103 2104 2105

	/*
	 * make sure there are enough free section for LFS allocation, this can
	 * avoid defragment running in SSR mode when free section are allocated
	 * intensively
	 */
2106
	if (has_not_enough_free_secs(sbi, 0, sec_num)) {
C
Chao Yu 已提交
2107 2108 2109 2110 2111 2112 2113 2114 2115
		err = -EAGAIN;
		goto out;
	}

	while (map.m_lblk < pg_end) {
		pgoff_t idx;
		int cnt = 0;

do_map:
F
Fan Li 已提交
2116
		map.m_len = pg_end - map.m_lblk;
C
Chao Yu 已提交
2117 2118 2119 2120 2121 2122 2123 2124 2125
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_READ);
		if (err)
			goto clear_out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
			map.m_lblk++;
			continue;
		}

2126
		set_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150

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

			page = get_lock_data_page(inode, idx, true);
			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;

		if (idx < pg_end && cnt < blk_per_seg)
			goto do_map;

2151
		clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2152 2153 2154 2155 2156 2157

		err = filemap_fdatawrite(inode->i_mapping);
		if (err)
			goto out;
	}
clear_out:
2158
	clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2159
out:
A
Al Viro 已提交
2160
	inode_unlock(inode);
C
Chao Yu 已提交
2161
	if (!err)
2162
		range->len = (u64)total << PAGE_SHIFT;
C
Chao Yu 已提交
2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175
	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;

2176
	if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
2177 2178
		return -EINVAL;

2179 2180
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
C
Chao Yu 已提交
2181 2182

	if (copy_from_user(&range, (struct f2fs_defragment __user *)arg,
2183 2184
							sizeof(range)))
		return -EFAULT;
C
Chao Yu 已提交
2185 2186

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

S
Sheng Yong 已提交
2190
	if (unlikely((range.start + range.len) >> PAGE_SHIFT >
2191 2192 2193 2194 2195 2196
					sbi->max_file_blocks))
		return -EINVAL;

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

C
Chao Yu 已提交
2198
	err = f2fs_defragment_range(sbi, filp, &range);
2199 2200
	mnt_drop_write_file(filp);

2201
	f2fs_update_time(sbi, REQ_TIME);
C
Chao Yu 已提交
2202
	if (err < 0)
2203
		return err;
C
Chao Yu 已提交
2204 2205 2206

	if (copy_to_user((struct f2fs_defragment __user *)arg, &range,
							sizeof(range)))
2207 2208 2209
		return -EFAULT;

	return 0;
C
Chao Yu 已提交
2210 2211
}

2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
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;

2229 2230
	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode))
		return -EINVAL;
2231 2232 2233 2234

	if (f2fs_encrypted_inode(src) || f2fs_encrypted_inode(dst))
		return -EOPNOTSUPP;

2235 2236 2237 2238 2239 2240 2241
	if (src == dst) {
		if (pos_in == pos_out)
			return 0;
		if (pos_out > pos_in && pos_out < pos_in + len)
			return -EINVAL;
	}

2242
	inode_lock(src);
2243 2244 2245 2246 2247 2248
	if (src != dst) {
		if (!inode_trylock(dst)) {
			ret = -EBUSY;
			goto out;
		}
	}
2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292

	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);
	f2fs_lock_op(sbi);
2293 2294 2295
	ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
				pos_out >> F2FS_BLKSIZE_BITS,
				len >> F2FS_BLKSIZE_BITS, false);
2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306

	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);
out_unlock:
	if (src != dst)
		inode_unlock(dst);
2307
out:
2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342
	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);
2343 2344
	if (err)
		goto err_out;
2345 2346 2347 2348 2349 2350 2351 2352 2353

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

2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415
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;

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

	if (sbi->s_ndevs <= 1 || sbi->s_ndevs - 1 <= range.dev_num ||
			sbi->segs_per_sec != 1) {
		f2fs_msg(sbi->sb, KERN_WARNING,
			"Can't flush %u in %d for segs_per_sec %u != 1\n",
				range.dev_num, sbi->s_ndevs,
				sbi->segs_per_sec);
		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) {
		if (!mutex_trylock(&sbi->gc_mutex)) {
			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;
}

2416 2417 2418 2419 2420 2421 2422 2423 2424 2425
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);
}
2426

2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620
#ifdef CONFIG_QUOTA
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 super_block *sb = sbi->sb;
	struct dquot *transfer_to[MAXQUOTAS] = {};
	struct page *ipage;
	kprojid_t kprojid;
	int err;

	if (!f2fs_sb_has_project_quota(sb)) {
		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 = mnt_want_write_file(filp);
	if (err)
		return err;

	err = -EPERM;
	inode_lock(inode);

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

	ipage = get_node_page(sbi, inode->i_ino);
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto out_unlock;
	}

	if (!F2FS_FITS_IN_INODE(F2FS_INODE(ipage), fi->i_extra_isize,
								i_projid)) {
		err = -EOVERFLOW;
		f2fs_put_page(ipage, 1);
		goto out_unlock;
	}
	f2fs_put_page(ipage, 1);

	dquot_initialize(inode);

	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
	if (!IS_ERR(transfer_to[PRJQUOTA])) {
		err = __dquot_transfer(inode, transfer_to);
		dqput(transfer_to[PRJQUOTA]);
		if (err)
			goto out_dirty;
	}

	F2FS_I(inode)->i_projid = kprojid;
	inode->i_ctime = current_time(inode);
out_dirty:
	f2fs_mark_inode_dirty_sync(inode, true);
out_unlock:
	inode_unlock(inode);
	mnt_drop_write_file(filp);
	return err;
}
#else
static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
{
	if (projid != F2FS_DEF_PROJID)
		return -EOPNOTSUPP;
	return 0;
}
#endif

/* Transfer internal flags to xflags */
static inline __u32 f2fs_iflags_to_xflags(unsigned long iflags)
{
	__u32 xflags = 0;

	if (iflags & FS_SYNC_FL)
		xflags |= FS_XFLAG_SYNC;
	if (iflags & FS_IMMUTABLE_FL)
		xflags |= FS_XFLAG_IMMUTABLE;
	if (iflags & FS_APPEND_FL)
		xflags |= FS_XFLAG_APPEND;
	if (iflags & FS_NODUMP_FL)
		xflags |= FS_XFLAG_NODUMP;
	if (iflags & FS_NOATIME_FL)
		xflags |= FS_XFLAG_NOATIME;
	if (iflags & FS_PROJINHERIT_FL)
		xflags |= FS_XFLAG_PROJINHERIT;
	return xflags;
}

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

/* Flags we can manipulate with through EXT4_IOC_FSSETXATTR */
#define F2FS_FL_XFLAG_VISIBLE		(FS_SYNC_FL | \
					 FS_IMMUTABLE_FL | \
					 FS_APPEND_FL | \
					 FS_NODUMP_FL | \
					 FS_NOATIME_FL | \
					 FS_PROJINHERIT_FL)

/* Transfer xflags flags to internal */
static inline unsigned long f2fs_xflags_to_iflags(__u32 xflags)
{
	unsigned long iflags = 0;

	if (xflags & FS_XFLAG_SYNC)
		iflags |= FS_SYNC_FL;
	if (xflags & FS_XFLAG_IMMUTABLE)
		iflags |= FS_IMMUTABLE_FL;
	if (xflags & FS_XFLAG_APPEND)
		iflags |= FS_APPEND_FL;
	if (xflags & FS_XFLAG_NODUMP)
		iflags |= FS_NODUMP_FL;
	if (xflags & FS_XFLAG_NOATIME)
		iflags |= FS_NOATIME_FL;
	if (xflags & FS_XFLAG_PROJINHERIT)
		iflags |= FS_PROJINHERIT_FL;

	return iflags;
}

static int f2fs_ioc_fsgetxattr(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct fsxattr fa;

	memset(&fa, 0, sizeof(struct fsxattr));
	fa.fsx_xflags = f2fs_iflags_to_xflags(fi->i_flags &
				(FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL));

	if (f2fs_sb_has_project_quota(inode->i_sb))
		fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
							fi->i_projid);

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

static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct fsxattr fa;
	unsigned int flags;
	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;

	if (fa.fsx_xflags & ~F2FS_SUPPORTED_FS_XFLAGS)
		return -EOPNOTSUPP;

	flags = f2fs_xflags_to_iflags(fa.fsx_xflags);
	if (f2fs_mask_flags(inode->i_mode, flags) != flags)
		return -EOPNOTSUPP;

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

	inode_lock(inode);
	flags = (fi->i_flags & ~F2FS_FL_XFLAG_VISIBLE) |
				(flags & F2FS_FL_XFLAG_VISIBLE);
	err = __f2fs_ioc_setflags(inode, flags);
	inode_unlock(inode);
	mnt_drop_write_file(filp);
	if (err)
		return err;

	err = f2fs_ioc_setproject(filp, fa.fsx_projid);
	if (err)
		return err;

	return 0;
}

2621 2622 2623 2624 2625 2626 2627
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	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 已提交
2628 2629
	case F2FS_IOC_GETVERSION:
		return f2fs_ioc_getversion(filp, arg);
J
Jaegeuk Kim 已提交
2630 2631 2632 2633
	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);
2634 2635
	case F2FS_IOC_START_VOLATILE_WRITE:
		return f2fs_ioc_start_volatile_write(filp);
2636 2637 2638 2639
	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 已提交
2640 2641
	case F2FS_IOC_SHUTDOWN:
		return f2fs_ioc_shutdown(filp, arg);
2642 2643
	case FITRIM:
		return f2fs_ioc_fitrim(filp, arg);
2644 2645 2646 2647 2648 2649
	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);
2650 2651
	case F2FS_IOC_GARBAGE_COLLECT:
		return f2fs_ioc_gc(filp, arg);
2652 2653
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
		return f2fs_ioc_gc_range(filp, arg);
2654 2655
	case F2FS_IOC_WRITE_CHECKPOINT:
		return f2fs_ioc_write_checkpoint(filp, arg);
C
Chao Yu 已提交
2656 2657
	case F2FS_IOC_DEFRAGMENT:
		return f2fs_ioc_defragment(filp, arg);
2658 2659
	case F2FS_IOC_MOVE_RANGE:
		return f2fs_ioc_move_range(filp, arg);
2660 2661
	case F2FS_IOC_FLUSH_DEVICE:
		return f2fs_ioc_flush_device(filp, arg);
2662 2663
	case F2FS_IOC_GET_FEATURES:
		return f2fs_ioc_get_features(filp, arg);
2664 2665 2666 2667
	case F2FS_IOC_FSGETXATTR:
		return f2fs_ioc_fsgetxattr(filp, arg);
	case F2FS_IOC_FSSETXATTR:
		return f2fs_ioc_fssetxattr(filp, arg);
J
Jaegeuk Kim 已提交
2668 2669 2670 2671 2672
	default:
		return -ENOTTY;
	}
}

2673 2674
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
2675 2676
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
2677
	struct blk_plug plug;
2678
	ssize_t ret;
2679

2680 2681 2682
	inode_lock(inode);
	ret = generic_write_checks(iocb, from);
	if (ret > 0) {
2683
		int err;
2684

2685 2686
		if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
			set_inode_flag(inode, FI_NO_PREALLOC);
2687

2688
		err = f2fs_preallocate_blocks(iocb, from);
2689 2690 2691
		if (err) {
			inode_unlock(inode);
			return err;
2692
		}
2693 2694 2695
		blk_start_plug(&plug);
		ret = __generic_file_write_iter(iocb, from);
		blk_finish_plug(&plug);
2696
		clear_inode_flag(inode, FI_NO_PREALLOC);
2697 2698 2699
	}
	inode_unlock(inode);

2700 2701
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
2702
	return ret;
2703 2704
}

2705 2706 2707 2708 2709 2710 2711 2712 2713 2714
#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;
2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727
	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:
	case F2FS_IOC_SET_ENCRYPTION_POLICY:
	case F2FS_IOC_GET_ENCRYPTION_PWSALT:
	case F2FS_IOC_GET_ENCRYPTION_POLICY:
	case F2FS_IOC_GARBAGE_COLLECT:
2728
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
2729 2730
	case F2FS_IOC_WRITE_CHECKPOINT:
	case F2FS_IOC_DEFRAGMENT:
2731
	case F2FS_IOC_MOVE_RANGE:
2732
	case F2FS_IOC_FLUSH_DEVICE:
2733
	case F2FS_IOC_GET_FEATURES:
2734 2735
	case F2FS_IOC_FSGETXATTR:
	case F2FS_IOC_FSSETXATTR:
2736
		break;
2737 2738 2739 2740 2741 2742 2743
	default:
		return -ENOIOCTLCMD;
	}
	return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
}
#endif

J
Jaegeuk Kim 已提交
2744
const struct file_operations f2fs_file_operations = {
2745
	.llseek		= f2fs_llseek,
2746
	.read_iter	= generic_file_read_iter,
2747 2748
	.write_iter	= f2fs_file_write_iter,
	.open		= f2fs_file_open,
2749
	.release	= f2fs_release_file,
J
Jaegeuk Kim 已提交
2750
	.mmap		= f2fs_file_mmap,
2751
	.flush		= f2fs_file_flush,
J
Jaegeuk Kim 已提交
2752 2753 2754
	.fsync		= f2fs_sync_file,
	.fallocate	= f2fs_fallocate,
	.unlocked_ioctl	= f2fs_ioctl,
2755 2756 2757
#ifdef CONFIG_COMPAT
	.compat_ioctl	= f2fs_compat_ioctl,
#endif
J
Jaegeuk Kim 已提交
2758
	.splice_read	= generic_file_splice_read,
A
Al Viro 已提交
2759
	.splice_write	= iter_file_splice_write,
J
Jaegeuk Kim 已提交
2760
};