file.c 55.3 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
static int f2fs_vm_page_mkwrite(struct vm_fault *vmf)
J
Jaegeuk Kim 已提交
37 38
{
	struct page *page = vmf->page;
39
	struct inode *inode = file_inode(vmf->vma->vm_file);
40
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
41
	struct dnode_of_data dn;
42
	int err;
J
Jaegeuk Kim 已提交
43 44

	sb_start_pagefault(inode->i_sb);
45 46

	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
47

J
Jaegeuk Kim 已提交
48
	/* block allocation */
49
	f2fs_lock_op(sbi);
50
	set_new_dnode(&dn, inode, NULL, NULL, 0);
51
	err = f2fs_reserve_block(&dn, page->index);
52 53
	if (err) {
		f2fs_unlock_op(sbi);
54
		goto out;
55 56 57
	}
	f2fs_put_dnode(&dn);
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
58

J
Jaegeuk Kim 已提交
59
	f2fs_balance_fs(sbi, dn.node_changed);
60

61
	file_update_time(vmf->vma->vm_file);
J
Jaegeuk Kim 已提交
62
	lock_page(page);
63
	if (unlikely(page->mapping != inode->i_mapping ||
64
			page_offset(page) > i_size_read(inode) ||
65
			!PageUptodate(page))) {
J
Jaegeuk Kim 已提交
66 67 68 69 70 71 72 73 74
		unlock_page(page);
		err = -EFAULT;
		goto out;
	}

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

	/* page is wholly or partially inside EOF */
78
	if (((loff_t)(page->index + 1) << PAGE_SHIFT) >
C
Chao Yu 已提交
79
						i_size_read(inode)) {
J
Jaegeuk Kim 已提交
80
		unsigned offset;
81 82
		offset = i_size_read(inode) & ~PAGE_MASK;
		zero_user_segment(page, offset, PAGE_SIZE);
J
Jaegeuk Kim 已提交
83 84
	}
	set_page_dirty(page);
85 86
	if (!PageUptodate(page))
		SetPageUptodate(page);
J
Jaegeuk Kim 已提交
87

88
	trace_f2fs_vm_page_mkwrite(page, DATA);
89 90
mapped:
	/* fill the page */
91
	f2fs_wait_on_page_writeback(page, DATA, false);
92 93 94 95 96

	/* 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);

J
Jaegeuk Kim 已提交
97 98
out:
	sb_end_pagefault(inode->i_sb);
99
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
100 101 102 103
	return block_page_mkwrite_return(err);
}

static const struct vm_operations_struct f2fs_file_vm_ops = {
104
	.fault		= filemap_fault,
105
	.map_pages	= filemap_map_pages,
106
	.page_mkwrite	= f2fs_vm_page_mkwrite,
J
Jaegeuk Kim 已提交
107 108
};

109 110 111 112 113 114 115 116 117 118
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;

119 120
	*pino = parent_ino(dentry);
	dput(dentry);
121 122 123
	return 1;
}

124 125
static inline bool need_do_checkpoint(struct inode *inode)
{
126
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
127 128 129 130
	bool need_cp = false;

	if (!S_ISREG(inode->i_mode) || inode->i_nlink != 1)
		need_cp = true;
131
	else if (is_sbi_flag_set(sbi, SBI_NEED_CP))
132
		need_cp = true;
133 134 135 136 137 138
	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;
139 140
	else if (test_opt(sbi, FASTBOOT))
		need_cp = true;
141 142
	else if (sbi->active_logs == 2)
		need_cp = true;
143 144 145 146

	return need_cp;
}

147 148 149 150 151 152 153 154 155 156 157
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;
}

158 159 160 161 162 163 164 165
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)) {
166
		f2fs_i_pino_write(inode, pino);
167 168
		file_got_pino(inode);
	}
169
	up_write(&fi->i_sem);
170 171
}

172 173
static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
						int datasync, bool atomic)
J
Jaegeuk Kim 已提交
174 175
{
	struct inode *inode = file->f_mapping->host;
176
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
177
	nid_t ino = inode->i_ino;
J
Jaegeuk Kim 已提交
178 179 180
	int ret = 0;
	bool need_cp = false;
	struct writeback_control wbc = {
181
		.sync_mode = WB_SYNC_ALL,
J
Jaegeuk Kim 已提交
182 183 184 185
		.nr_to_write = LONG_MAX,
		.for_reclaim = 0,
	};

186
	if (unlikely(f2fs_readonly(inode->i_sb)))
187 188
		return 0;

189
	trace_f2fs_sync_file_enter(inode);
190 191

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

197 198
	if (ret) {
		trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret);
J
Jaegeuk Kim 已提交
199
		return ret;
200
	}
J
Jaegeuk Kim 已提交
201

202
	/* if the inode is dirty, let's recover all the time */
C
Chao Yu 已提交
203
	if (!f2fs_skip_inode_update(inode, datasync)) {
204
		f2fs_write_inode(inode, NULL);
205 206 207
		goto go_write;
	}

208 209 210
	/*
	 * if there is no written data, don't waste time to write recovery info.
	 */
211
	if (!is_inode_flag_set(inode, FI_APPEND_WRITE) &&
J
Jaegeuk Kim 已提交
212
			!exist_written_data(sbi, ino, APPEND_INO)) {
213

214 215
		/* it may call write_inode just prior to fsync */
		if (need_inode_page_update(sbi, ino))
216 217
			goto go_write;

218
		if (is_inode_flag_set(inode, FI_UPDATE_WRITE) ||
J
Jaegeuk Kim 已提交
219
				exist_written_data(sbi, ino, UPDATE_INO))
220 221 222
			goto flush_out;
		goto out;
	}
223
go_write:
224 225 226 227
	/*
	 * Both of fdatasync() and fsync() are able to be recovered from
	 * sudden-power-off.
	 */
228
	down_read(&F2FS_I(inode)->i_sem);
229
	need_cp = need_do_checkpoint(inode);
230
	up_read(&F2FS_I(inode)->i_sem);
231

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

236 237 238 239 240
		/*
		 * We've secured consistency through sync_fs. Following pino
		 * will be used only for fsynced inodes after checkpoint.
		 */
		try_to_fix_pino(inode);
241 242
		clear_inode_flag(inode, FI_APPEND_WRITE);
		clear_inode_flag(inode, FI_UPDATE_WRITE);
243 244
		goto out;
	}
245
sync_nodes:
246
	ret = fsync_node_pages(sbi, inode, &wbc, atomic);
247 248
	if (ret)
		goto out;
249

250
	/* if cp_error was enabled, we should avoid infinite loop */
C
Chao Yu 已提交
251 252
	if (unlikely(f2fs_cp_error(sbi))) {
		ret = -EIO;
253
		goto out;
C
Chao Yu 已提交
254
	}
255

256
	if (need_inode_block_update(sbi, ino)) {
257
		f2fs_mark_inode_dirty_sync(inode, true);
258 259
		f2fs_write_inode(inode, NULL);
		goto sync_nodes;
J
Jaegeuk Kim 已提交
260
	}
