file.c 70.8 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 vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
37 38
{
	struct inode *inode = file_inode(vmf->vma->vm_file);
39
	vm_fault_t ret;
40 41

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

45
	return ret;
46 47
}

48
static vm_fault_t 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 57 58 59 60
	if (unlikely(f2fs_cp_error(sbi))) {
		err = -EIO;
		goto err;
	}

J
Jaegeuk Kim 已提交
61
	sb_start_pagefault(inode->i_sb);
62 63

	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
64

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

J
Jaegeuk Kim 已提交
76
	f2fs_balance_fs(sbi, dn.node_changed);
77

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

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

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

C
Chao Yu 已提交
106 107
	f2fs_update_iostat(sbi, APP_MAPPED_IO, F2FS_BLKSIZE);

108
	trace_f2fs_vm_page_mkwrite(page, DATA);
109 110
mapped:
	/* fill the page */
111
	f2fs_wait_on_page_writeback(page, DATA, false);
112

113 114
	/* wait for GCed page writeback via META_MAPPING */
	if (f2fs_post_read_required(inode))
115
		f2fs_wait_on_block_writeback(sbi, dn.data_blkaddr);
116

117 118
out_sem:
	up_read(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
119 120
out:
	sb_end_pagefault(inode->i_sb);
121
	f2fs_update_time(sbi, REQ_TIME);
122
err:
J
Jaegeuk Kim 已提交
123 124 125 126
	return block_page_mkwrite_return(err);
}

static const struct vm_operations_struct f2fs_file_vm_ops = {
127
	.fault		= f2fs_filemap_fault,
128
	.map_pages	= filemap_map_pages,
129
	.page_mkwrite	= f2fs_vm_page_mkwrite,
J
Jaegeuk Kim 已提交
130 131
};

132 133 134 135 136 137 138 139 140 141
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;

142 143
	*pino = parent_ino(dentry);
	dput(dentry);
144 145 146
	return 1;
}

C
Chao Yu 已提交
147
static inline enum cp_reason_type need_do_checkpoint(struct inode *inode)
148
{
149
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
C
Chao Yu 已提交
150
	enum cp_reason_type cp_reason = CP_NO_NEEDED;
151

C
Chao Yu 已提交
152 153 154 155
	if (!S_ISREG(inode->i_mode))
		cp_reason = CP_NON_REGULAR;
	else if (inode->i_nlink != 1)
		cp_reason = CP_HARDLINK;
156
	else if (is_sbi_flag_set(sbi, SBI_NEED_CP))
C
Chao Yu 已提交
157
		cp_reason = CP_SB_NEED_CP;
158
	else if (file_wrong_pino(inode))
C
Chao Yu 已提交
159
		cp_reason = CP_WRONG_PINO;
C
Chao Yu 已提交
160
	else if (!f2fs_space_for_roll_forward(sbi))
C
Chao Yu 已提交
161
		cp_reason = CP_NO_SPC_ROLL;
C
Chao Yu 已提交
162
	else if (!f2fs_is_checkpointed_node(sbi, F2FS_I(inode)->i_pino))
C
Chao Yu 已提交
163
		cp_reason = CP_NODE_NEED_CP;
164
	else if (test_opt(sbi, FASTBOOT))
C
Chao Yu 已提交
165
		cp_reason = CP_FASTBOOT_MODE;
166
	else if (F2FS_OPTION(sbi).active_logs == 2)
C
Chao Yu 已提交
167
		cp_reason = CP_SPEC_LOG_NUM;
168
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT &&
C
Chao Yu 已提交
169 170 171
		f2fs_need_dentry_mark(sbi, inode->i_ino) &&
		f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino,
							TRANS_DIR_INO))
172
		cp_reason = CP_RECOVER_DIR;
173

C
Chao Yu 已提交
174
	return cp_reason;
175 176
}

177 178 179 180 181
static bool need_inode_page_update(struct f2fs_sb_info *sbi, nid_t ino)
{
	struct page *i = find_get_page(NODE_MAPPING(sbi), ino);
	bool ret = false;
	/* But we need to avoid that there are some inode updates */
C
Chao Yu 已提交
182
	if ((i && PageDirty(i)) || f2fs_need_inode_block_update(sbi, ino))
183 184 185 186 187
		ret = true;
	f2fs_put_page(i, 0);
	return ret;
}

188 189 190 191 192 193 194 195
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)) {
196
		f2fs_i_pino_write(inode, pino);
197 198
		file_got_pino(inode);
	}
199
	up_write(&fi->i_sem);
200 201
}

202 203
static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
						int datasync, bool atomic)
J
Jaegeuk Kim 已提交
204 205
{
	struct inode *inode = file->f_mapping->host;
206
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
207
	nid_t ino = inode->i_ino;
J
Jaegeuk Kim 已提交
208
	int ret = 0;
C
Chao Yu 已提交
209
	enum cp_reason_type cp_reason = 0;
J
Jaegeuk Kim 已提交
210
	struct writeback_control wbc = {
211
		.sync_mode = WB_SYNC_ALL,
J
Jaegeuk Kim 已提交
212 213 214 215
		.nr_to_write = LONG_MAX,
		.for_reclaim = 0,
	};

216
	if (unlikely(f2fs_readonly(inode->i_sb)))
217 218
		return 0;

219
	trace_f2fs_sync_file_enter(inode);
220 221

	/* if fdatasync is triggered, let's do in-place-update */
J
Jaegeuk Kim 已提交
222
	if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
223
		set_inode_flag(inode, FI_NEED_IPU);
224
	ret = file_write_and_wait_range(file, start, end);
225
	clear_inode_flag(inode, FI_NEED_IPU);
226

227
	if (ret) {
C
Chao Yu 已提交
228
		trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
J
Jaegeuk Kim 已提交
229
		return ret;
230
	}
J
Jaegeuk Kim 已提交
231

232
	/* if the inode is dirty, let's recover all the time */
C
Chao Yu 已提交
233
	if (!f2fs_skip_inode_update(inode, datasync)) {
234
		f2fs_write_inode(inode, NULL);
235 236 237
		goto go_write;
	}

238 239 240
	/*
	 * if there is no written data, don't waste time to write recovery info.
	 */
241
	if (!is_inode_flag_set(inode, FI_APPEND_WRITE) &&
C
Chao Yu 已提交
242
			!f2fs_exist_written_data(sbi, ino, APPEND_INO)) {
243

244 245
		/* it may call write_inode just prior to fsync */
		if (need_inode_page_update(sbi, ino))
246 247
			goto go_write;

248
		if (is_inode_flag_set(inode, FI_UPDATE_WRITE) ||
C
Chao Yu 已提交
249
				f2fs_exist_written_data(sbi, ino, UPDATE_INO))
250 251 252
			goto flush_out;
		goto out;
	}
253
go_write:
254 255 256 257
	/*
	 * Both of fdatasync() and fsync() are able to be recovered from
	 * sudden-power-off.
	 */
258
	down_read(&F2FS_I(inode)->i_sem);
C
Chao Yu 已提交
259
	cp_reason = need_do_checkpoint(inode);
260
	up_read(&F2FS_I(inode)->i_sem);
261

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

266 267 268 269 270
		/*
		 * We've secured consistency through sync_fs. Following pino
		 * will be used only for fsynced inodes after checkpoint.
		 */
		try_to_fix_pino(inode);
271 272
		clear_inode_flag(inode, FI_APPEND_WRITE);
		clear_inode_flag(inode, FI_UPDATE_WRITE);
273 274
		goto out;
	}
275
sync_nodes:
C
Chao Yu 已提交
276
	ret = f2fs_fsync_node_pages(sbi, inode, &wbc, atomic);
277 278
	if (ret)
		goto out;
279

280
	/* if cp_error was enabled, we should avoid infinite loop */
C
Chao Yu 已提交
281 282
	if (unlikely(f2fs_cp_error(sbi))) {
		ret = -EIO;
283
		goto out;
C
Chao Yu 已提交
284
	}
285

C
Chao Yu 已提交
286
	if (f2fs_need_inode_block_update(sbi, ino)) {
287
		f2fs_mark_inode_dirty_sync(inode, true);
288 289
		f2fs_write_inode(inode, NULL);
		goto sync_nodes;
J
Jaegeuk Kim 已提交
290
	}
291

292 293 294 295 296 297 298 299 300
	/*
	 * 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) {
C
Chao Yu 已提交
301
		ret = f2fs_wait_on_node_pages_writeback(sbi, ino);
302 303 304
		if (ret)
			goto out;
	}
305 306

	/* once recovery info is written, don't need to tack this */
C
Chao Yu 已提交
307
	f2fs_remove_ino_entry(sbi, ino, APPEND_INO);
308
	clear_inode_flag(inode, FI_APPEND_WRITE);
309
flush_out:
310
	if (!atomic && F2FS_OPTION(sbi).fsync_mode != FSYNC_MODE_NOBARRIER)
C
Chao Yu 已提交
311
		ret = f2fs_issue_flush(sbi, inode->i_ino);
312
	if (!ret) {
C
Chao Yu 已提交
313
		f2fs_remove_ino_entry(sbi, ino, UPDATE_INO);
314
		clear_inode_flag(inode, FI_UPDATE_WRITE);
C
Chao Yu 已提交
315
		f2fs_remove_ino_entry(sbi, ino, FLUSH_INO);
316
	}
317
	f2fs_update_time(sbi, REQ_TIME);
J
Jaegeuk Kim 已提交
318
out:
C
Chao Yu 已提交
319
	trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
320
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
321 322 323
	return ret;
}

324 325
int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
{
326 327
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file)))))
		return -EIO;
328 329 330
	return f2fs_do_sync_file(file, start, end, datasync, false);
}