261 262 263 264 265 266

	ret = wait_on_node_pages_writeback(sbi, ino);
	if (ret)
		goto out;

	/* once recovery info is written, don't need to tack this */
267
	remove_ino_entry(sbi, ino, APPEND_INO);
268
	clear_inode_flag(inode, FI_APPEND_WRITE);
269
flush_out:
270
	remove_ino_entry(sbi, ino, UPDATE_INO);
271
	clear_inode_flag(inode, FI_UPDATE_WRITE);
272 273
	if (!atomic)
		ret = f2fs_issue_flush(sbi);
274
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
275
out:
276
	trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret);
277
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
278 279 280
	return ret;
}

281 282 283 284 285
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);
}

286 287 288 289 290 291 292 293 294 295 296
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 已提交
297 298
	nr_pages = pagevec_lookup_tag(&pvec, mapping, &pgofs,
					PAGECACHE_TAG_DIRTY, 1);
299
	pgofs = nr_pages ? pvec.pages[0]->index : ULONG_MAX;
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
	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;
}

321 322 323 324 325
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;
326 327 328
	pgoff_t pgofs, end_offset, dirty;
	loff_t data_ofs = offset;
	loff_t isize;
329 330
	int err = 0;

A
Al Viro 已提交
331
	inode_lock(inode);
332 333 334 335 336 337

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

	/* handle inline data case */
C
Chao Yu 已提交
338
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
339 340 341 342 343
		if (whence == SEEK_HOLE)
			data_ofs = isize;
		goto found;
	}

344
	pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
345

346 347
	dirty = __get_first_dirty_index(inode->i_mapping, pgofs, whence);

348
	for (; data_ofs < isize; data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
349
		set_new_dnode(&dn, inode, NULL, NULL, 0);
350
		err = get_dnode_of_data(&dn, pgofs, LOOKUP_NODE);
351 352 353
		if (err && err != -ENOENT) {
			goto fail;
		} else if (err == -ENOENT) {
A
arter97 已提交
354
			/* direct node does not exists */
355
			if (whence == SEEK_DATA) {
356
				pgofs = get_next_page_offset(&dn, pgofs);
357 358 359 360 361 362
				continue;
			} else {
				goto found;
			}
		}

363
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
364 365 366 367

		/* find data/hole in dnode block */
		for (; dn.ofs_in_node < end_offset;
				dn.ofs_in_node++, pgofs++,
368
				data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
369 370 371
			block_t blkaddr;
			blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node);

372
			if (__found_offset(blkaddr, dirty, pgofs, whence)) {
373 374 375 376 377 378 379 380 381 382
				f2fs_put_dnode(&dn);
				goto found;
			}
		}
		f2fs_put_dnode(&dn);
	}

	if (whence == SEEK_DATA)
		goto fail;
found:
383 384
	if (whence == SEEK_HOLE && data_ofs > isize)
		data_ofs = isize;
A
Al Viro 已提交
385
	inode_unlock(inode);
386 387
	return vfs_setpos(file, data_ofs, maxbytes);
fail:
A
Al Viro 已提交
388
	inode_unlock(inode);
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
	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:
405 406
		if (offset < 0)
			return -ENXIO;
407 408 409 410 411 412
		return f2fs_seek_block(file, offset, whence);
	}

	return -EINVAL;
}

J
Jaegeuk Kim 已提交
413 414
static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
{
415
	struct inode *inode = file_inode(file);
416
	int err;
417 418

	/* we don't need to use inline_data strictly */
419 420 421
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
422

J
Jaegeuk Kim 已提交
423 424 425 426 427
	file_accessed(file);
	vma->vm_ops = &f2fs_file_vm_ops;
	return 0;
}

428 429 430
static int f2fs_file_open(struct inode *inode, struct file *filp)
{
	int ret = generic_file_open(inode, filp);
431
	struct dentry *dir;
432 433

	if (!ret && f2fs_encrypted_inode(inode)) {
434
		ret = fscrypt_get_encryption_info(inode);
435
		if (ret)
436
			return -EACCES;
437
		if (!fscrypt_has_encryption_key(inode))
438
			return -ENOKEY;
439
	}
440 441 442 443
	dir = dget_parent(file_dentry(filp));
	if (f2fs_encrypted_inode(d_inode(dir)) &&
			!fscrypt_has_permitted_context(d_inode(dir), inode)) {
		dput(dir);
444
		return -EPERM;
445 446
	}
	dput(dir);
447 448 449
	return ret;
}

450
int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
J
Jaegeuk Kim 已提交
451
{
452
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
J
Jaegeuk Kim 已提交
453
	struct f2fs_node *raw_node;
C
Chao Yu 已提交
454
	int nr_free = 0, ofs = dn->ofs_in_node, len = count;
J
Jaegeuk Kim 已提交
455 456
	__le32 *addr;

457
	raw_node = F2FS_NODE(dn->node_page);
J
Jaegeuk Kim 已提交
458 459
	addr = blkaddr_in_node(raw_node) + ofs;

C
Chris Fries 已提交
460
	for (; count > 0; count--, addr++, dn->ofs_in_node++) {
J
Jaegeuk Kim 已提交
461 462 463 464
		block_t blkaddr = le32_to_cpu(*addr);
		if (blkaddr == NULL_ADDR)
			continue;

J
Jaegeuk Kim 已提交
465
		dn->data_blkaddr = NULL_ADDR;
466
		set_data_blkaddr(dn);
J
Jaegeuk Kim 已提交
467
		invalidate_blocks(sbi, blkaddr);
468
		if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
469
			clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
J
Jaegeuk Kim 已提交
470 471
		nr_free++;
	}
C
Chao Yu 已提交
472

J
Jaegeuk Kim 已提交
473
	if (nr_free) {
C
Chao Yu 已提交
474 475 476 477 478 479
		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),
480
							dn->inode) + ofs;
C
Chao Yu 已提交
481
		f2fs_update_extent_cache_range(dn, fofs, 0, len);
482
		dec_valid_block_count(sbi, dn->inode, nr_free);
J
Jaegeuk Kim 已提交
483 484
	}
	dn->ofs_in_node = ofs;
485

486
	f2fs_update_time(sbi, REQ_TIME);
487 488
	trace_f2fs_truncate_data_blocks_range(dn->inode, dn->nid,
					 dn->ofs_in_node, nr_free);
J
Jaegeuk Kim 已提交
489 490 491 492 493 494 495 496
	return nr_free;
}

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

497
static int truncate_partial_data_page(struct inode *inode, u64 from,
498
								bool cache_only)
J
Jaegeuk Kim 已提交
499
{
500 501
	unsigned offset = from & (PAGE_SIZE - 1);
	pgoff_t index = from >> PAGE_SHIFT;
502
	struct address_space *mapping = inode->i_mapping;
J
Jaegeuk Kim 已提交
503 504
	struct page *page;

505
	if (!offset && !cache_only)
506
		return 0;
J
Jaegeuk Kim 已提交
507

508
	if (cache_only) {
509
		page = find_lock_page(mapping, index);
510 511 512
		if (page && PageUptodate(page))
			goto truncate_out;
		f2fs_put_page(page, 1);
513
		return 0;
514
	}
J
Jaegeuk Kim 已提交
515

516
	page = get_lock_data_page(inode, index, true);
517
	if (IS_ERR(page))
518
		return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
519
truncate_out:
520
	f2fs_wait_on_page_writeback(page, DATA, true);
521
	zero_user(page, offset, PAGE_SIZE - offset);
522 523
	if (!cache_only || !f2fs_encrypted_inode(inode) ||
					!S_ISREG(inode->i_mode))
524
		set_page_dirty(page);
J
Jaegeuk Kim 已提交
525
	f2fs_put_page(page, 1);
526
	return 0;
J
Jaegeuk Kim 已提交
527 528
}