331 332 333
static pgoff_t __get_first_dirty_index(struct address_space *mapping,
						pgoff_t pgofs, int whence)
{
334
	struct page *page;
335 336 337 338 339 340
	int nr_pages;

	if (whence != SEEK_DATA)
		return 0;

	/* find first dirty page index */
341 342 343 344 345 346
	nr_pages = find_get_pages_tag(mapping, &pgofs, PAGECACHE_TAG_DIRTY,
				      1, &page);
	if (!nr_pages)
		return ULONG_MAX;
	pgofs = page->index;
	put_page(page);
347 348 349 350 351 352 353 354 355
	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) ||
C
Chao Yu 已提交
356
			is_valid_blkaddr(blkaddr))
357 358 359 360 361 362 363 364 365 366
			return true;
		break;
	case SEEK_HOLE:
		if (blkaddr == NULL_ADDR)
			return true;
		break;
	}
	return false;
}

367 368 369 370 371
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;
372 373 374
	pgoff_t pgofs, end_offset, dirty;
	loff_t data_ofs = offset;
	loff_t isize;
375 376
	int err = 0;

A
Al Viro 已提交
377
	inode_lock(inode);
378 379 380 381 382 383

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

	/* handle inline data case */
C
Chao Yu 已提交
384
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
385 386 387 388 389
		if (whence == SEEK_HOLE)
			data_ofs = isize;
		goto found;
	}

390
	pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
391

392 393
	dirty = __get_first_dirty_index(inode->i_mapping, pgofs, whence);

394
	for (; data_ofs < isize; data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
395
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
396
		err = f2fs_get_dnode_of_data(&dn, pgofs, LOOKUP_NODE);
397 398 399
		if (err && err != -ENOENT) {
			goto fail;
		} else if (err == -ENOENT) {
A
arter97 已提交
400
			/* direct node does not exists */
401
			if (whence == SEEK_DATA) {
C
Chao Yu 已提交
402
				pgofs = f2fs_get_next_page_offset(&dn, pgofs);
403 404 405 406 407 408
				continue;
			} else {
				goto found;
			}
		}

409
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
410 411 412 413

		/* find data/hole in dnode block */
		for (; dn.ofs_in_node < end_offset;
				dn.ofs_in_node++, pgofs++,
414
				data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
415
			block_t blkaddr;
416 417
			blkaddr = datablock_addr(dn.inode,
					dn.node_page, dn.ofs_in_node);
418

419
			if (__found_offset(blkaddr, dirty, pgofs, whence)) {
420 421 422 423 424 425 426 427 428 429
				f2fs_put_dnode(&dn);
				goto found;
			}
		}
		f2fs_put_dnode(&dn);
	}

	if (whence == SEEK_DATA)
		goto fail;
found:
430 431
	if (whence == SEEK_HOLE && data_ofs > isize)
		data_ofs = isize;
A
Al Viro 已提交
432
	inode_unlock(inode);
433 434
	return vfs_setpos(file, data_ofs, maxbytes);
fail:
A
Al Viro 已提交
435
	inode_unlock(inode);
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
	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:
452 453
		if (offset < 0)
			return -ENXIO;
454 455 456 457 458 459
		return f2fs_seek_block(file, offset, whence);
	}

	return -EINVAL;
}

J
Jaegeuk Kim 已提交
460 461
static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma)
{
462
	struct inode *inode = file_inode(file);
463
	int err;
464

465 466 467
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

468
	/* we don't need to use inline_data strictly */
469 470 471
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
472

J
Jaegeuk Kim 已提交
473 474 475 476 477
	file_accessed(file);
	vma->vm_ops = &f2fs_file_vm_ops;
	return 0;
}

478 479
static int f2fs_file_open(struct inode *inode, struct file *filp)
{
480
	int err = fscrypt_file_open(inode, filp);
481

482 483
	if (err)
		return err;
H
Hyunchul Lee 已提交
484 485 486

	filp->f_mode |= FMODE_NOWAIT;

C
Chao Yu 已提交
487
	return dquot_file_open(inode, filp);
488 489
}

C
Chao Yu 已提交
490
void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count)
J
Jaegeuk Kim 已提交
491
{
492
	struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
J
Jaegeuk Kim 已提交
493
	struct f2fs_node *raw_node;
C
Chao Yu 已提交
494
	int nr_free = 0, ofs = dn->ofs_in_node, len = count;
J
Jaegeuk Kim 已提交
495
	__le32 *addr;
496 497 498 499
	int base = 0;

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

501
	raw_node = F2FS_NODE(dn->node_page);
502
	addr = blkaddr_in_node(raw_node) + base + ofs;
J
Jaegeuk Kim 已提交
503

C
Chris Fries 已提交
504
	for (; count > 0; count--, addr++, dn->ofs_in_node++) {
J
Jaegeuk Kim 已提交
505 506 507 508
		block_t blkaddr = le32_to_cpu(*addr);
		if (blkaddr == NULL_ADDR)
			continue;

J
Jaegeuk Kim 已提交
509
		dn->data_blkaddr = NULL_ADDR;
C
Chao Yu 已提交
510 511
		f2fs_set_data_blkaddr(dn);
		f2fs_invalidate_blocks(sbi, blkaddr);
512
		if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
513
			clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
J
Jaegeuk Kim 已提交
514 515
		nr_free++;
	}
C
Chao Yu 已提交
516

J
Jaegeuk Kim 已提交
517
	if (nr_free) {
C
Chao Yu 已提交
518 519 520 521 522
		pgoff_t fofs;
		/*
		 * once we invalidate valid blkaddr in range [ofs, ofs + count],
		 * we will invalidate all blkaddr in the whole range.
		 */
C
Chao Yu 已提交
523
		fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page),
524
							dn->inode) + ofs;
C
Chao Yu 已提交
525
		f2fs_update_extent_cache_range(dn, fofs, 0, len);
526
		dec_valid_block_count(sbi, dn->inode, nr_free);
J
Jaegeuk Kim 已提交
527 528
	}
	dn->ofs_in_node = ofs;
529

530
	f2fs_update_time(sbi, REQ_TIME);
531 532
	trace_f2fs_truncate_data_blocks_range(dn->inode, dn->nid,
					 dn->ofs_in_node, nr_free);
J
Jaegeuk Kim 已提交
533 534
}

C
Chao Yu 已提交
535
void f2fs_truncate_data_blocks(struct dnode_of_data *dn)
J
Jaegeuk Kim 已提交
536
{
C
Chao Yu 已提交
537
	f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK);
J
Jaegeuk Kim 已提交
538 539
}

540
static int truncate_partial_data_page(struct inode *inode, u64 from,
541
								bool cache_only)
J
Jaegeuk Kim 已提交
542
{
543
	loff_t offset = from & (PAGE_SIZE - 1);
544
	pgoff_t index = from >> PAGE_SHIFT;
545
	struct address_space *mapping = inode->i_mapping;
J
Jaegeuk Kim 已提交
546 547
	struct page *page;

548
	if (!offset && !cache_only)
549
		return 0;
J
Jaegeuk Kim 已提交
550

551
	if (cache_only) {
552
		page = find_lock_page(mapping, index);
553 554 555
		if (page && PageUptodate(page))
			goto truncate_out;
		f2fs_put_page(page, 1);
556
		return 0;
557
	}
J
Jaegeuk Kim 已提交
558

C
Chao Yu 已提交
559
	page = f2fs_get_lock_data_page(inode, index, true);
560
	if (IS_ERR(page))
561
		return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
562
truncate_out:
563
	f2fs_wait_on_page_writeback(page, DATA, true);
564
	zero_user(page, offset, PAGE_SIZE - offset);
565 566 567 568

	/* 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)
569
		set_page_dirty(page);
J
Jaegeuk Kim 已提交
570
	f2fs_put_page(page, 1);
571
	return 0;
J
Jaegeuk Kim 已提交
572 573
}

C
Chao Yu 已提交
574
int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock)
J
Jaegeuk Kim 已提交
575
{
576
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
577 578
	struct dnode_of_data dn;
	pgoff_t free_from;
H
Huajun Li 已提交
579
	int count = 0, err = 0;
580
	struct page *ipage;
581
	bool truncate_page = false;
J
Jaegeuk Kim 已提交
582

583 584
	trace_f2fs_truncate_blocks_enter(inode, from);

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

587 588 589
	if (free_from >= sbi->max_file_blocks)
		goto free_partial;

590 591
	if (lock)
		f2fs_lock_op(sbi);
H
Huajun Li 已提交
592

C
Chao Yu 已提交
593
	ipage = f2fs_get_node_page(sbi, inode->i_ino);
594 595 596 597 598 599
	if (IS_ERR(ipage)) {
		err = PTR_ERR(ipage);
		goto out;
	}

	if (f2fs_has_inline_data(inode)) {
C
Chao Yu 已提交
600
		f2fs_truncate_inline_inode(inode, ipage, from);
601
		f2fs_put_page(ipage, 1);
602
		truncate_page = true;
603 604 605 606
		goto out;
	}

	set_new_dnode(&dn, inode, ipage, NULL, 0);
C
Chao Yu 已提交
607
	err = f2fs_get_dnode_of_data(&dn, free_from, LOOKUP_NODE_RA);
J
Jaegeuk Kim 已提交
608 609 610
	if (err) {
		if (err == -ENOENT)
			goto free_next;
611
		goto out;
612 613
	}

614
	count = ADDRS_PER_PAGE(dn.node_page, inode);
J
Jaegeuk Kim 已提交
615 616

	count -= dn.ofs_in_node;
617
	f2fs_bug_on(sbi, count < 0);
618

J
Jaegeuk Kim 已提交
619
	if (dn.ofs_in_node || IS_INODE(dn.node_page)) {
C
Chao Yu 已提交
620
		f2fs_truncate_data_blocks_range(&dn, count);
J
Jaegeuk Kim 已提交
621 622 623 624 625
		free_from += count;
	}

	f2fs_put_dnode(&dn);
free_next:
C
Chao Yu 已提交
626
	err = f2fs_truncate_inode_blocks(inode, free_from);
627 628 629
out:
	if (lock)
		f2fs_unlock_op(sbi);
630
free_partial:
631 632
	/* lastly zero out the first data page */
	if (!err)
633
		err = truncate_partial_data_page(inode, from, truncate_page);
J
Jaegeuk Kim 已提交
634

635
	trace_f2fs_truncate_blocks_exit(inode, err);
J
Jaegeuk Kim 已提交
636 637 638
	return err;
}

639
int f2fs_truncate(struct inode *inode)
J
Jaegeuk Kim 已提交
640
{
641 642
	int err;

643 644 645
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

J
Jaegeuk Kim 已提交
646 647
	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
				S_ISLNK(inode->i_mode)))
648
		return 0;
J
Jaegeuk Kim 已提交
649

650 651
	trace_f2fs_truncate(inode);

652 653 654 655 656 657
#ifdef CONFIG_F2FS_FAULT_INJECTION
	if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
		f2fs_show_injection_info(FAULT_TRUNCATE);
		return -EIO;
	}
#endif
658
	/* we should check inline_data size */
659
	if (!f2fs_may_inline_data(inode)) {
660 661 662
		err = f2fs_convert_inline_inode(inode);
		if (err)
			return err;
663 664
	}

C
Chao Yu 已提交
665
	err = f2fs_truncate_blocks(inode, i_size_read(inode), true);
666 667 668
	if (err)
		return err;

669
	inode->i_mtime = inode->i_ctime = current_time(inode);
670
	f2fs_mark_inode_dirty_sync(inode, false);
671
	return 0;
J
Jaegeuk Kim 已提交
672 673
}

674
int f2fs_getattr(const struct path *path, struct kstat *stat,
C
Chao Yu 已提交
675
		 u32 request_mask, unsigned int query_flags)
J
Jaegeuk Kim 已提交
676
{
677
	struct inode *inode = d_inode(path->dentry);
C
Chao Yu 已提交
678
	struct f2fs_inode_info *fi = F2FS_I(inode);
C
Chao Yu 已提交
679
	struct f2fs_inode *ri;
C
Chao Yu 已提交
680 681
	unsigned int flags;

C
Chao Yu 已提交
682 683 684 685 686 687 688 689
	if (f2fs_has_extra_attr(inode) &&
			f2fs_sb_has_inode_crtime(inode->i_sb) &&
			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
		stat->result_mask |= STATX_BTIME;
		stat->btime.tv_sec = fi->i_crtime.tv_sec;
		stat->btime.tv_nsec = fi->i_crtime.tv_nsec;
	}

690
	flags = fi->i_flags & F2FS_FL_USER_VISIBLE;
691
	if (flags & F2FS_APPEND_FL)
C
Chao Yu 已提交
692
		stat->attributes |= STATX_ATTR_APPEND;
693
	if (flags & F2FS_COMPR_FL)
C
Chao Yu 已提交
694 695 696
		stat->attributes |= STATX_ATTR_COMPRESSED;
	if (f2fs_encrypted_inode(inode))
		stat->attributes |= STATX_ATTR_ENCRYPTED;
697
	if (flags & F2FS_IMMUTABLE_FL)
C
Chao Yu 已提交
698
		stat->attributes |= STATX_ATTR_IMMUTABLE;
699
	if (flags & F2FS_NODUMP_FL)
C
Chao Yu 已提交
700 701 702 703 704 705 706 707
		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 已提交
708
	generic_fillattr(inode, stat);
709 710 711 712 713 714

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

J
Jaegeuk Kim 已提交
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
	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;
741
		set_acl_inode(inode, mode);
J
Jaegeuk Kim 已提交
742 743 744 745 746 747 748 749
	}
}
#else
#define __setattr_copy setattr_copy
#endif

int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
{
750
	struct inode *inode = d_inode(dentry);
J
Jaegeuk Kim 已提交
751
	int err;
752
	bool size_changed = false;
J
Jaegeuk Kim 已提交
753

754 755 756
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

757
	err = setattr_prepare(dentry, attr);
J
Jaegeuk Kim 已提交
758 759 760
	if (err)
		return err;

761 762 763 764
	err = fscrypt_prepare_setattr(dentry, attr);
	if (err)
		return err;

C
Chao Yu 已提交
765 766 767 768 769 770 771 772 773 774 775 776 777 778
	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;
	}

779
	if (attr->ia_valid & ATTR_SIZE) {
780
		if (attr->ia_size <= i_size_read(inode)) {
781
			down_write(&F2FS_I(inode)->i_mmap_sem);
782
			truncate_setsize(inode, attr->ia_size);
783
			err = f2fs_truncate(inode);
784
			up_write(&F2FS_I(inode)->i_mmap_sem);
785 786
			if (err)
				return err;
787 788
		} else {
			/*
789 790
			 * do not trim all blocks after i_size if target size is
			 * larger than i_size.
791
			 */
792
			down_write(&F2FS_I(inode)->i_mmap_sem);
793
			truncate_setsize(inode, attr->ia_size);
794
			up_write(&F2FS_I(inode)->i_mmap_sem);
795 796

			/* should convert inline inode here */
797
			if (!f2fs_may_inline_data(inode)) {
798 799 800 801
				err = f2fs_convert_inline_inode(inode);
				if (err)
					return err;
			}
802
			inode->i_mtime = inode->i_ctime = current_time(inode);
803
		}
804

805 806 807 808
		down_write(&F2FS_I(inode)->i_sem);
		F2FS_I(inode)->last_disk_size = i_size_read(inode);
		up_write(&F2FS_I(inode)->i_sem);

809
		size_changed = true;
J
Jaegeuk Kim 已提交
810 811 812 813 814
	}

	__setattr_copy(inode, attr);

	if (attr->ia_valid & ATTR_MODE) {
C
Chao Yu 已提交
815
		err = posix_acl_chmod(inode, f2fs_get_inode_mode(inode));
816 817 818
		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 已提交
819 820 821
		}
	}

822 823
	/* file size may changed here */
	f2fs_mark_inode_dirty_sync(inode, size_changed);
824 825 826 827

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

J
Jaegeuk Kim 已提交
828 829 830 831 832 833 834
	return err;
}

const struct inode_operations f2fs_file_inode_operations = {
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
835
	.set_acl	= f2fs_set_acl,
J
Jaegeuk Kim 已提交
836 837 838
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
J
Jaegeuk Kim 已提交
839
	.fiemap		= f2fs_fiemap,
J
Jaegeuk Kim 已提交
840 841
};

C
Chao Yu 已提交
842
static int fill_zero(struct inode *inode, pgoff_t index,
J
Jaegeuk Kim 已提交
843 844
					loff_t start, loff_t len)
{
845
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
846 847 848
	struct page *page;

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

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

853
	f2fs_lock_op(sbi);
C
Chao Yu 已提交
854
	page = f2fs_get_new_data_page(inode, NULL, index, false);
855
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
856

C
Chao Yu 已提交
857 858 859
	if (IS_ERR(page))
		return PTR_ERR(page);

860
	f2fs_wait_on_page_writeback(page, DATA, true);
C
Chao Yu 已提交
861 862 863 864
	zero_user(page, start, len);
	set_page_dirty(page);
	f2fs_put_page(page, 1);
	return 0;
J
Jaegeuk Kim 已提交
865 866
}

C
Chao Yu 已提交
867
int f2fs_truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end)
J
Jaegeuk Kim 已提交
868 869 870
{
	int err;

871
	while (pg_start < pg_end) {
J
Jaegeuk Kim 已提交
872
		struct dnode_of_data dn;
873
		pgoff_t end_offset, count;
874

J
Jaegeuk Kim 已提交
875
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
876
		err = f2fs_get_dnode_of_data(&dn, pg_start, LOOKUP_NODE);
J
Jaegeuk Kim 已提交
877
		if (err) {
878
			if (err == -ENOENT) {
C
Chao Yu 已提交
879 880
				pg_start = f2fs_get_next_page_offset(&dn,
								pg_start);
J
Jaegeuk Kim 已提交
881
				continue;
882
			}
J
Jaegeuk Kim 已提交
883 884 885
			return err;
		}

886
		end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
887 888 889 890
		count = min(end_offset - dn.ofs_in_node, pg_end - pg_start);

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

C
Chao Yu 已提交
891
		f2fs_truncate_data_blocks_range(&dn, count);
J
Jaegeuk Kim 已提交
892
		f2fs_put_dnode(&dn);
893 894

		pg_start += count;
J
Jaegeuk Kim 已提交
895 896 897 898
	}
	return 0;
}

C
Chao Yu 已提交
899
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
J
Jaegeuk Kim 已提交
900 901 902
{
	pgoff_t pg_start, pg_end;
	loff_t off_start, off_end;
903
	int ret;
J
Jaegeuk Kim 已提交
904

905 906 907
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
H
Huajun Li 已提交
908

909 910
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
J
Jaegeuk Kim 已提交
911

912 913
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
914 915

	if (pg_start == pg_end) {
C
Chao Yu 已提交
916
		ret = fill_zero(inode, pg_start, off_start,
J
Jaegeuk Kim 已提交
917
						off_end - off_start);
C
Chao Yu 已提交
918 919
		if (ret)
			return ret;
J
Jaegeuk Kim 已提交
920
	} else {
C
Chao Yu 已提交
921 922
		if (off_start) {
			ret = fill_zero(inode, pg_start++, off_start,
923
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
924 925 926 927 928 929 930 931
			if (ret)
				return ret;
		}
		if (off_end) {
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				return ret;
		}
J
Jaegeuk Kim 已提交
932 933 934 935

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

J
Jaegeuk Kim 已提交
938
			f2fs_balance_fs(sbi, true);
J
Jaegeuk Kim 已提交
939

940 941
			blk_start = (loff_t)pg_start << PAGE_SHIFT;
			blk_end = (loff_t)pg_end << PAGE_SHIFT;
942
			down_write(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
943 944
			truncate_inode_pages_range(mapping, blk_start,
					blk_end - 1);
945

946
			f2fs_lock_op(sbi);
C
Chao Yu 已提交
947
			ret = f2fs_truncate_hole(inode, pg_start, pg_end);
948
			f2fs_unlock_op(sbi);
949
			up_write(&F2FS_I(inode)->i_mmap_sem);
J
Jaegeuk Kim 已提交
950 951 952 953 954 955
		}
	}

	return ret;
}

956 957
static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
				int *do_replace, pgoff_t off, pgoff_t len)