529
int truncate_blocks(struct inode *inode, u64 from, bool lock)
J
Jaegeuk Kim 已提交
530
{
531
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
532 533 534
	unsigned int blocksize = inode->i_sb->s_blocksize;
	struct dnode_of_data dn;
	pgoff_t free_from;
H
Huajun Li 已提交
535
	int count = 0, err = 0;
536
	struct page *ipage;
537
	bool truncate_page = false;
J
Jaegeuk Kim 已提交
538

539 540
	trace_f2fs_truncate_blocks_enter(inode, from);

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

543 544 545
	if (free_from >= sbi->max_file_blocks)
		goto free_partial;

546 547
	if (lock)
		f2fs_lock_op(sbi);
H
Huajun Li 已提交
548

549 550 551 552 553 554 555
	ipage = get_node_page(sbi, inode->i_ino);
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto out;
	}

	if (f2fs_has_inline_data(inode)) {
556
		truncate_inline_inode(inode, ipage, from);
557
		f2fs_put_page(ipage, 1);
558
		truncate_page = true;
559 560 561 562
		goto out;
	}

	set_new_dnode(&dn, inode, ipage, NULL, 0);
563
	err = get_dnode_of_data(&dn, free_from, LOOKUP_NODE_RA);
J
Jaegeuk Kim 已提交
564 565 566
	if (err) {
		if (err == -ENOENT)
			goto free_next;
567
		goto out;
568 569
	}

570
	count = ADDRS_PER_PAGE(dn.node_page, inode);
J
Jaegeuk Kim 已提交
571 572

	count -= dn.ofs_in_node;
573
	f2fs_bug_on(sbi, count < 0);
574

J
Jaegeuk Kim 已提交
575 576 577 578 579 580 581 582
	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);
583 584 585
out:
	if (lock)
		f2fs_unlock_op(sbi);
586
free_partial:
587 588
	/* lastly zero out the first data page */
	if (!err)
589
		err = truncate_partial_data_page(inode, from, truncate_page);
J
Jaegeuk Kim 已提交
590

591
	trace_f2fs_truncate_blocks_exit(inode, err);
J
Jaegeuk Kim 已提交
592 593 594
	return err;
}

595
int f2fs_truncate(struct inode *inode)
J
Jaegeuk Kim 已提交
596
{
597 598
	int err;

J
Jaegeuk Kim 已提交
599 600
	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
				S_ISLNK(inode->i_mode)))
601
		return 0;
J
Jaegeuk Kim 已提交
602

603 604
	trace_f2fs_truncate(inode);

605 606 607 608 609 610
#ifdef CONFIG_F2FS_FAULT_INJECTION
	if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
		f2fs_show_injection_info(FAULT_TRUNCATE);
		return -EIO;
	}
#endif
611
	/* we should check inline_data size */
612
	if (!f2fs_may_inline_data(inode)) {
613 614 615
		err = f2fs_convert_inline_inode(inode);
		if (err)
			return err;
616 617
	}

618
	err = truncate_blocks(inode, i_size_read(inode), true);
619 620 621
	if (err)
		return err;

622
	inode->i_mtime = inode->i_ctime = current_time(inode);
623
	f2fs_mark_inode_dirty_sync(inode, false);
624
	return 0;
J
Jaegeuk Kim 已提交
625 626
}

627
int f2fs_getattr(const struct path *path, struct kstat *stat,
C
Chao Yu 已提交
628
		 u32 request_mask, unsigned int query_flags)
J
Jaegeuk Kim 已提交
629
{
630
	struct inode *inode = d_inode(path->dentry);
C
Chao Yu 已提交
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
	struct f2fs_inode_info *fi = F2FS_I(inode);
	unsigned int flags;

	flags = fi->i_flags & FS_FL_USER_VISIBLE;
	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 已提交
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679
	generic_fillattr(inode, stat);
	stat->blocks <<= 3;
	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;
680
		set_acl_inode(inode, mode);
J
Jaegeuk Kim 已提交
681 682 683 684 685 686 687 688
	}
}
#else
#define __setattr_copy setattr_copy
#endif

int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
{
689
	struct inode *inode = d_inode(dentry);
J
Jaegeuk Kim 已提交
690
	int err;
691
	bool size_changed = false;
J
Jaegeuk Kim 已提交
692

693
	err = setattr_prepare(dentry, attr);
J
Jaegeuk Kim 已提交
694 695 696
	if (err)
		return err;

697
	if (attr->ia_valid & ATTR_SIZE) {
698
		if (f2fs_encrypted_inode(inode) &&
699
				fscrypt_get_encryption_info(inode))
700 701
			return -EACCES;

702
		if (attr->ia_size <= i_size_read(inode)) {
703
			truncate_setsize(inode, attr->ia_size);
704
			err = f2fs_truncate(inode);
705 706
			if (err)
				return err;
707 708
		} else {
			/*
709 710
			 * do not trim all blocks after i_size if target size is
			 * larger than i_size.
711
			 */
712
			truncate_setsize(inode, attr->ia_size);
713 714

			/* should convert inline inode here */
715
			if (!f2fs_may_inline_data(inode)) {
716 717 718 719
				err = f2fs_convert_inline_inode(inode);
				if (err)
					return err;
			}
720
			inode->i_mtime = inode->i_ctime = current_time(inode);
721
		}
722 723

		size_changed = true;
J
Jaegeuk Kim 已提交
724 725 726 727 728
	}

	__setattr_copy(inode, attr);

	if (attr->ia_valid & ATTR_MODE) {
729
		err = posix_acl_chmod(inode, get_inode_mode(inode));
730 731 732
		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 已提交
733 734 735
		}
	}

736 737
	/* file size may changed here */
	f2fs_mark_inode_dirty_sync(inode, size_changed);
738 739 740 741

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

J
Jaegeuk Kim 已提交
742 743 744 745 746 747 748
	return err;
}

const struct inode_operations f2fs_file_inode_operations = {
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
749
	.set_acl	= f2fs_set_acl,
J
Jaegeuk Kim 已提交
750 751 752
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
J
Jaegeuk Kim 已提交
753
	.fiemap		= f2fs_fiemap,
J
Jaegeuk Kim 已提交
754 755
};