C
Chao Yu 已提交
958 959 960
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct dnode_of_data dn;
961
	int ret, done, i;
962

963
next_dnode:
964
	set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
965
	ret = f2fs_get_dnode_of_data(&dn, off, LOOKUP_NODE_RA);
966 967 968
	if (ret && ret != -ENOENT) {
		return ret;
	} else if (ret == -ENOENT) {
969 970 971 972 973 974 975 976 977 978 979
		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++) {
980 981
		*blkaddr = datablock_addr(dn.inode,
					dn.node_page, dn.ofs_in_node);
C
Chao Yu 已提交
982
		if (!f2fs_is_checkpointed_data(sbi, *blkaddr)) {
983 984 985 986 987 988

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

989
			/* do not invalidate this block address */
990
			f2fs_update_data_blkaddr(&dn, NULL_ADDR);
991
			*do_replace = 1;
C
Chao Yu 已提交
992
		}
993
	}
994 995 996 997 998 999 1000 1001
	f2fs_put_dnode(&dn);
next:
	len -= done;
	off += done;
	if (len)
		goto next_dnode;
	return 0;
}
C
Chao Yu 已提交
1002

1003 1004 1005 1006 1007 1008
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 已提交
1009

1010 1011 1012
	for (i = 0; i < len; i++, do_replace++, blkaddr++) {
		if (*do_replace == 0)
			continue;
C
Chao Yu 已提交
1013

1014
		set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1015
		ret = f2fs_get_dnode_of_data(&dn, off + i, LOOKUP_NODE_RA);
1016 1017
		if (ret) {
			dec_valid_block_count(sbi, inode, 1);
C
Chao Yu 已提交
1018
			f2fs_invalidate_blocks(sbi, *blkaddr);
1019 1020
		} else {
			f2fs_update_data_blkaddr(&dn, *blkaddr);
1021
		}
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
		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;
1034

1035 1036 1037 1038
	while (i < len) {
		if (blkaddr[i] == NULL_ADDR && !full) {
			i++;
			continue;
1039
		}
C
Chao Yu 已提交
1040

1041 1042 1043 1044 1045
		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 已提交
1046

1047
			set_new_dnode(&dn, dst_inode, NULL, NULL, 0);
C
Chao Yu 已提交
1048
			ret = f2fs_get_dnode_of_data(&dn, dst + i, ALLOC_NODE);
1049 1050
			if (ret)
				return ret;
C
Chao Yu 已提交
1051

C
Chao Yu 已提交
1052
			f2fs_get_node_info(sbi, dn.nid, &ni);
1053 1054 1055 1056
			ilen = min((pgoff_t)
				ADDRS_PER_PAGE(dn.node_page, dst_inode) -
						dn.ofs_in_node, len - i);
			do {
1057 1058
				dn.data_blkaddr = datablock_addr(dn.inode,
						dn.node_page, dn.ofs_in_node);
C
Chao Yu 已提交
1059
				f2fs_truncate_data_blocks_range(&dn, 1);
1060 1061 1062

				if (do_replace[i]) {
					f2fs_i_blocks_write(src_inode,
C
Chao Yu 已提交
1063
							1, false, false);
1064
					f2fs_i_blocks_write(dst_inode,
C
Chao Yu 已提交
1065
							1, true, false);
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
					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);
1076
			} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
1077

1078 1079 1080 1081
			f2fs_put_dnode(&dn);
		} else {
			struct page *psrc, *pdst;

C
Chao Yu 已提交
1082 1083
			psrc = f2fs_get_lock_data_page(src_inode,
							src + i, true);
1084 1085
			if (IS_ERR(psrc))
				return PTR_ERR(psrc);
C
Chao Yu 已提交
1086
			pdst = f2fs_get_new_data_page(dst_inode, NULL, dst + i,
1087 1088 1089 1090 1091 1092 1093 1094
								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);
1095
			f2fs_put_page(psrc, 1);
C
Chao Yu 已提交
1096

C
Chao Yu 已提交
1097 1098
			ret = f2fs_truncate_hole(src_inode,
						src + i, src + i + 1);
1099 1100 1101 1102
			if (ret)
				return ret;
			i++;
		}
1103 1104
	}
	return 0;
1105
}
C
Chao Yu 已提交
1106

1107 1108
static int __exchange_data_block(struct inode *src_inode,
			struct inode *dst_inode, pgoff_t src, pgoff_t dst,
1109
			pgoff_t len, bool full)
1110 1111 1112
{
	block_t *src_blkaddr;
	int *do_replace;
1113
	pgoff_t olen;
1114 1115
	int ret;

1116 1117
	while (len) {
		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len);
1118

C
Chao Yu 已提交
1119 1120
		src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode),
					sizeof(block_t) * olen, GFP_KERNEL);
1121 1122
		if (!src_blkaddr)
			return -ENOMEM;
1123

C
Chao Yu 已提交
1124 1125
		do_replace = f2fs_kvzalloc(F2FS_I_SB(src_inode),
					sizeof(int) * olen, GFP_KERNEL);
1126 1127 1128 1129
		if (!do_replace) {
			kvfree(src_blkaddr);
			return -ENOMEM;
		}
1130

1131 1132 1133 1134
		ret = __read_out_blkaddrs(src_inode, src_blkaddr,
					do_replace, src, olen);
		if (ret)
			goto roll_back;
1135

1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
		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);
	}
1148 1149 1150
	return 0;

roll_back:
1151
	__roll_back_blkaddrs(src_inode, src_blkaddr, do_replace, src, olen);
1152 1153
	kvfree(src_blkaddr);
	kvfree(do_replace);
1154 1155
	return ret;
}
C
Chao Yu 已提交
1156

1157 1158 1159 1160
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;
1161
	int ret;
1162

1163 1164
	f2fs_balance_fs(sbi, true);
	f2fs_lock_op(sbi);
1165 1166 1167

	f2fs_drop_extent_tree(inode);

1168 1169
	ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
	f2fs_unlock_op(sbi);
C
Chao Yu 已提交
1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
	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;

1186 1187 1188
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1189

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

1193
	/* avoid gc operation during block exchange */
C
Chao Yu 已提交
1194
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1195

1196
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1197 1198 1199
	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1200
		goto out_unlock;
1201

C
Chao Yu 已提交
1202 1203 1204 1205
	truncate_pagecache(inode, offset);

	ret = f2fs_do_collapse(inode, pg_start, pg_end);
	if (ret)
1206
		goto out_unlock;
C
Chao Yu 已提交
1207

1208 1209 1210 1211
	/* 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 已提交
1212
	new_size = i_size_read(inode) - len;
1213
	truncate_pagecache(inode, new_size);
C
Chao Yu 已提交
1214

C
Chao Yu 已提交
1215
	ret = f2fs_truncate_blocks(inode, new_size, true);
C
Chao Yu 已提交
1216
	if (!ret)
1217
		f2fs_i_size_write(inode, new_size);
1218
out_unlock:
1219
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1220
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
C
Chao Yu 已提交
1221 1222 1223
	return ret;
}

1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
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++) {
1234 1235
		if (datablock_addr(dn->inode, dn->node_page,
					dn->ofs_in_node) == NULL_ADDR)
1236 1237 1238 1239
			count++;
	}

	dn->ofs_in_node = ofs_in_node;
C
Chao Yu 已提交
1240
	ret = f2fs_reserve_new_blocks(dn, count);
1241 1242 1243 1244 1245
	if (ret)
		return ret;

	dn->ofs_in_node = ofs_in_node;
	for (index = start; index < end; index++, dn->ofs_in_node++) {
1246 1247
		dn->data_blkaddr = datablock_addr(dn->inode,
					dn->node_page, dn->ofs_in_node);
1248
		/*
C
Chao Yu 已提交
1249
		 * f2fs_reserve_new_blocks will not guarantee entire block
1250 1251 1252 1253 1254 1255 1256
		 * allocation.
		 */
		if (dn->data_blkaddr == NULL_ADDR) {
			ret = -ENOSPC;
			break;
		}
		if (dn->data_blkaddr != NEW_ADDR) {
C
Chao Yu 已提交
1257
			f2fs_invalidate_blocks(sbi, dn->data_blkaddr);
1258
			dn->data_blkaddr = NEW_ADDR;
C
Chao Yu 已提交
1259
			f2fs_set_data_blkaddr(dn);
1260 1261 1262 1263 1264 1265 1266 1267
		}
	}

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

	return ret;
}

C
Chao Yu 已提交
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
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;

1282 1283 1284
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
C
Chao Yu 已提交
1285

1286
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1287 1288
	ret = filemap_write_and_wait_range(mapping, offset, offset + len - 1);
	if (ret)
1289
		goto out_sem;
C
Chao Yu 已提交
1290 1291 1292

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

1293 1294
	pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
	pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1295

1296 1297
	off_start = offset & (PAGE_SIZE - 1);
	off_end = (offset + len) & (PAGE_SIZE - 1);
C
Chao Yu 已提交
1298 1299

	if (pg_start == pg_end) {
C
Chao Yu 已提交
1300 1301 1302
		ret = fill_zero(inode, pg_start, off_start,
						off_end - off_start);
		if (ret)
1303
			goto out_sem;
C
Chao Yu 已提交
1304

C
Chao Yu 已提交
1305 1306 1307
		new_size = max_t(loff_t, new_size, offset + len);
	} else {
		if (off_start) {
C
Chao Yu 已提交
1308
			ret = fill_zero(inode, pg_start++, off_start,
1309
						PAGE_SIZE - off_start);
C
Chao Yu 已提交
1310
			if (ret)
1311
				goto out_sem;
C
Chao Yu 已提交
1312

C
Chao Yu 已提交
1313
			new_size = max_t(loff_t, new_size,
1314
					(loff_t)pg_start << PAGE_SHIFT);
C
Chao Yu 已提交
1315 1316
		}

1317
		for (index = pg_start; index < pg_end;) {
C
Chao Yu 已提交
1318
			struct dnode_of_data dn;
1319 1320
			unsigned int end_offset;
			pgoff_t end;
C
Chao Yu 已提交
1321 1322 1323

			f2fs_lock_op(sbi);

1324
			set_new_dnode(&dn, inode, NULL, NULL, 0);
C
Chao Yu 已提交
1325
			ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE);
C
Chao Yu 已提交
1326 1327 1328 1329 1330
			if (ret) {
				f2fs_unlock_op(sbi);
				goto out;
			}

1331 1332 1333 1334
			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 已提交
1335 1336
			f2fs_put_dnode(&dn);
			f2fs_unlock_op(sbi);
1337 1338 1339

			f2fs_balance_fs(sbi, dn.node_changed);

1340 1341
			if (ret)
				goto out;
C
Chao Yu 已提交
1342

1343
			index = end;
C
Chao Yu 已提交
1344
			new_size = max_t(loff_t, new_size,
1345
					(loff_t)index << PAGE_SHIFT);
C
Chao Yu 已提交
1346 1347 1348
		}

		if (off_end) {
C
Chao Yu 已提交
1349 1350 1351 1352
			ret = fill_zero(inode, pg_end, 0, off_end);
			if (ret)
				goto out;

C
Chao Yu 已提交
1353 1354 1355 1356 1357
			new_size = max_t(loff_t, new_size, offset + len);
		}
	}

out:
1358 1359 1360 1361 1362 1363
	if (new_size > i_size_read(inode)) {
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
		else
			f2fs_i_size_write(inode, new_size);
	}
1364 1365
out_sem:
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1366 1367 1368 1369

	return ret;
}

C
Chao Yu 已提交
1370 1371 1372
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1373
	pgoff_t nr, pg_start, pg_end, delta, idx;
C
Chao Yu 已提交
1374
	loff_t new_size;
1375
	int ret = 0;
C
Chao Yu 已提交
1376 1377

	new_size = i_size_read(inode) + len;
1378 1379 1380
	ret = inode_newsize_ok(inode, new_size);
	if (ret)
		return ret;
C
Chao Yu 已提交
1381 1382 1383 1384 1385 1386 1387 1388

	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;

1389 1390 1391
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		return ret;
1392

J
Jaegeuk Kim 已提交
1393
	f2fs_balance_fs(sbi, true);
1394

1395
	/* avoid gc operation during block exchange */
C
Chao Yu 已提交
1396
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1397

1398
	down_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1399
	ret = f2fs_truncate_blocks(inode, i_size_read(inode), true);
C
Chao Yu 已提交
1400
	if (ret)
1401
		goto out;
C
Chao Yu 已提交
1402 1403 1404 1405

	/* write out all dirty pages from offset */
	ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	if (ret)
1406
		goto out;
C
Chao Yu 已提交
1407 1408 1409

	truncate_pagecache(inode, offset);

1410 1411
	pg_start = offset >> PAGE_SHIFT;
	pg_end = (offset + len) >> PAGE_SHIFT;
C
Chao Yu 已提交
1412
	delta = pg_end - pg_start;
1413 1414 1415 1416 1417 1418 1419
	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 已提交
1420 1421

		f2fs_lock_op(sbi);
1422 1423
		f2fs_drop_extent_tree(inode);

1424 1425
		ret = __exchange_data_block(inode, inode, idx,
					idx + delta, nr, false);
C
Chao Yu 已提交
1426 1427 1428
		f2fs_unlock_op(sbi);
	}

1429 1430 1431 1432 1433
	/* write out all moved pages, if possible */
	filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
	truncate_pagecache(inode, offset);

	if (!ret)
1434
		f2fs_i_size_write(inode, new_size);
1435 1436
out:
	up_write(&F2FS_I(inode)->i_mmap_sem);
C
Chao Yu 已提交
1437
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
C
Chao Yu 已提交
1438 1439 1440
	return ret;
}

J
Jaegeuk Kim 已提交
1441 1442 1443
static int expand_inode_data(struct inode *inode, loff_t offset,
					loff_t len, int mode)
{
1444
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1445
	struct f2fs_map_blocks map = { .m_next_pgofs = NULL,
1446
			.m_next_extent = NULL, .m_seg_type = NO_CHECK_TYPE };
1447
	pgoff_t pg_end;
J
Jaegeuk Kim 已提交
1448
	loff_t new_size = i_size_read(inode);
1449
	loff_t off_end;
1450
	int err;
J
Jaegeuk Kim 已提交
1451

1452 1453 1454
	err = inode_newsize_ok(inode, (len + offset));
	if (err)
		return err;
J
Jaegeuk Kim 已提交
1455

1456 1457 1458
	err = f2fs_convert_inline_inode(inode);
	if (err)
		return err;
1459

J
Jaegeuk Kim 已提交
1460
	f2fs_balance_fs(sbi, true);
1461

1462
	pg_end = ((unsigned long long)offset + len) >> PAGE_SHIFT;
1463
	off_end = (offset + len) & (PAGE_SIZE - 1);
J
Jaegeuk Kim 已提交
1464

1465 1466 1467 1468
	map.m_lblk = ((unsigned long long)offset) >> PAGE_SHIFT;
	map.m_len = pg_end - map.m_lblk;
	if (off_end)
		map.m_len++;
1469

1470 1471
	err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
	if (err) {
1472
		pgoff_t last_off;
J
Jaegeuk Kim 已提交
1473

1474
		if (!map.m_len)
1475
			return err;
1476

1477 1478 1479 1480 1481 1482 1483
		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 已提交
1484 1485
	}

1486 1487 1488 1489 1490 1491
	if (new_size > i_size_read(inode)) {
		if (mode & FALLOC_FL_KEEP_SIZE)
			file_set_keep_isize(inode);
		else
			f2fs_i_size_write(inode, new_size);
	}
J
Jaegeuk Kim 已提交
1492

1493
	return err;
J
Jaegeuk Kim 已提交
1494 1495 1496 1497 1498
}

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

1502 1503 1504
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

1505 1506 1507 1508
	/* f2fs only support ->fallocate for regular file */
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

C
Chao Yu 已提交
1509 1510
	if (f2fs_encrypted_inode(inode) &&
		(mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))
1511 1512
		return -EOPNOTSUPP;

C
Chao Yu 已提交
1513
	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
C
Chao Yu 已提交
1514 1515
			FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
			FALLOC_FL_INSERT_RANGE))
J
Jaegeuk Kim 已提交
1516 1517
		return -EOPNOTSUPP;

A
Al Viro 已提交
1518
	inode_lock(inode);
1519

1520 1521 1522 1523
	if (mode & FALLOC_FL_PUNCH_HOLE) {
		if (offset >= inode->i_size)
			goto out;

C
Chao Yu 已提交
1524
		ret = punch_hole(inode, offset, len);
C
Chao Yu 已提交
1525 1526
	} else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
		ret = f2fs_collapse_range(inode, offset, len);
C
Chao Yu 已提交
1527 1528
	} else if (mode & FALLOC_FL_ZERO_RANGE) {
		ret = f2fs_zero_range(inode, offset, len, mode);
C
Chao Yu 已提交
1529 1530
	} else if (mode & FALLOC_FL_INSERT_RANGE) {
		ret = f2fs_insert_range(inode, offset, len);
C
Chao Yu 已提交
1531
	} else {
J
Jaegeuk Kim 已提交
1532
		ret = expand_inode_data(inode, offset, len, mode);
C
Chao Yu 已提交
1533
	}
J
Jaegeuk Kim 已提交
1534

1535
	if (!ret) {
1536
		inode->i_mtime = inode->i_ctime = current_time(inode);
1537
		f2fs_mark_inode_dirty_sync(inode, false);
1538
		f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1539
	}
1540

1541
out:
A
Al Viro 已提交
1542
	inode_unlock(inode);
1543

1544
	trace_f2fs_fallocate(inode, mode, offset, len, ret);
J
Jaegeuk Kim 已提交
1545 1546 1547
	return ret;
}

1548 1549
static int f2fs_release_file(struct inode *inode, struct file *filp)
{
1550 1551 1552 1553 1554 1555 1556 1557
	/*
	 * 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;

1558 1559
	/* some remained atomic pages should discarded */
	if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
1560
		f2fs_drop_inmem_pages(inode);
1561
	if (f2fs_is_volatile_file(inode)) {
1562
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1563
		stat_dec_volatile_write(inode);
1564
		set_inode_flag(inode, FI_DROP_CACHE);
1565
		filemap_fdatawrite(inode->i_mapping);
1566
		clear_inode_flag(inode, FI_DROP_CACHE);
1567 1568 1569 1570
	}
	return 0;
}

1571
static int f2fs_file_flush(struct file *file, fl_owner_t id)
J
Jaegeuk Kim 已提交
1572
{
1573 1574 1575 1576 1577 1578 1579 1580 1581 1582
	struct inode *inode = file_inode(file);

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

1587
static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
J
Jaegeuk Kim 已提交
1588
{
A
Al Viro 已提交
1589
	struct inode *inode = file_inode(filp);
J
Jaegeuk Kim 已提交
1590
	struct f2fs_inode_info *fi = F2FS_I(inode);
1591 1592 1593 1594 1595 1596 1597 1598 1599
	unsigned int flags = fi->i_flags;

	if (file_is_encrypt(inode))
		flags |= F2FS_ENCRYPT_FL;
	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode))
		flags |= F2FS_INLINE_DATA_FL;

	flags &= F2FS_FL_USER_VISIBLE;