C
Chao Yu 已提交
756
static int fill_zero(struct inode *inode, pgoff_t index,
J
Jaegeuk Kim 已提交
757 758
					loff_t start, loff_t len)
{
759
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
760 761 762
	struct page *page;

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

J
Jaegeuk Kim 已提交
765
	f2fs_balance_fs(sbi, true);
766

767
	f2fs_lock_op(sbi);
768
	page = get_new_data_page(inode, NULL, index, false);
769
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
770

C
Chao Yu 已提交
771 772 773
	if (IS_ERR(page))
		return PTR_ERR(page);

774
	f2fs_wait_on_page_writeback(page, DATA, true);
C
Chao Yu 已提交
775 776 777 778
	zero_user(page, start, len);
	set_page_dirty(page);
	f2fs_put_page(page, 1);
	return 0;
J
Jaegeuk Kim 已提交
779 780 781 782 783 784
}

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

785
	while (pg_start < pg_end) {
J
Jaegeuk Kim 已提交
786
		struct dnode_of_data dn;
787
		pgoff_t end_offset, count;
788

J
Jaegeuk Kim 已提交
789
		set_new_dnode(&dn, inode, NULL, NULL, 0);
790
		err = get_dnode_of_data(&dn, pg_start, LOOKUP_NODE);
J
Jaegeuk Kim 已提交
791
		if (err) {
792 793
			if (err == -ENOENT) {
				pg_start++;
J
Jaegeuk Kim 已提交
794
				continue;
795
			}
J
Jaegeuk Kim 已提交
796 797 798
			return err;
		}

799
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
800 801 802 803 804
		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 已提交
805
		f2fs_put_dnode(&dn);
806 807

		pg_start += count;
J
Jaegeuk Kim 已提交
808 809 810 811
	}
	return 0;
}

C
Chao Yu 已提交
812
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
J
Jaegeuk Kim 已提交
813 814 815
{
	pgoff_t pg_start, pg_end;
	loff_t off_start, off_end;
816
	int ret;
J
Jaegeuk Kim 已提交
817

818 819 820
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
H
Huajun Li 已提交
821

822 823
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
J
Jaegeuk Kim 已提交
824

825 826
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
827 828

	if (pg_start == pg_end) {
C
Chao Yu 已提交
829
		ret = fill_zero(inode, pg_start, off_start,
J
Jaegeuk Kim 已提交
830
						off_end - off_start);
C
Chao Yu 已提交
831 832
		if (ret)
			return ret;
J
Jaegeuk Kim 已提交
833
	} else {
C
Chao Yu 已提交
834 835
		if (off_start) {
			ret = fill_zero(inode, pg_start++, off_start,
836
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
837 838 839 840 841 842 843 844
			if (ret)
				return ret;
		}
		if (off_end) {
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				return ret;
		}
J
Jaegeuk Kim 已提交
845 846 847 848

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

J
Jaegeuk Kim 已提交
851
			f2fs_balance_fs(sbi, true);
J
Jaegeuk Kim 已提交
852

853 854
			blk_start = (loff_t)pg_start << PAGE_SHIFT;
			blk_end = (loff_t)pg_end << PAGE_SHIFT;
J
Jaegeuk Kim 已提交
855 856
			truncate_inode_pages_range(mapping, blk_start,
					blk_end - 1);
857

858
			f2fs_lock_op(sbi);
J
Jaegeuk Kim 已提交
859
			ret = truncate_hole(inode, pg_start, pg_end);
860
			f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
861 862 863 864 865 866
		}
	}

	return ret;
}

867 868
static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
				int *do_replace, pgoff_t off, pgoff_t len)
C
Chao Yu 已提交
869 870 871
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct dnode_of_data dn;
872
	int ret, done, i;
873

874
next_dnode:
875
	set_new_dnode(&dn, inode, NULL, NULL, 0);
876
	ret = get_dnode_of_data(&dn, off, LOOKUP_NODE_RA);
877 878 879
	if (ret && ret != -ENOENT) {
		return ret;
	} else if (ret == -ENOENT) {
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
		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++) {
		*blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node);
		if (!is_checkpointed_data(sbi, *blkaddr)) {

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

899
			/* do not invalidate this block address */
900
			f2fs_update_data_blkaddr(&dn, NULL_ADDR);
901
			*do_replace = 1;
C
Chao Yu 已提交
902
		}
903
	}
904 905 906 907 908 909 910 911
	f2fs_put_dnode(&dn);
next:
	len -= done;
	off += done;
	if (len)
		goto next_dnode;
	return 0;
}
C
Chao Yu 已提交
912

913 914 915 916 917 918
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 已提交
919

920 921 922
	for (i = 0; i < len; i++, do_replace++, blkaddr++) {
		if (*do_replace == 0)
			continue;
C
Chao Yu 已提交
923

924 925 926 927 928 929 930
		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);
931
		}
932 933 934 935 936 937 938 939 940 941 942 943
		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;
944

945 946 947 948
	while (i < len) {
		if (blkaddr[i] == NULL_ADDR && !full) {
			i++;
			continue;
949
		}
C
Chao Yu 已提交
950

951 952 953 954 955
		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 已提交
956

957 958 959 960
			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 已提交
961

962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
			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 {
				dn.data_blkaddr = datablock_addr(dn.node_page,
								dn.ofs_in_node);
				truncate_data_blocks_range(&dn, 1);

				if (do_replace[i]) {
					f2fs_i_blocks_write(src_inode,
								1, false);
					f2fs_i_blocks_write(dst_inode,
								1, true);
					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);
986
			} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
987

988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
			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);
1004
			f2fs_put_page(psrc, 1);
C
Chao Yu 已提交
1005

1006 1007 1008 1009 1010
			ret = truncate_hole(src_inode, src + i, src + i + 1);
			if (ret)
				return ret;
			i++;
		}
1011 1012
	}
	return 0;
1013
}
C
Chao Yu 已提交
1014

1015 1016
static int __exchange_data_block(struct inode *src_inode,
			struct inode *dst_inode, pgoff_t src, pgoff_t dst,
1017
			pgoff_t len, bool full)
1018 1019 1020
{
	block_t *src_blkaddr;
	int *do_replace;
1021
	pgoff_t olen;
1022 1023
	int ret;

1024 1025
	while (len) {
		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len);
1026

1027 1028 1029
		src_blkaddr = f2fs_kvzalloc(sizeof(block_t) * olen, GFP_KERNEL);
		if (!src_blkaddr)
			return -ENOMEM;
1030

1031 1032 1033 1034 1035
		do_replace = f2fs_kvzalloc(sizeof(int) * olen, GFP_KERNEL);
		if (!do_replace) {
			kvfree(src_blkaddr);
			return -ENOMEM;
		}
1036

1037 1038 1039 1040
		ret = __read_out_blkaddrs(src_inode, src_blkaddr,
					do_replace, src, olen);
		if (ret)
			goto roll_back;
1041

1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
		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);
	}
1054 1055 1056 1057 1058 1059
	return 0;

roll_back:
	__roll_back_blkaddrs(src_inode, src_blkaddr, do_replace, src, len);
	kvfree(src_blkaddr);
	kvfree(do_replace);
1060 1061
	return ret;
}
C
Chao Yu 已提交
1062

1063 1064 1065 1066
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;
1067
	int ret;
1068

1069 1070
	f2fs_balance_fs(sbi, true);
	f2fs_lock_op(sbi);