1600 1601
	return put_user(flags, (int __user *)arg);
}
J
Jaegeuk Kim 已提交
1602

1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615
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;

1616
	if ((flags ^ oldflags) & (F2FS_APPEND_FL | F2FS_IMMUTABLE_FL))
1617 1618 1619
		if (!capable(CAP_LINUX_IMMUTABLE))
			return -EPERM;

1620 1621
	flags = flags & F2FS_FL_USER_MODIFIABLE;
	flags |= oldflags & ~F2FS_FL_USER_MODIFIABLE;
1622 1623
	fi->i_flags = flags;

1624
	if (fi->i_flags & F2FS_PROJINHERIT_FL)
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
		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;
}

1635 1636 1637
static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
{
	struct inode *inode = file_inode(filp);
1638
	unsigned int flags;
1639
	int ret;
J
Jaegeuk Kim 已提交
1640

1641 1642 1643 1644 1645 1646
	if (!inode_owner_or_capable(inode))
		return -EACCES;

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

1647 1648 1649
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;
J
Jaegeuk Kim 已提交
1650

A
Al Viro 已提交
1651
	inode_lock(inode);
J
Jaegeuk Kim 已提交
1652

1653
	ret = __f2fs_ioc_setflags(inode, flags);
J
Jaegeuk Kim 已提交
1654

1655
	inode_unlock(inode);
1656 1657 1658
	mnt_drop_write_file(filp);
	return ret;
}
1659

C
Chao Yu 已提交
1660 1661 1662 1663 1664 1665 1666
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 已提交
1667 1668 1669
static int f2fs_ioc_start_atomic_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1670
	int ret;
J
Jaegeuk Kim 已提交
1671 1672 1673 1674

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

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

1678 1679 1680 1681
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1682 1683
	inode_lock(inode);

C
Chao Yu 已提交
1684
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1685

1686
	if (f2fs_is_atomic_file(inode))
1687
		goto out;
J
Jaegeuk Kim 已提交
1688

1689 1690
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1691
		goto out;
J
Jaegeuk Kim 已提交
1692

1693
	if (!get_dirty_pages(inode))
1694
		goto skip_flush;
1695 1696

	f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
1697
		"Unexpected flush for atomic writes: ino=%lu, npages=%u",
1698 1699
					inode->i_ino, get_dirty_pages(inode));
	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
1700
	if (ret)
1701
		goto out;
1702 1703
skip_flush:
	set_inode_flag(inode, FI_ATOMIC_FILE);
1704
	clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
1705
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1706

1707
	F2FS_I(inode)->inmem_task = current;
1708 1709
	stat_inc_atomic_write(inode);
	stat_update_max_atomic_write(inode);
1710
out:
C
Chao Yu 已提交
1711
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1712
	inode_unlock(inode);
1713
	mnt_drop_write_file(filp);
1714
	return ret;
J
Jaegeuk Kim 已提交
1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728
}

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;

1729 1730
	inode_lock(inode);

C
Chao Yu 已提交
1731
	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1732

1733 1734
	if (f2fs_is_volatile_file(inode)) {
		ret = -EINVAL;
1735
		goto err_out;
1736
	}
1737

1738
	if (f2fs_is_atomic_file(inode)) {
C
Chao Yu 已提交
1739
		ret = f2fs_commit_inmem_pages(inode);
C
Chao Yu 已提交
1740
		if (ret)
1741
			goto err_out;
C
Chao Yu 已提交
1742

1743
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
C
Chao Yu 已提交
1744 1745
		if (!ret) {
			clear_inode_flag(inode, FI_ATOMIC_FILE);
1746
			F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
C
Chao Yu 已提交
1747
			stat_dec_atomic_write(inode);
1748
		}
1749
	} else {
1750
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false);
1751
	}
1752
err_out:
1753 1754 1755 1756
	if (is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST)) {
		clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
		ret = -EINVAL;
	}
C
Chao Yu 已提交
1757
	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1758
	inode_unlock(inode);
J
Jaegeuk Kim 已提交
1759 1760 1761 1762
	mnt_drop_write_file(filp);
	return ret;
}

1763 1764 1765
static int f2fs_ioc_start_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1766
	int ret;
1767 1768 1769 1770

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

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

1774 1775 1776 1777
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1778 1779
	inode_lock(inode);

1780
	if (f2fs_is_volatile_file(inode))
1781
		goto out;
1782

1783 1784
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
1785
		goto out;
1786

1787 1788 1789
	stat_inc_volatile_write(inode);
	stat_update_max_volatile_write(inode);

1790
	set_inode_flag(inode, FI_VOLATILE_FILE);
1791
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1792
out:
1793
	inode_unlock(inode);
1794 1795
	mnt_drop_write_file(filp);
	return ret;
1796 1797
}

1798 1799 1800
static int f2fs_ioc_release_volatile_write(struct file *filp)
{
	struct inode *inode = file_inode(filp);
1801
	int ret;
1802 1803 1804 1805

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

1806 1807 1808 1809
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1810 1811
	inode_lock(inode);

1812
	if (!f2fs_is_volatile_file(inode))
1813
		goto out;
1814

1815 1816 1817 1818
	if (!f2fs_is_first_block_written(inode)) {
		ret = truncate_partial_data_page(inode, 0, true);
		goto out;
	}
1819

1820 1821
	ret = punch_hole(inode, 0, F2FS_BLKSIZE);
out:
1822
	inode_unlock(inode);
1823 1824
	mnt_drop_write_file(filp);
	return ret;
1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838
}

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;

1839 1840
	inode_lock(inode);

1841
	if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
1842
		f2fs_drop_inmem_pages(inode);
1843
	if (f2fs_is_volatile_file(inode)) {
1844
		clear_inode_flag(inode, FI_VOLATILE_FILE);
1845
		stat_dec_volatile_write(inode);
1846
		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1847
	}
1848

1849 1850
	inode_unlock(inode);

1851
	mnt_drop_write_file(filp);
1852
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1853 1854 1855
	return ret;
}

J
Jaegeuk Kim 已提交
1856 1857 1858 1859 1860 1861
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;
1862
	int ret;
J
Jaegeuk Kim 已提交
1863 1864 1865 1866 1867 1868 1869

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

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

1870 1871 1872 1873 1874
	if (in != F2FS_GOING_DOWN_FULLSYNC) {
		ret = mnt_want_write_file(filp);
		if (ret)
			return ret;
	}
1875

J
Jaegeuk Kim 已提交
1876 1877 1878
	switch (in) {
	case F2FS_GOING_DOWN_FULLSYNC:
		sb = freeze_bdev(sb->s_bdev);
1879 1880 1881 1882 1883
		if (IS_ERR(sb)) {
			ret = PTR_ERR(sb);
			goto out;
		}
		if (sb) {
1884
			f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1885 1886 1887 1888 1889
			thaw_bdev(sb->s_bdev, sb);
		}
		break;
	case F2FS_GOING_DOWN_METASYNC:
		/* do checkpoint only */
1890 1891 1892
		ret = f2fs_sync_fs(sb, 1);
		if (ret)
			goto out;
1893
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1894 1895
		break;
	case F2FS_GOING_DOWN_NOSYNC:
1896
		f2fs_stop_checkpoint(sbi, false);
J
Jaegeuk Kim 已提交
1897
		break;
1898
	case F2FS_GOING_DOWN_METAFLUSH:
C
Chao Yu 已提交
1899
		f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_META_IO);
1900
		f2fs_stop_checkpoint(sbi, false);
1901
		break;
J
Jaegeuk Kim 已提交
1902
	default:
1903 1904
		ret = -EINVAL;
		goto out;
J
Jaegeuk Kim 已提交
1905
	}
1906

C
Chao Yu 已提交
1907 1908
	f2fs_stop_gc_thread(sbi);
	f2fs_stop_discard_thread(sbi);
1909

C
Chao Yu 已提交
1910
	f2fs_drop_discard_cmd(sbi);
1911 1912
	clear_opt(sbi, DISCARD);

1913
	f2fs_update_time(sbi, REQ_TIME);
1914
out:
1915 1916
	if (in != F2FS_GOING_DOWN_FULLSYNC)
		mnt_drop_write_file(filp);
1917
	return ret;
J
Jaegeuk Kim 已提交
1918 1919
}

1920 1921 1922 1923 1924 1925 1926
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;
1927

1928 1929
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;
1930

1931 1932
	if (!blk_queue_discard(q))
		return -EOPNOTSUPP;
1933

1934 1935 1936
	if (copy_from_user(&range, (struct fstrim_range __user *)arg,
				sizeof(range)))
		return -EFAULT;
1937

1938 1939 1940 1941
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

1942 1943 1944
	range.minlen = max((unsigned int)range.minlen,
				q->limits.discard_granularity);
	ret = f2fs_trim_fs(F2FS_SB(sb), &range);
1945
	mnt_drop_write_file(filp);
1946 1947
	if (ret < 0)
		return ret;
1948

1949 1950 1951
	if (copy_to_user((struct fstrim_range __user *)arg, &range,
				sizeof(range)))
		return -EFAULT;
1952
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1953 1954 1955
	return 0;
}

1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
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);

1970
	if (!f2fs_sb_has_encrypt(inode->i_sb))
1971 1972
		return -EOPNOTSUPP;

1973
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
1974

1975
	return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
1976 1977 1978 1979
}

static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg)
{
1980
	if (!f2fs_sb_has_encrypt(file_inode(filp)->i_sb))
1981
		return -EOPNOTSUPP;
1982
	return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
1983 1984 1985 1986 1987 1988 1989 1990
}

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;

1991
	if (!f2fs_sb_has_encrypt(inode->i_sb))
1992 1993 1994 1995 1996 1997
		return -EOPNOTSUPP;

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

1998
	down_write(&sbi->sb_lock);
1999 2000 2001 2002

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

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

C
Chao Yu 已提交
2006
	err = f2fs_commit_super(sbi, false);
2007 2008 2009
	if (err) {
		/* undo new data */
		memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
2010
		goto out_err;
2011 2012 2013 2014
	}
got_it:
	if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
									16))
2015 2016
		err = -EFAULT;
out_err:
2017
	up_write(&sbi->sb_lock);
2018 2019
	mnt_drop_write_file(filp);
	return err;
2020 2021
}

2022 2023 2024 2025
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 已提交
2026
	__u32 sync;
2027
	int ret;
2028 2029 2030 2031

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

C
Chao Yu 已提交
2032
	if (get_user(sync, (__u32 __user *)arg))
2033 2034
		return -EFAULT;

C
Chao Yu 已提交
2035 2036
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
2037

2038 2039 2040 2041
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

C
Chao Yu 已提交
2042
	if (!sync) {
2043 2044 2045 2046
		if (!mutex_trylock(&sbi->gc_mutex)) {
			ret = -EBUSY;
			goto out;
		}
C
Chao Yu 已提交
2047 2048
	} else {
		mutex_lock(&sbi->gc_mutex);
2049 2050
	}

2051
	ret = f2fs_gc(sbi, sync, true, NULL_SEGNO);
2052 2053 2054
out:
	mnt_drop_write_file(filp);
	return ret;
2055 2056
}

2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074
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;

2075 2076 2077 2078 2079
	end = range.start + range.len;
	if (range.start < MAIN_BLKADDR(sbi) || end >= MAX_BLKADDR(sbi)) {
		return -EINVAL;
	}

2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

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;
}

C
Chao Yu 已提交
2103
static int f2fs_ioc_f2fs_write_checkpoint(struct file *filp, unsigned long arg)
2104 2105 2106
{
	struct inode *inode = file_inode(filp);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
2107
	int ret;
2108 2109 2110 2111 2112 2113 2114

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

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

2115 2116 2117 2118 2119 2120 2121 2122
	ret = mnt_want_write_file(filp);
	if (ret)
		return ret;

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

	mnt_drop_write_file(filp);
	return ret;
2123 2124
}

C
Chao Yu 已提交
2125 2126 2127 2128 2129
static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
					struct file *filp,
					struct f2fs_defragment *range)
{
	struct inode *inode = file_inode(filp);
2130 2131
	struct f2fs_map_blocks map = { .m_next_extent = NULL,
					.m_seg_type = NO_CHECK_TYPE };
2132
	struct extent_info ei = {0,0,0};
2133
	pgoff_t pg_start, pg_end, next_pgofs;
2134
	unsigned int blk_per_seg = sbi->blocks_per_seg;
C
Chao Yu 已提交
2135 2136 2137 2138 2139 2140
	unsigned int total = 0, sec_num;
	block_t blk_end = 0;
	bool fragmented = false;
	int err;

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

2144 2145
	pg_start = range->start >> PAGE_SHIFT;
	pg_end = (range->start + range->len) >> PAGE_SHIFT;
C
Chao Yu 已提交
2146

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

A
Al Viro 已提交
2149
	inode_lock(inode);
C
Chao Yu 已提交
2150 2151 2152

	/* writeback all dirty pages in the range */
	err = filemap_write_and_wait_range(inode->i_mapping, range->start,
2153
						range->start + range->len - 1);
C
Chao Yu 已提交
2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166
	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;
2167
	map.m_next_pgofs = &next_pgofs;
C
Chao Yu 已提交
2168 2169 2170 2171 2172 2173 2174