1071 1072 1073

	f2fs_drop_extent_tree(inode);

1074 1075
	ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
	f2fs_unlock_op(sbi);
C
Chao Yu 已提交
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
	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;

1092 1093 1094
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1095

1096 1097
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
		return ret;

	truncate_pagecache(inode, offset);

	ret = f2fs_do_collapse(inode, pg_start, pg_end);
	if (ret)
		return ret;

1110 1111 1112 1113
	/* 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 已提交
1114
	new_size = i_size_read(inode) - len;
1115
	truncate_pagecache(inode, new_size);
C
Chao Yu 已提交
1116 1117 1118

	ret = truncate_blocks(inode, new_size, true);
	if (!ret)
1119
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1120 1121 1122 1123

	return ret;
}

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
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++) {
		if (datablock_addr(dn->node_page, dn->ofs_in_node) == NULL_ADDR)
			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++) {
		dn->data_blkaddr =
				datablock_addr(dn->node_page, dn->ofs_in_node);
		/*
		 * 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 已提交
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
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;

1181 1182 1183
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
C
Chao Yu 已提交
1184 1185 1186 1187 1188 1189 1190

	ret = filemap_write_and_wait_range(mapping, offset, offset + len - 1);
	if (ret)
		return ret;

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

1191 1192
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1193

1194 1195
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
C
Chao Yu 已提交
1196 1197

	if (pg_start == pg_end) {
C
Chao Yu 已提交
1198 1199 1200 1201 1202
		ret = fill_zero(inode, pg_start, off_start,
						off_end - off_start);
		if (ret)
			return ret;

C
Chao Yu 已提交
1203 1204 1205
		new_size = max_t(loff_t, new_size, offset + len);
	} else {
		if (off_start) {
C
Chao Yu 已提交
1206
			ret = fill_zero(inode, pg_start++, off_start,
1207
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
1208 1209 1210
			if (ret)
				return ret;

C
Chao Yu 已提交
1211
			new_size = max_t(loff_t, new_size,
1212
					(loff_t)pg_start << PAGE_SHIFT);
C
Chao Yu 已提交
1213 1214
		}

1215
		for (index = pg_start; index < pg_end;) {
C
Chao Yu 已提交
1216
			struct dnode_of_data dn;
1217 1218
			unsigned int end_offset;
			pgoff_t end;
C
Chao Yu 已提交
1219 1220 1221

			f2fs_lock_op(sbi);

1222 1223
			set_new_dnode(&dn, inode, NULL, NULL, 0);
			ret = get_dnode_of_data(&dn, index, ALLOC_NODE);
C
Chao Yu 已提交
1224 1225 1226 1227 1228
			if (ret) {
				f2fs_unlock_op(sbi);
				goto out;
			}

1229 1230 1231 1232
			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 已提交
1233 1234
			f2fs_put_dnode(&dn);
			f2fs_unlock_op(sbi);
1235 1236 1237

			f2fs_balance_fs(sbi, dn.node_changed);

1238 1239
			if (ret)
				goto out;
C
Chao Yu 已提交
1240

1241
			index = end;
C
Chao Yu 已提交
1242
			new_size = max_t(loff_t, new_size,
1243
					(loff_t)index << PAGE_SHIFT);
C
Chao Yu 已提交
1244 1245 1246
		}

		if (off_end) {
C
Chao Yu 已提交
1247 1248 1249 1250
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				goto out;

C
Chao Yu 已提交
1251 1252 1253 1254 1255
			new_size = max_t(loff_t, new_size, offset + len);
		}
	}

out:
1256
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
1257
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1258 1259 1260 1261

	return ret;
}

C
Chao Yu 已提交
1262 1263 1264
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1265
	pgoff_t nr, pg_start, pg_end, delta, idx;
C
Chao Yu 已提交
1266
	loff_t new_size;
1267
	int ret = 0;
C
Chao Yu 已提交
1268 1269

	new_size = i_size_read(inode) + len;
1270 1271 1272
	ret = inode_newsize_ok(inode, new_size);
	if (ret)
		return ret;
C
Chao Yu 已提交
1273 1274 1275 1276 1277 1278 1279 1280

	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;

1281 1282 1283
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1284

J
Jaegeuk Kim 已提交
1285
	f2fs_balance_fs(sbi, true);
1286

C
Chao Yu 已提交
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297
	ret = truncate_blocks(inode, i_size_read(inode), true);
	if (ret)
		return ret;

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
		return ret;

	truncate_pagecache(inode, offset);

1298 1299
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1300
	delta = pg_end - pg_start;
1301 1302 1303 1304 1305 1306 1307
	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 已提交
1308 1309

		f2fs_lock_op(sbi);
1310 1311
		f2fs_drop_extent_tree(inode);

1312 1313
		ret = __exchange_data_block(inode, inode, idx,
					idx + delta, nr, false);
C
Chao Yu 已提交
1314 1315 1316
		f2fs_unlock_op(sbi);
	}

1317 1318 1319 1320 1321
	/* write out all moved pages, if possible */
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);

	if (!ret)
1322
		f2fs_i_size_write(inode, new_size);
C
Chao Yu 已提交
1323 1324 1325
	return ret;
}

J
Jaegeuk Kim 已提交
1326 1327 1328
static int expand_inode_data(struct inode *inode, loff_t offset,
					loff_t len, int mode)
{
1329
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1330 1331
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL };
	pgoff_t pg_end;
J
Jaegeuk Kim 已提交
1332
	loff_t new_size = i_size_read(inode);
1333
	loff_t off_end;
1334
	int err;
J
Jaegeuk Kim 已提交
1335

1336 1337 1338
	err = inode_newsize_ok(inode, (len + offset));
	if (err)
		return err;
J
Jaegeuk Kim 已提交
1339

1340 1341 1342
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
1343

J
Jaegeuk Kim 已提交
1344
	f2fs_balance_fs(sbi, true);
1345

1346
	pg_end = ((unsigned long long)offset + len) >> PAGE_SHIFT;
1347
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
1348

1349 1350 1351 1352
	map.m_lblk = ((unsigned long long)offset) >> PAGE_SHIFT;
	map.m_len = pg_end - map.m_lblk;
	if (off_end)
		map.m_len++;
1353

1354 1355
	err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
	if (err) {
1356
		pgoff_t last_off;
J
Jaegeuk Kim 已提交
1357

1358
		if (!map.m_len)
1359
			return err;
1360

1361 1362 1363 1364 1365 1366 1367
		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 已提交
1368 1369
	}

1370
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
1371
		f2fs_i_size_write(inode, new_size);
J
Jaegeuk Kim 已提交
1372

1373
	return err;
J
Jaegeuk Kim 已提交
1374 1375 1376 1377 1378
}

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

1382 1383 1384 1385
	/* f2fs only support ->fallocate for regular file */
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

C
Chao Yu 已提交
1386 1387
	if (f2fs_encrypted_inode(inode) &&
		(mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))
1388 1389
		return -EOPNOTSUPP;

C
Chao Yu 已提交
1390
	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
C
Chao Yu 已提交
1391 1392
			FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
			FALLOC_FL_INSERT_RANGE))
J
Jaegeuk Kim 已提交
1393 1394
		return -EOPNOTSUPP;

A
Al Viro 已提交
1395
	inode_lock(inode);
1396

1397 1398 1399 1400
	if (mode & FALLOC_FL_PUNCH_HOLE) {
		if (offset >= inode->i_size)
			goto out;

C
Chao Yu 已提交
1401
		ret = punch_hole(inode, offset, len);
C
Chao Yu 已提交
1402 1403
	} else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
		ret = f2fs_collapse_range(inode, offset, len);
C
Chao Yu 已提交
1404 1405
	} else if (mode & FALLOC_FL_ZERO_RANGE) {
		ret = f2fs_zero_range(inode, offset, len, mode);
C
Chao Yu 已提交
1406 1407
	} else if (mode & FALLOC_FL_INSERT_RANGE) {
		ret = f2fs_insert_range(inode, offset, len);
C
Chao Yu 已提交
1408
	} else {
J
Jaegeuk Kim 已提交
1409
		ret = expand_inode_data(inode, offset, len, mode);
C
Chao Yu 已提交
1410
	}
J
Jaegeuk Kim 已提交
1411

1412
	if (!ret) {
1413
		inode->i_mtime = inode->i_ctime = current_time(inode);
1414
		f2fs_mark_inode_dirty_sync(inode, false);
1415 1416
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
1417
		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1418
	}
1419

1420
out:
A
Al Viro 已提交
1421
	inode_unlock(inode);
1422

1423
	trace_f2fs_fallocate(inode, mode, offset, len, ret);
J
Jaegeuk Kim 已提交
1424 1425 1426
	return ret;
}

1427 1428
static int f2fs_release_file(struct inode *inode, struct file *filp)
{
1429 1430 1431 1432 1433 1434 1435 1436
	/*
	 * 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;

1437 1438
	/* some remained atomic pages should discarded */
	if (f2fs_is_atomic_file(inode))
1439
		drop_inmem_pages(inode);
1440
	if (f2fs_is_volatile_file(inode)) {
1441
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1442
		stat_dec_volatile_write(inode);
1443
		set_inode_flag(inode, FI_DROP_CACHE);
1444
		filemap_fdatawrite(inode->i_mapping);
1445
		clear_inode_flag(inode, FI_DROP_CACHE);
1446 1447 1448 1449
	}
	return 0;
}

J
Jaegeuk Kim 已提交
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
#define F2FS_REG_FLMASK		(~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
#define F2FS_OTHER_FLMASK	(FS_NODUMP_FL | FS_NOATIME_FL)

static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags)
{
	if (S_ISDIR(mode))
		return flags;
	else if (S_ISREG(mode))
		return flags & F2FS_REG_FLMASK;
	else
		return flags & F2FS_OTHER_FLMASK;
}

1463
static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
J
Jaegeuk Kim 已提交
1464
{
A
Al Viro 已提交
1465
	struct inode *inode = file_inode(filp);
J
Jaegeuk Kim 已提交
1466
	struct f2fs_inode_info *fi = F2FS_I(inode);
1467 1468 1469
	unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE;
	return put_user(flags, (int __user *)arg);
}
J
Jaegeuk Kim 已提交
1470

1471 1472 1473 1474
static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
	struct f2fs_inode_info *fi = F2FS_I(inode);
1475
	unsigned int flags;
1476 1477
	unsigned int oldflags;
	int ret;
J
Jaegeuk Kim 已提交
1478

1479 1480 1481 1482 1483 1484
	if (!inode_owner_or_capable(inode))
		return -EACCES;

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

1485 1486 1487
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;
J
Jaegeuk Kim 已提交
1488

A
Al Viro 已提交
1489
	inode_lock(inode);
J
Jaegeuk Kim 已提交
1490

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

1493
	oldflags = fi->i_flags;
J
Jaegeuk Kim 已提交
1494

1495 1496
	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
		if (!capable(CAP_LINUX_IMMUTABLE)) {
A
Al Viro 已提交
1497
			inode_unlock(inode);
1498 1499
			ret = -EPERM;
			goto out;
J
Jaegeuk Kim 已提交
1500
		}
1501
	}
J
Jaegeuk Kim 已提交
1502

1503 1504 1505
	flags = flags & FS_FL_USER_MODIFIABLE;
	flags |= oldflags & ~FS_FL_USER_MODIFIABLE;
	fi->i_flags = flags;
J
Jaegeuk Kim 已提交
1506

1507
	inode->i_ctime = current_time(inode);
1508
	f2fs_set_inode_flags(inode);
J
Jaegeuk Kim 已提交
1509
	f2fs_mark_inode_dirty_sync(inode, false);
1510 1511

	inode_unlock(inode);
J
Jaegeuk Kim 已提交
1512
out:
1513 1514 1515
	mnt_drop_write_file(filp);
	return ret;
}
1516

C
Chao Yu 已提交
1517 1518 1519 1520 1521 1522 1523
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 已提交
1524 1525 1526
static int f2fs_ioc_start_atomic_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1527
	int ret;
J
Jaegeuk Kim 已提交
1528 1529 1530 1531

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

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

1535 1536 1537 1538
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1539 1540
	inode_lock(inode);

1541
	if (f2fs_is_atomic_file(inode))
1542
		goto out;
J
Jaegeuk Kim 已提交
1543

1544 1545
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1546
		goto out;
J
Jaegeuk Kim 已提交
1547

1548
	set_inode_flag(inode, FI_ATOMIC_FILE);
1549
	set_inode_flag(inode, FI_HOT_DATA);
1550 1551
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);

1552
	if (!get_dirty_pages(inode))
1553
		goto inc_stat;
1554 1555

	f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
1556
		"Unexpected flush for atomic writes: ino=%lu, npages=%u",
1557 1558
					inode->i_ino, get_dirty_pages(inode));
	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
1559
	if (ret) {
1560
		clear_inode_flag(inode, FI_ATOMIC_FILE);
1561 1562 1563 1564
		goto out;
	}

inc_stat:
1565 1566
	stat_inc_atomic_write(inode);
	stat_update_max_atomic_write(inode);
1567
out:
1568
	inode_unlock(inode);
1569
	mnt_drop_write_file(filp);
1570
	return ret;
J
Jaegeuk Kim 已提交
1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584
}

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;

1585 1586
	inode_lock(inode);

1587 1588 1589
	if (f2fs_is_volatile_file(inode))
		goto err_out;

1590
	if (f2fs_is_atomic_file(inode)) {
1591
		ret = commit_inmem_pages(inode);
C
Chao Yu 已提交
1592
		if (ret)
1593
			goto err_out;
C
Chao Yu 已提交
1594

1595
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
C
Chao Yu 已提交
1596 1597 1598
		if (!ret) {
			clear_inode_flag(inode, FI_ATOMIC_FILE);
			stat_dec_atomic_write(inode);
1599
		}
1600 1601
	} else {
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1602
	}
1603
err_out:
1604
	inode_unlock(inode);
J
Jaegeuk Kim 已提交
1605 1606 1607 1608
	mnt_drop_write_file(filp);
	return ret;
}