	/*
	 * 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 已提交
2175
		map.m_len = pg_end - map.m_lblk;
2176
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
C
Chao Yu 已提交
2177 2178 2179 2180
		if (err)
			goto out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
2181
			map.m_lblk = next_pgofs;
C
Chao Yu 已提交
2182 2183 2184
			continue;
		}

2185
		if (blk_end && blk_end != map.m_pblk)
C
Chao Yu 已提交
2186
			fragmented = true;
2187 2188 2189 2190

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

C
Chao Yu 已提交
2191 2192 2193 2194 2195 2196 2197 2198
		blk_end = map.m_pblk + map.m_len;

		map.m_lblk += map.m_len;
	}

	if (!fragmented)
		goto out;

2199
	sec_num = (total + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
C
Chao Yu 已提交
2200 2201 2202 2203 2204 2205

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

2211 2212 2213 2214
	map.m_lblk = pg_start;
	map.m_len = pg_end - pg_start;
	total = 0;

C
Chao Yu 已提交
2215 2216 2217 2218 2219
	while (map.m_lblk < pg_end) {
		pgoff_t idx;
		int cnt = 0;

do_map:
F
Fan Li 已提交
2220
		map.m_len = pg_end - map.m_lblk;
2221
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
C
Chao Yu 已提交
2222 2223 2224 2225
		if (err)
			goto clear_out;

		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
2226
			map.m_lblk = next_pgofs;
C
Chao Yu 已提交
2227 2228 2229
			continue;
		}

2230
		set_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2231 2232 2233 2234 2235

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

C
Chao Yu 已提交
2236
			page = f2fs_get_lock_data_page(inode, idx, true);
C
Chao Yu 已提交
2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254
			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;

2255
		clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2256 2257 2258 2259 2260 2261

		err = filemap_fdatawrite(inode->i_mapping);
		if (err)
			goto out;
	}
clear_out:
2262
	clear_inode_flag(inode, FI_DO_DEFRAG);
C
Chao Yu 已提交
2263
out:
A
Al Viro 已提交
2264
	inode_unlock(inode);
C
Chao Yu 已提交
2265
	if (!err)
2266
		range->len = (u64)total << PAGE_SHIFT;
C
Chao Yu 已提交
2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279
	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;

2280
	if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
2281 2282
		return -EINVAL;

2283 2284
	if (f2fs_readonly(sbi->sb))
		return -EROFS;
C
Chao Yu 已提交
2285 2286

	if (copy_from_user(&range, (struct f2fs_defragment __user *)arg,
2287 2288
							sizeof(range)))
		return -EFAULT;
C
Chao Yu 已提交
2289 2290

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

S
Sheng Yong 已提交
2294
	if (unlikely((range.start + range.len) >> PAGE_SHIFT >
2295 2296 2297 2298 2299 2300
					sbi->max_file_blocks))
		return -EINVAL;

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

C
Chao Yu 已提交
2302
	err = f2fs_defragment_range(sbi, filp, &range);
2303 2304
	mnt_drop_write_file(filp);

2305
	f2fs_update_time(sbi, REQ_TIME);
C
Chao Yu 已提交
2306
	if (err < 0)
2307
		return err;
C
Chao Yu 已提交
2308 2309 2310

	if (copy_to_user((struct f2fs_defragment __user *)arg, &range,
							sizeof(range)))
2311 2312 2313
		return -EFAULT;

	return 0;
C
Chao Yu 已提交
2314 2315
}

2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332
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;

2333 2334
	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode))
		return -EINVAL;
2335 2336 2337 2338

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

2339 2340 2341 2342 2343 2344 2345
	if (src == dst) {
		if (pos_in == pos_out)
			return 0;
		if (pos_out > pos_in && pos_out < pos_in + len)
			return -EINVAL;
	}

2346
	inode_lock(src);
C
Chao Yu 已提交
2347
	down_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2348
	if (src != dst) {
2349 2350 2351
		ret = -EBUSY;
		if (!inode_trylock(dst))
			goto out;
C
Chao Yu 已提交
2352
		if (!down_write_trylock(&F2FS_I(dst)->i_gc_rwsem[WRITE])) {
2353
			inode_unlock(dst);
2354 2355 2356
			goto out;
		}
	}
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

	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);
2401 2402 2403
	ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
				pos_out >> F2FS_BLKSIZE_BITS,
				len >> F2FS_BLKSIZE_BITS, false);
2404 2405 2406 2407 2408 2409 2410 2411 2412

	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:
2413
	if (src != dst) {
C
Chao Yu 已提交
2414
		up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]);
2415
		inode_unlock(dst);
2416
	}
2417
out:
C
Chao Yu 已提交
2418
	up_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453
	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);
2454 2455
	if (err)
		goto err_out;
2456 2457 2458 2459 2460 2461 2462 2463 2464

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

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
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;
}

2527 2528 2529 2530 2531 2532 2533 2534 2535 2536
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);
}
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
#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;

C
Chao Yu 已提交
2576
	ipage = f2fs_get_node_page(sbi, inode->i_ino);
2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589
	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);

2590 2591 2592
	err = dquot_initialize(inode);
	if (err)
		goto out_unlock;
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 2621 2622 2623 2624

	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;

2625
	if (iflags & F2FS_SYNC_FL)
2626
		xflags |= FS_XFLAG_SYNC;
2627
	if (iflags & F2FS_IMMUTABLE_FL)
2628
		xflags |= FS_XFLAG_IMMUTABLE;
2629
	if (iflags & F2FS_APPEND_FL)
2630
		xflags |= FS_XFLAG_APPEND;
2631
	if (iflags & F2FS_NODUMP_FL)
2632
		xflags |= FS_XFLAG_NODUMP;
2633
	if (iflags & F2FS_NOATIME_FL)
2634
		xflags |= FS_XFLAG_NOATIME;
2635
	if (iflags & F2FS_PROJINHERIT_FL)
2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649
		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)

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

	if (xflags & FS_XFLAG_SYNC)
2650
		iflags |= F2FS_SYNC_FL;
2651
	if (xflags & FS_XFLAG_IMMUTABLE)
2652
		iflags |= F2FS_IMMUTABLE_FL;
2653
	if (xflags & FS_XFLAG_APPEND)
2654
		iflags |= F2FS_APPEND_FL;
2655
	if (xflags & FS_XFLAG_NODUMP)
2656
		iflags |= F2FS_NODUMP_FL;
2657
	if (xflags & FS_XFLAG_NOATIME)
2658
		iflags |= F2FS_NOATIME_FL;
2659
	if (xflags & FS_XFLAG_PROJINHERIT)
2660
		iflags |= F2FS_PROJINHERIT_FL;
2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672

	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 &
2673
				F2FS_FL_USER_VISIBLE);
2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724

	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;
}
2725

2726 2727 2728 2729 2730 2731 2732
int f2fs_pin_file_control(struct inode *inode, bool inc)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

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

2736
	if (fi->i_gc_failures[GC_FAILURE_PIN] > sbi->gc_pin_file_threshold) {
2737 2738
		f2fs_msg(sbi->sb, KERN_WARNING,
			"%s: Enable GC = ino %lx after %x GC trials\n",
2739 2740
			__func__, inode->i_ino,
			fi->i_gc_failures[GC_FAILURE_PIN]);
2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770
		clear_inode_flag(inode, FI_PIN_FILE);
		return -EAGAIN;
	}
	return 0;
}

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

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

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

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

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

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

	inode_lock(inode);

C
Chao Yu 已提交
2771
	if (f2fs_should_update_outplace(inode, NULL)) {
C
Chao Yu 已提交
2772 2773 2774 2775
		ret = -EINVAL;
		goto out;
	}

2776 2777
	if (!pin) {
		clear_inode_flag(inode, FI_PIN_FILE);
2778
		F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN] = 1;
2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790
		goto done;
	}

	if (f2fs_pin_file_control(inode, false)) {
		ret = -EAGAIN;
		goto out;
	}
	ret = f2fs_convert_inline_inode(inode);
	if (ret)
		goto out;

	set_inode_flag(inode, FI_PIN_FILE);
2791
	ret = F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN];
2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805
done:
	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
out:
	inode_unlock(inode);
	mnt_drop_write_file(filp);
	return ret;
}

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

	if (is_inode_flag_set(inode, FI_PIN_FILE))
2806
		pin = F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN];
2807 2808 2809
	return put_user(pin, (u32 __user *)arg);
}

2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829
int f2fs_precache_extents(struct inode *inode)
{
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct f2fs_map_blocks map;
	pgoff_t m_next_extent;
	loff_t end;
	int err;

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

	map.m_lblk = 0;
	map.m_next_pgofs = NULL;
	map.m_next_extent = &m_next_extent;
	map.m_seg_type = NO_CHECK_TYPE;
	end = F2FS_I_SB(inode)->max_file_blocks;

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

C
Chao Yu 已提交
2830
		down_write(&fi->i_gc_rwsem[WRITE]);
2831
		err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_PRECACHE);
C
Chao Yu 已提交
2832
		up_write(&fi->i_gc_rwsem[WRITE]);
2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846
		if (err)
			return err;

		map.m_lblk = m_next_extent;
	}

	return err;
}

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

2847 2848
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
2849 2850 2851
	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
		return -EIO;

2852 2853 2854 2855 2856
	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 已提交
2857 2858
	case F2FS_IOC_GETVERSION:
		return f2fs_ioc_getversion(filp, arg);
J
Jaegeuk Kim 已提交
2859 2860 2861 2862
	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);
2863 2864
	case F2FS_IOC_START_VOLATILE_WRITE:
		return f2fs_ioc_start_volatile_write(filp);
2865 2866 2867 2868
	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 已提交
2869 2870
	case F2FS_IOC_SHUTDOWN:
		return f2fs_ioc_shutdown(filp, arg);
2871 2872
	case FITRIM:
		return f2fs_ioc_fitrim(filp, arg);
2873 2874 2875 2876 2877 2878
	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);
2879 2880
	case F2FS_IOC_GARBAGE_COLLECT:
		return f2fs_ioc_gc(filp, arg);
2881 2882
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
		return f2fs_ioc_gc_range(filp, arg);
2883
	case F2FS_IOC_WRITE_CHECKPOINT:
C
Chao Yu 已提交
2884
		return f2fs_ioc_f2fs_write_checkpoint(filp, arg);
C
Chao Yu 已提交
2885 2886
	case F2FS_IOC_DEFRAGMENT:
		return f2fs_ioc_defragment(filp, arg);
2887 2888
	case F2FS_IOC_MOVE_RANGE:
		return f2fs_ioc_move_range(filp, arg);
2889 2890
	case F2FS_IOC_FLUSH_DEVICE:
		return f2fs_ioc_flush_device(filp, arg);
2891 2892
	case F2FS_IOC_GET_FEATURES:
		return f2fs_ioc_get_features(filp, arg);
2893 2894 2895 2896
	case F2FS_IOC_FSGETXATTR:
		return f2fs_ioc_fsgetxattr(filp, arg);
	case F2FS_IOC_FSSETXATTR:
		return f2fs_ioc_fssetxattr(filp, arg);
2897 2898 2899 2900
	case F2FS_IOC_GET_PIN_FILE:
		return f2fs_ioc_get_pin_file(filp, arg);
	case F2FS_IOC_SET_PIN_FILE:
		return f2fs_ioc_set_pin_file(filp, arg);
2901 2902
	case F2FS_IOC_PRECACHE_EXTENTS:
		return f2fs_ioc_precache_extents(filp, arg);
J
Jaegeuk Kim 已提交
2903 2904 2905 2906 2907
	default:
		return -ENOTTY;
	}
}

2908 2909
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
2910 2911 2912
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
	ssize_t ret;
2913

2914 2915 2916
	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
		return -EIO;

H
Hyunchul Lee 已提交
2917 2918 2919 2920 2921 2922 2923 2924 2925
	if ((iocb->ki_flags & IOCB_NOWAIT) && !(iocb->ki_flags & IOCB_DIRECT))
		return -EINVAL;

	if (!inode_trylock(inode)) {
		if (iocb->ki_flags & IOCB_NOWAIT)
			return -EAGAIN;
		inode_lock(inode);
	}

2926 2927
	ret = generic_write_checks(iocb, from);
	if (ret > 0) {
2928 2929
		bool preallocated = false;
		size_t target_size = 0;
2930
		int err;
2931

2932 2933
		if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
			set_inode_flag(inode, FI_NO_PREALLOC);
2934

H
Hyunchul Lee 已提交
2935 2936 2937 2938 2939 2940
		if ((iocb->ki_flags & IOCB_NOWAIT) &&
			(iocb->ki_flags & IOCB_DIRECT)) {
				if (!f2fs_overwrite_io(inode, iocb->ki_pos,
						iov_iter_count(from)) ||
					f2fs_has_inline_data(inode) ||
					f2fs_force_buffered_io(inode, WRITE)) {
2941 2942
						clear_inode_flag(inode,
								FI_NO_PREALLOC);
H
Hyunchul Lee 已提交
2943 2944 2945 2946 2947
						inode_unlock(inode);
						return -EAGAIN;
				}

		} else {
2948 2949 2950
			preallocated = true;
			target_size = iocb->ki_pos + iov_iter_count(from);

H
Hyunchul Lee 已提交
2951 2952 2953 2954 2955 2956
			err = f2fs_preallocate_blocks(iocb, from);
			if (err) {
				clear_inode_flag(inode, FI_NO_PREALLOC);
				inode_unlock(inode);
				return err;
			}
2957
		}
2958
		ret = __generic_file_write_iter(iocb, from);
2959
		clear_inode_flag(inode, FI_NO_PREALLOC);
C
Chao Yu 已提交
2960

2961 2962 2963 2964
		/* if we couldn't write data, we should deallocate blocks. */
		if (preallocated && i_size_read(inode) < target_size)
			f2fs_truncate(inode);

C
Chao Yu 已提交
2965 2966
		if (ret > 0)
			f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret);
2967 2968 2969
	}
	inode_unlock(inode);

2970 2971
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
2972
	return ret;
2973 2974
}

2975 2976 2977 2978 2979 2980 2981 2982 2983 2984
#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;
2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997
	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:
2998
	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
2999 3000
	case F2FS_IOC_WRITE_CHECKPOINT:
	case F2FS_IOC_DEFRAGMENT:
3001
	case F2FS_IOC_MOVE_RANGE:
3002
	case F2FS_IOC_FLUSH_DEVICE:
3003
	case F2FS_IOC_GET_FEATURES:
3004 3005
	case F2FS_IOC_FSGETXATTR:
	case F2FS_IOC_FSSETXATTR:
3006 3007
	case F2FS_IOC_GET_PIN_FILE:
	case F2FS_IOC_SET_PIN_FILE:
3008
	case F2FS_IOC_PRECACHE_EXTENTS:
3009
		break;
3010 3011 3012 3013 3014 3015 3016
	default:
		return -ENOIOCTLCMD;
	}
	return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
}
#endif

J
Jaegeuk Kim 已提交
3017
const struct file_operations f2fs_file_operations = {
3018
	.llseek		= f2fs_llseek,
3019
	.read_iter	= generic_file_read_iter,
3020 3021
	.write_iter	= f2fs_file_write_iter,
	.open		= f2fs_file_open,
3022
	.release	= f2fs_release_file,
J
Jaegeuk Kim 已提交
3023
	.mmap		= f2fs_file_mmap,
3024
	.flush		= f2fs_file_flush,
J
Jaegeuk Kim 已提交
3025 3026 3027
	.fsync		= f2fs_sync_file,
	.fallocate	= f2fs_fallocate,
	.unlocked_ioctl	= f2fs_ioctl,
3028 3029 3030
#ifdef CONFIG_COMPAT
	.compat_ioctl	= f2fs_compat_ioctl,
#endif
J
Jaegeuk Kim 已提交
3031
	.splice_read	= generic_file_splice_read,
A
Al Viro 已提交
3032
	.splice_write	= iter_file_splice_write,
J
Jaegeuk Kim 已提交
3033
};