1609 1610 1611
static int f2fs_ioc_start_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1612
	int ret;
1613 1614 1615 1616

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

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

1620 1621 1622 1623
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1624 1625
	inode_lock(inode);

1626
	if (f2fs_is_volatile_file(inode))
1627
		goto out;
1628

1629 1630
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1631
		goto out;
1632

1633 1634 1635
	stat_inc_volatile_write(inode);
	stat_update_max_volatile_write(inode);

1636
	set_inode_flag(inode, FI_VOLATILE_FILE);
1637
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1638
out:
1639
	inode_unlock(inode);
1640 1641
	mnt_drop_write_file(filp);
	return ret;
1642 1643
}

1644 1645 1646
static int f2fs_ioc_release_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1647
	int ret;
1648 1649 1650 1651

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

1652 1653 1654 1655
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1656 1657
	inode_lock(inode);

1658
	if (!f2fs_is_volatile_file(inode))
1659
		goto out;
1660

1661 1662 1663 1664
	if (!f2fs_is_first_block_written(inode)) {
		ret = truncate_partial_data_page(inode, 0, true);
		goto out;
	}
1665

1666 1667
	ret = punch_hole(inode, 0, F2FS_BLKSIZE);
out:
1668
	inode_unlock(inode);
1669 1670
	mnt_drop_write_file(filp);
	return ret;
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
}

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;

1685 1686
	inode_lock(inode);

1687
	if (f2fs_is_atomic_file(inode))
1688
		drop_inmem_pages(inode);
1689
	if (f2fs_is_volatile_file(inode)) {
1690
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1691
		stat_dec_volatile_write(inode);
1692
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1693
	}
1694

1695 1696
	inode_unlock(inode);

1697
	mnt_drop_write_file(filp);
1698
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1699 1700 1701
	return ret;
}

J
Jaegeuk Kim 已提交
1702 1703 1704 1705 1706 1707
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;
1708
	int ret;
J
Jaegeuk Kim 已提交
1709 1710 1711 1712 1713 1714 1715

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

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

1716 1717 1718 1719
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

J
Jaegeuk Kim 已提交
1720 1721 1722 1723
	switch (in) {
	case F2FS_GOING_DOWN_FULLSYNC:
		sb = freeze_bdev(sb->s_bdev);
		if (sb && !IS_ERR(sb)) {
1724
			f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1725 1726 1727 1728 1729 1730
			thaw_bdev(sb->s_bdev, sb);
		}
		break;
	case F2FS_GOING_DOWN_METASYNC:
		/* do checkpoint only */
		f2fs_sync_fs(sb, 1);
1731
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1732 1733
		break;
	case F2FS_GOING_DOWN_NOSYNC:
1734
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1735
		break;
1736 1737
	case F2FS_GOING_DOWN_METAFLUSH:
		sync_meta_pages(sbi, META, LONG_MAX);
1738
		f2fs_stop_checkpoint(sbi, false);
1739
		break;
J
Jaegeuk Kim 已提交
1740
	default:
1741 1742
		ret = -EINVAL;
		goto out;
J
Jaegeuk Kim 已提交
1743
	}
1744
	f2fs_update_time(sbi, REQ_TIME);
1745 1746 1747
out:
	mnt_drop_write_file(filp);
	return ret;
J
Jaegeuk Kim 已提交
1748 1749
}

1750 1751 1752 1753 1754 1755 1756
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;
1757

1758 1759
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;
1760

1761 1762
	if (!blk_queue_discard(q))
		return -EOPNOTSUPP;
1763

1764 1765 1766
	if (copy_from_user(&range, (struct fstrim_range __user *)arg,
				sizeof(range)))
		return -EFAULT;
1767

1768 1769 1770 1771
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1772 1773 1774
	range.minlen = max((unsigned int)range.minlen,
				q->limits.discard_granularity);
	ret = f2fs_trim_fs(F2FS_SB(sb), &range);
1775
	mnt_drop_write_file(filp);
1776 1777
	if (ret < 0)
		return ret;
1778

1779 1780 1781
	if (copy_to_user((struct fstrim_range __user *)arg, &range,
				sizeof(range)))
		return -EFAULT;
1782
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1783 1784 1785
	return 0;
}

1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
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);

1800
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1801

1802
	return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
1803 1804 1805 1806
}

static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg)
{
1807
	return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
}

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 已提交
1829
	err = f2fs_commit_super(sbi, false);
1830 1831 1832
	if (err) {
		/* undo new data */
		memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
1833
		mnt_drop_write_file(filp);
1834 1835
		return err;
	}
1836
	mnt_drop_write_file(filp);
1837 1838 1839 1840 1841 1842 1843
got_it:
	if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
									16))
		return -EFAULT;
	return 0;
}

1844 1845 1846 1847
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 已提交
1848
	__u32 sync;
1849
	int ret;
1850 1851 1852 1853

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

C
Chao Yu 已提交
1854
	if (get_user(sync, (__u32 __user *)arg))
1855 1856
		return -EFAULT;

C
Chao Yu 已提交
1857 1858
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
1859

1860 1861 1862 1863
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

C
Chao Yu 已提交
1864
	if (!sync) {
1865 1866 1867 1868
		if (!mutex_trylock(&sbi->gc_mutex)) {
			ret = -EBUSY;
			goto out;
		}
C
Chao Yu 已提交
1869 1870
	} else {
		mutex_lock(&sbi->gc_mutex);
1871 1872
	}

1873
	ret = f2fs_gc(sbi, sync, true, NULL_SEGNO);
1874 1875 1876
out:
	mnt_drop_write_file(filp);
	return ret;
1877 1878
}

1879 1880 1881 1882
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);
1883
	int ret;
1884 1885 1886 1887 1888 1889 1890

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

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

1891 1892 1893 1894 1895 1896 1897 1898
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

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

	mnt_drop_write_file(filp);
	return ret;
1899 1900
}

C
Chao Yu 已提交
1901 1902 1903 1904 1905
static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
					struct file *filp,
					struct f2fs_defragment *range)
{
	struct inode *inode = file_inode(filp);
1906
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL };
1907
	struct extent_info ei = {0,0,0};
C
Chao Yu 已提交
1908
	pgoff_t pg_start, pg_end;
1909
	unsigned int blk_per_seg = sbi->blocks_per_seg;
C
Chao Yu 已提交
1910 1911 1912 1913 1914 1915
	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 */
1916
	if (need_inplace_update_policy(inode, NULL))
C
Chao Yu 已提交
1917 1918
		return -EINVAL;

1919 1920
	pg_start = range->start >> PAGE_SHIFT;
	pg_end = (range->start + range->len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1921

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

A
Al Viro 已提交
1924
	inode_lock(inode);
C
Chao Yu 已提交
1925 1926 1927

	/* writeback all dirty pages in the range */
	err = filemap_write_and_wait_range(inode->i_mapping, range->start,
1928
						range->start + range->len - 1);
C
Chao Yu 已提交
1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948
	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 已提交
1949
		map.m_len = pg_end - map.m_lblk;
C
Chao Yu 已提交
1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973
		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;

1974
	sec_num = (map.m_len + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
C
Chao Yu 已提交
1975 1976 1977 1978 1979 1980

	/*
	 * make sure there are enough free section for LFS allocation, this can
	 * avoid defragment running in SSR mode when free section are allocated
	 * intensively
	 */
1981
	if (has_not_enough_free_secs(sbi, 0, sec_num)) {
C
Chao Yu 已提交
1982 1983 1984 1985 1986 1987 1988 1989 1990
		err = -EAGAIN;
		goto out;
	}

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

do_map:
F
Fan Li 已提交
1991
		map.m_len = pg_end - map.m_lblk;
C
Chao Yu 已提交
1992 1993 1994 1995 1996 1997 1998 1999 2000
		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;
		}

2001
		set_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025

		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;

2026
		clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2027 2028 2029 2030 2031 2032

		err = filemap_fdatawrite(inode->i_mapping);
		if (err)
			goto out;
	}
clear_out:
2033
	clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2034
out:
A
Al Viro 已提交
2035
	inode_unlock(inode);
C
Chao Yu 已提交
2036
	if (!err)
2037
		range->len = (u64)total << PAGE_SHIFT;
C
Chao Yu 已提交
2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050
	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;

2051
	if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
2052 2053
		return -EINVAL;

2054 2055
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
C
Chao Yu 已提交
2056 2057

	if (copy_from_user(&range, (struct f2fs_defragment __user *)arg,
2058 2059
							sizeof(range)))
		return -EFAULT;
C
Chao Yu 已提交
2060 2061

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

S
Sheng Yong 已提交
2065
	if (unlikely((range.start + range.len) >> PAGE_SHIFT >
2066 2067 2068 2069 2070 2071
					sbi->max_file_blocks))
		return -EINVAL;

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

C
Chao Yu 已提交
2073
	err = f2fs_defragment_range(sbi, filp, &range);
2074 2075
	mnt_drop_write_file(filp);

2076
	f2fs_update_time(sbi, REQ_TIME);
C
Chao Yu 已提交
2077
	if (err < 0)
2078
		return err;
C
Chao Yu 已提交
2079 2080 2081

	if (copy_to_user((struct f2fs_defragment __user *)arg, &range,
							sizeof(range)))
2082 2083 2084
		return -EFAULT;

	return 0;
C
Chao Yu 已提交
2085 2086
}

2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103
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;

2104 2105
	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode))
		return -EINVAL;
2106 2107 2108 2109

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

2110 2111 2112 2113 2114 2115 2116
	if (src == dst) {
		if (pos_in == pos_out)
			return 0;
		if (pos_out > pos_in && pos_out < pos_in + len)
			return -EINVAL;
	}

2117
	inode_lock(src);
2118 2119 2120 2121 2122 2123
	if (src != dst) {
		if (!inode_trylock(dst)) {
			ret = -EBUSY;
			goto out;
		}
	}
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167

	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);
2168 2169 2170
	ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
				pos_out >> F2FS_BLKSIZE_BITS,
				len >> F2FS_BLKSIZE_BITS, false);
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181

	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);
2182
out:
2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217
	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);
2218 2219
	if (err)
		goto err_out;
2220 2221 2222 2223 2224 2225 2226 2227 2228

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

2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 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
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;
}


2292 2293 2294 2295 2296 2297 2298
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 已提交
2299 2300
	case F2FS_IOC_GETVERSION:
		return f2fs_ioc_getversion(filp, arg);
J
Jaegeuk Kim 已提交
2301 2302 2303 2304
	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);
2305 2306
	case F2FS_IOC_START_VOLATILE_WRITE:
		return f2fs_ioc_start_volatile_write(filp);
2307 2308 2309 2310
	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 已提交
2311 2312
	case F2FS_IOC_SHUTDOWN:
		return f2fs_ioc_shutdown(filp, arg);
2313 2314
	case FITRIM:
		return f2fs_ioc_fitrim(filp, arg);
2315 2316 2317 2318 2319 2320
	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);
2321 2322
	case F2FS_IOC_GARBAGE_COLLECT:
		return f2fs_ioc_gc(filp, arg);
2323 2324
	case F2FS_IOC_WRITE_CHECKPOINT:
		return f2fs_ioc_write_checkpoint(filp, arg);
C
Chao Yu 已提交
2325 2326
	case F2FS_IOC_DEFRAGMENT:
		return f2fs_ioc_defragment(filp, arg);
2327 2328
	case F2FS_IOC_MOVE_RANGE:
		return f2fs_ioc_move_range(filp, arg);
2329 2330
	case F2FS_IOC_FLUSH_DEVICE:
		return f2fs_ioc_flush_device(filp, arg);
J
Jaegeuk Kim 已提交
2331 2332 2333 2334 2335
	default:
		return -ENOTTY;
	}
}

2336 2337
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
2338 2339
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
2340
	struct blk_plug plug;
2341
	ssize_t ret;
2342

2343 2344 2345
	inode_lock(inode);
	ret = generic_write_checks(iocb, from);
	if (ret > 0) {
2346
		int err;
2347

2348 2349
		if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
			set_inode_flag(inode, FI_NO_PREALLOC);
2350

2351
		err = f2fs_preallocate_blocks(iocb, from);
2352 2353 2354
		if (err) {
			inode_unlock(inode);
			return err;
2355
		}
2356 2357 2358
		blk_start_plug(&plug);
		ret = __generic_file_write_iter(iocb, from);
		blk_finish_plug(&plug);
2359
		clear_inode_flag(inode, FI_NO_PREALLOC);
2360 2361 2362
	}
	inode_unlock(inode);

2363 2364
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
2365
	return ret;
2366 2367
}

2368 2369 2370 2371 2372 2373 2374 2375 2376 2377
#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;
2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392
	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:
	case F2FS_IOC_WRITE_CHECKPOINT:
	case F2FS_IOC_DEFRAGMENT:
2393
	case F2FS_IOC_MOVE_RANGE:
2394
	case F2FS_IOC_FLUSH_DEVICE:
2395
		break;
2396 2397 2398 2399 2400 2401 2402
	default:
		return -ENOIOCTLCMD;
	}
	return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
}
#endif

J
Jaegeuk Kim 已提交
2403
const struct file_operations f2fs_file_operations = {
2404
	.llseek		= f2fs_llseek,
2405
	.read_iter	= generic_file_read_iter,
2406 2407
	.write_iter	= f2fs_file_write_iter,
	.open		= f2fs_file_open,
2408
	.release	= f2fs_release_file,
J
Jaegeuk Kim 已提交
2409 2410 2411 2412
	.mmap		= f2fs_file_mmap,
	.fsync		= f2fs_sync_file,
	.fallocate	= f2fs_fallocate,
	.unlocked_ioctl	= f2fs_ioctl,
2413 2414 2415
#ifdef CONFIG_COMPAT
	.compat_ioctl	= f2fs_compat_ioctl,
#endif
J
Jaegeuk Kim 已提交
2416
	.splice_read	= generic_file_splice_read,
A
Al Viro 已提交
2417
	.splice_write	= iter_file_splice_write,
J
Jaegeuk Kim 已提交
2418
};