namei.c 27.1 KB
Newer Older
J
Jaegeuk Kim 已提交
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15
 * fs/f2fs/namei.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/pagemap.h>
#include <linux/sched.h>
#include <linux/ctype.h>
C
Chao Yu 已提交
16
#include <linux/dcache.h>
17
#include <linux/namei.h>
C
Chao Yu 已提交
18
#include <linux/quotaops.h>
19 20

#include "f2fs.h"
21
#include "node.h"
22 23
#include "xattr.h"
#include "acl.h"
24
#include <trace/events/f2fs.h>
25 26 27

static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
{
28
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
29 30 31
	nid_t ino;
	struct inode *inode;
	bool nid_free = false;
C
Chao Yu 已提交
32
	int xattr_size = 0;
33
	int err;
34

35
	inode = new_inode(dir->i_sb);
36 37 38
	if (!inode)
		return ERR_PTR(-ENOMEM);

39
	f2fs_lock_op(sbi);
40
	if (!alloc_nid(sbi, &ino)) {
41
		f2fs_unlock_op(sbi);
42 43 44
		err = -ENOSPC;
		goto fail;
	}
45
	f2fs_unlock_op(sbi);
46

C
Chao Yu 已提交
47 48
	nid_free = true;

49
	inode_init_owner(inode, dir, mode);
50 51 52

	inode->i_ino = ino;
	inode->i_blocks = 0;
C
Chao Yu 已提交
53 54
	inode->i_mtime = inode->i_atime = inode->i_ctime =
			F2FS_I(inode)->i_crtime = current_time(inode);
55 56 57 58 59
	inode->i_generation = sbi->s_next_generation++;

	err = insert_inode_locked(inode);
	if (err) {
		err = -EINVAL;
60
		goto fail;
61
	}
C
Chao Yu 已提交
62

C
Chao Yu 已提交
63 64 65 66 67 68 69
	if (f2fs_sb_has_project_quota(sbi->sb) &&
		(F2FS_I(dir)->i_flags & FS_PROJINHERIT_FL))
		F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
	else
		F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns,
							F2FS_DEF_PROJID);

C
Chao Yu 已提交
70 71 72 73 74 75 76 77
	err = dquot_initialize(inode);
	if (err)
		goto fail_drop;

	err = dquot_alloc_inode(inode);
	if (err)
		goto fail_drop;

78 79
	set_inode_flag(inode, FI_NEW_INODE);

80 81 82 83
	/* If the directory encrypted, then we should encrypt the inode. */
	if (f2fs_encrypted_inode(dir) && f2fs_may_encrypt(inode))
		f2fs_set_encrypted_inode(inode);

84 85 86 87 88
	if (f2fs_sb_has_extra_attr(sbi->sb)) {
		set_inode_flag(inode, FI_EXTRA_ATTR);
		F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
	}

89 90
	if (test_opt(sbi, INLINE_XATTR))
		set_inode_flag(inode, FI_INLINE_XATTR);
C
Chao Yu 已提交
91

92
	if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
93
		set_inode_flag(inode, FI_INLINE_DATA);
94
	if (f2fs_may_inline_dentry(inode))
95
		set_inode_flag(inode, FI_INLINE_DENTRY);
C
Chao Yu 已提交
96

C
Chao Yu 已提交
97 98 99 100 101 102 103 104 105 106 107
	if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)) {
		f2fs_bug_on(sbi, !f2fs_has_extra_attr(inode));
		if (f2fs_has_inline_xattr(inode))
			xattr_size = sbi->inline_xattr_size;
		/* Otherwise, will be 0 */
	} else if (f2fs_has_inline_xattr(inode) ||
				f2fs_has_inline_dentry(inode)) {
		xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
	}
	F2FS_I(inode)->i_inline_xattr_size = xattr_size;

J
Jaegeuk Kim 已提交
108 109
	f2fs_init_extent_tree(inode, NULL);

C
Chao Yu 已提交
110
	stat_inc_inline_xattr(inode);
111 112 113
	stat_inc_inline_inode(inode);
	stat_inc_inline_dir(inode);

C
Chao Yu 已提交
114 115 116
	F2FS_I(inode)->i_flags =
		f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);

C
Chao Yu 已提交
117 118 119
	if (S_ISDIR(inode->i_mode))
		F2FS_I(inode)->i_flags |= FS_INDEX_FL;

C
Chao Yu 已提交
120 121 122
	if (F2FS_I(inode)->i_flags & FS_PROJINHERIT_FL)
		set_inode_flag(inode, FI_PROJ_INHERIT);

123
	trace_f2fs_new_inode(inode, 0);
124 125 126
	return inode;

fail:
127
	trace_f2fs_new_inode(inode, err);
128
	make_bad_inode(inode);
129
	if (nid_free)
130
		set_inode_flag(inode, FI_FREE_NID);
131
	iput(inode);
132
	return ERR_PTR(err);
C
Chao Yu 已提交
133 134 135 136 137 138 139 140 141 142
fail_drop:
	trace_f2fs_new_inode(inode, err);
	dquot_drop(inode);
	inode->i_flags |= S_NOQUOTA;
	if (nid_free)
		set_inode_flag(inode, FI_FREE_NID);
	clear_nlink(inode);
	unlock_new_inode(inode);
	iput(inode);
	return ERR_PTR(err);
143 144 145 146
}

static int is_multimedia_file(const unsigned char *s, const char *sub)
{
147 148
	size_t slen = strlen(s);
	size_t sublen = strlen(sub);
149
	int i;
150

C
Chao Yu 已提交
151 152
	/*
	 * filename format of multimedia file should be defined as:
153
	 * "filename + '.' + extension + (optional: '.' + temp extension)".
C
Chao Yu 已提交
154 155 156 157
	 */
	if (slen < sublen + 2)
		return 0;

158 159 160 161 162 163
	for (i = 1; i < slen - sublen; i++) {
		if (s[i] != '.')
			continue;
		if (!strncasecmp(s + i + 1, sub, sublen))
			return 1;
	}
164

165
	return 0;
166 167
}

J
Jaegeuk Kim 已提交
168
/*
169 170
 * Set multimedia files as cold files for hot/cold data separation
 */
171
static inline void set_cold_files(struct f2fs_sb_info *sbi, struct inode *inode,
172 173
		const unsigned char *name)
{
174 175 176 177 178 179
	__u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
	int i, count;

	down_read(&sbi->sb_lock);

	count = le32_to_cpu(sbi->raw_super->extension_count);
180 181

	for (i = 0; i < count; i++) {
182
		if (is_multimedia_file(name, extlist[i])) {
183
			file_set_cold(inode);
184 185 186
			break;
		}
	}
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

	up_read(&sbi->sb_lock);
}

int update_extension_list(struct f2fs_sb_info *sbi, const char *name, bool set)
{
	__u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
	int count = le32_to_cpu(sbi->raw_super->extension_count);
	int i;

	for (i = 0; i < count; i++) {
		if (strcmp(name, extlist[i]))
			continue;

		if (set)
			return -EINVAL;

		memcpy(extlist[i], extlist[i + 1],
				F2FS_EXTENSION_LEN * (count - i - 1));
		memset(extlist[count - 1], 0, F2FS_EXTENSION_LEN);
		sbi->raw_super->extension_count = cpu_to_le32(count - 1);
		return 0;
	}

	if (!set)
		return -EINVAL;

	if (count == F2FS_MAX_EXTENSION)
		return -EINVAL;

	strncpy(extlist[count], name, strlen(name));
	sbi->raw_super->extension_count = cpu_to_le32(count + 1);
	return 0;
220 221 222 223 224
}

static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
						bool excl)
{
225
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
226 227
	struct inode *inode;
	nid_t ino = 0;
228
	int err;
229

230 231 232
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
233 234 235 236
	err = dquot_initialize(dir);
	if (err)
		return err;

237 238 239 240 241
	inode = f2fs_new_inode(dir, mode);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

	if (!test_opt(sbi, DISABLE_EXT_IDENTIFY))
242
		set_cold_files(sbi, inode, dentry->d_name.name);
243 244 245 246 247 248

	inode->i_op = &f2fs_file_inode_operations;
	inode->i_fop = &f2fs_file_operations;
	inode->i_mapping->a_ops = &f2fs_dblock_aops;
	ino = inode->i_ino;

249
	f2fs_lock_op(sbi);
250 251 252
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
253
	f2fs_unlock_op(sbi);
254 255 256

	alloc_nid_done(sbi, ino);

257
	d_instantiate(dentry, inode);
258
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
259 260 261

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
262 263

	f2fs_balance_fs(sbi, true);
264 265
	return 0;
out:
266
	handle_failed_inode(inode);
267 268 269 270 271 272
	return err;
}

static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
		struct dentry *dentry)
{
273
	struct inode *inode = d_inode(old_dentry);
274
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
275
	int err;
276

277 278 279
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

280 281 282
	err = fscrypt_prepare_link(old_dentry, dir, dentry);
	if (err)
		return err;
283

C
Chao Yu 已提交
284 285 286 287 288
	if (is_inode_flag_set(dir, FI_PROJ_INHERIT) &&
			(!projid_eq(F2FS_I(dir)->i_projid,
			F2FS_I(old_dentry->d_inode)->i_projid)))
		return -EXDEV;

C
Chao Yu 已提交
289 290 291 292
	err = dquot_initialize(dir);
	if (err)
		return err;

J
Jaegeuk Kim 已提交
293
	f2fs_balance_fs(sbi, true);
294

295
	inode->i_ctime = current_time(inode);
J
Jaegeuk Kim 已提交
296
	ihold(inode);
297

298
	set_inode_flag(inode, FI_INC_LINK);
299
	f2fs_lock_op(sbi);
300 301 302
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
303
	f2fs_unlock_op(sbi);
304 305

	d_instantiate(dentry, inode);
J
Jaegeuk Kim 已提交
306 307 308

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
309 310
	return 0;
out:
311
	clear_inode_flag(inode, FI_INC_LINK);
312
	iput(inode);
313
	f2fs_unlock_op(sbi);
314 315 316 317 318 319
	return err;
}

struct dentry *f2fs_get_parent(struct dentry *child)
{
	struct qstr dotdot = QSTR_INIT("..", 2);
320 321 322 323 324
	struct page *page;
	unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot, &page);
	if (!ino) {
		if (IS_ERR(page))
			return ERR_CAST(page);
325
		return ERR_PTR(-ENOENT);
326
	}
327
	return d_obtain_alias(f2fs_iget(child->d_sb, ino));
328 329
}

330 331 332 333 334 335 336 337 338
static int __recover_dot_dentries(struct inode *dir, nid_t pino)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
	struct qstr dot = QSTR_INIT(".", 1);
	struct qstr dotdot = QSTR_INIT("..", 2);
	struct f2fs_dir_entry *de;
	struct page *page;
	int err = 0;

339 340 341 342 343 344 345
	if (f2fs_readonly(sbi->sb)) {
		f2fs_msg(sbi->sb, KERN_INFO,
			"skip recovering inline_dots inode (ino:%lu, pino:%u) "
			"in readonly mountpoint", dir->i_ino, pino);
		return 0;
	}

346 347 348 349
	err = dquot_initialize(dir);
	if (err)
		return err;

J
Jaegeuk Kim 已提交
350
	f2fs_balance_fs(sbi, true);
351

352 353 354 355 356
	f2fs_lock_op(sbi);

	de = f2fs_find_entry(dir, &dot, &page);
	if (de) {
		f2fs_put_page(page, 0);
357 358 359
	} else if (IS_ERR(page)) {
		err = PTR_ERR(page);
		goto out;
360 361 362 363 364 365 366
	} else {
		err = __f2fs_add_link(dir, &dot, NULL, dir->i_ino, S_IFDIR);
		if (err)
			goto out;
	}

	de = f2fs_find_entry(dir, &dotdot, &page);
367
	if (de)
368
		f2fs_put_page(page, 0);
369
	else if (IS_ERR(page))
370
		err = PTR_ERR(page);
371
	else
372 373
		err = __f2fs_add_link(dir, &dotdot, NULL, pino, S_IFDIR);
out:
374
	if (!err)
375
		clear_inode_flag(dir, FI_INLINE_DOTS);
376 377 378 379 380

	f2fs_unlock_op(sbi);
	return err;
}

381 382 383 384 385 386
static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
		unsigned int flags)
{
	struct inode *inode = NULL;
	struct f2fs_dir_entry *de;
	struct page *page;
C
Chao Yu 已提交
387 388
	struct dentry *new;
	nid_t ino = -1;
389
	int err = 0;
390
	unsigned int root_ino = F2FS_ROOT_INO(F2FS_I_SB(dir));
391

C
Chao Yu 已提交
392 393
	trace_f2fs_lookup_start(dir, dentry, flags);

394 395 396
	err = fscrypt_prepare_lookup(dir, dentry, flags);
	if (err)
		goto out;
397

C
Chao Yu 已提交
398 399 400 401
	if (dentry->d_name.len > F2FS_NAME_LEN) {
		err = -ENAMETOOLONG;
		goto out;
	}
402 403

	de = f2fs_find_entry(dir, &dentry->d_name, &page);
J
Jaegeuk Kim 已提交
404
	if (!de) {
C
Chao Yu 已提交
405 406 407 408 409
		if (IS_ERR(page)) {
			err = PTR_ERR(page);
			goto out;
		}
		goto out_splice;
J
Jaegeuk Kim 已提交
410
	}
411

J
Jaegeuk Kim 已提交
412 413
	ino = le32_to_cpu(de->ino);
	f2fs_put_page(page, 0);
414

J
Jaegeuk Kim 已提交
415
	inode = f2fs_iget(dir->i_sb, ino);
C
Chao Yu 已提交
416 417 418 419
	if (IS_ERR(inode)) {
		err = PTR_ERR(inode);
		goto out;
	}
420

421 422 423
	if ((dir->i_ino == root_ino) && f2fs_has_inline_dots(dir)) {
		err = __recover_dot_dentries(dir, root_ino);
		if (err)
C
Chao Yu 已提交
424
			goto out_iput;
425 426
	}

427
	if (f2fs_has_inline_dots(inode)) {
J
Jaegeuk Kim 已提交
428
		err = __recover_dot_dentries(inode, dir->i_ino);
429
		if (err)
C
Chao Yu 已提交
430
			goto out_iput;
431
	}
D
Dan Carpenter 已提交
432 433 434
	if (f2fs_encrypted_inode(dir) &&
	    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
	    !fscrypt_has_permitted_context(dir, inode)) {
435 436 437 438
		f2fs_msg(inode->i_sb, KERN_WARNING,
			 "Inconsistent encryption contexts: %lu/%lu",
			 dir->i_ino, inode->i_ino);
		err = -EPERM;
C
Chao Yu 已提交
439
		goto out_iput;
440
	}
C
Chao Yu 已提交
441 442 443 444 445 446 447
out_splice:
	new = d_splice_alias(inode, dentry);
	if (IS_ERR(new))
		err = PTR_ERR(new);
	trace_f2fs_lookup_end(dir, dentry, ino, err);
	return new;
out_iput:
448
	iput(inode);
C
Chao Yu 已提交
449 450
out:
	trace_f2fs_lookup_end(dir, dentry, ino, err);
451
	return ERR_PTR(err);
452 453 454 455
}

static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
{
456
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
457
	struct inode *inode = d_inode(dentry);
458 459 460 461
	struct f2fs_dir_entry *de;
	struct page *page;
	int err = -ENOENT;

462
	trace_f2fs_unlink_enter(dir, dentry);
463

464 465 466
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
467
	err = dquot_initialize(dir);
J
Jaegeuk Kim 已提交
468 469 470
	if (err)
		return err;
	err = dquot_initialize(inode);
C
Chao Yu 已提交
471 472 473
	if (err)
		return err;

474
	de = f2fs_find_entry(dir, &dentry->d_name, &page);
475 476 477
	if (!de) {
		if (IS_ERR(page))
			err = PTR_ERR(page);
478
		goto fail;
479
	}
480

J
Jaegeuk Kim 已提交
481
	f2fs_balance_fs(sbi, true);
482

483
	f2fs_lock_op(sbi);
J
Jaegeuk Kim 已提交
484
	err = acquire_orphan_inode(sbi);
485
	if (err) {
486
		f2fs_unlock_op(sbi);
487 488 489
		f2fs_put_page(page, 0);
		goto fail;
	}
490
	f2fs_delete_entry(de, page, dir, inode);
491
	f2fs_unlock_op(sbi);
492

J
Jaegeuk Kim 已提交
493 494
	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
495
fail:
496
	trace_f2fs_unlink_exit(inode, err);
497 498 499
	return err;
}

500
static const char *f2fs_get_link(struct dentry *dentry,
501 502
				 struct inode *inode,
				 struct delayed_call *done)
503
{
504
	const char *link = page_get_link(dentry, inode, done);
505 506
	if (!IS_ERR(link) && !*link) {
		/* this is broken symlink case */
507 508
		do_delayed_call(done);
		clear_delayed_call(done);
509
		link = ERR_PTR(-ENOENT);
510
	}
511
	return link;
512 513
}

514 515 516
static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
					const char *symname)
{
517
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
518
	struct inode *inode;
519
	size_t len = strlen(symname);
520
	struct fscrypt_str disk_link;
521
	int err;
522

523 524 525
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

526 527 528 529
	err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize,
				      &disk_link);
	if (err)
		return err;
530

C
Chao Yu 已提交
531 532 533 534
	err = dquot_initialize(dir);
	if (err)
		return err;

535 536 537 538
	inode = f2fs_new_inode(dir, S_IFLNK | S_IRWXUGO);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

539
	if (IS_ENCRYPTED(inode))
540 541 542
		inode->i_op = &f2fs_encrypted_symlink_inode_operations;
	else
		inode->i_op = &f2fs_symlink_inode_operations;
543
	inode_nohighmem(inode);
544 545
	inode->i_mapping->a_ops = &f2fs_dblock_aops;

546
	f2fs_lock_op(sbi);
547 548
	err = f2fs_add_link(dentry, inode);
	if (err)
549
		goto out_handle_failed_inode;
550
	f2fs_unlock_op(sbi);
551 552
	alloc_nid_done(sbi, inode->i_ino);

553 554 555
	err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);
	if (err)
		goto err_out;
556

557
	err = page_symlink(inode, disk_link.name, disk_link.len);
558 559

err_out:
560 561
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
562

563 564 565 566 567 568 569 570 571
	/*
	 * Let's flush symlink data in order to avoid broken symlink as much as
	 * possible. Nevertheless, fsyncing is the best way, but there is no
	 * way to get a file descriptor in order to flush that.
	 *
	 * Note that, it needs to do dir->fsync to make this recoverable.
	 * If the symlink path is stored into inline_data, there is no
	 * performance regression.
	 */
C
Chao Yu 已提交
572
	if (!err) {
573 574
		filemap_write_and_wait_range(inode->i_mapping, 0,
							disk_link.len - 1);
575

C
Chao Yu 已提交
576 577 578 579 580
		if (IS_DIRSYNC(dir))
			f2fs_sync_fs(sbi->sb, 1);
	} else {
		f2fs_unlink(dir, dentry);
	}
581

582
	f2fs_balance_fs(sbi, true);
583 584 585
	goto out_free_encrypted_link;

out_handle_failed_inode:
586
	handle_failed_inode(inode);
587 588 589
out_free_encrypted_link:
	if (disk_link.name != (unsigned char *)symname)
		kfree(disk_link.name);
590 591 592 593 594
	return err;
}

static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
{
595
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
596
	struct inode *inode;
597
	int err;
598

599 600 601
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
602 603 604 605
	err = dquot_initialize(dir);
	if (err)
		return err;

606 607
	inode = f2fs_new_inode(dir, S_IFDIR | mode);
	if (IS_ERR(inode))
608
		return PTR_ERR(inode);
609 610 611 612

	inode->i_op = &f2fs_dir_inode_operations;
	inode->i_fop = &f2fs_dir_operations;
	inode->i_mapping->a_ops = &f2fs_dblock_aops;
613
	inode_nohighmem(inode);
614

615
	set_inode_flag(inode, FI_INC_LINK);
616
	f2fs_lock_op(sbi);
617 618 619
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out_fail;
620
	f2fs_unlock_op(sbi);
621 622 623 624 625 626

	alloc_nid_done(sbi, inode->i_ino);

	d_instantiate(dentry, inode);
	unlock_new_inode(inode);

J
Jaegeuk Kim 已提交
627 628
	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
629 630

	f2fs_balance_fs(sbi, true);
631 632 633
	return 0;

out_fail:
634
	clear_inode_flag(inode, FI_INC_LINK);
635
	handle_failed_inode(inode);
636 637 638 639 640
	return err;
}

static int f2fs_rmdir(struct inode *dir, struct dentry *dentry)
{
641
	struct inode *inode = d_inode(dentry);
642 643 644 645 646 647 648 649
	if (f2fs_empty_dir(inode))
		return f2fs_unlink(dir, dentry);
	return -ENOTEMPTY;
}

static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
				umode_t mode, dev_t rdev)
{
650
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
651 652 653
	struct inode *inode;
	int err = 0;

654 655 656
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
657 658 659 660
	err = dquot_initialize(dir);
	if (err)
		return err;

661 662 663 664 665 666 667
	inode = f2fs_new_inode(dir, mode);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

	init_special_inode(inode, inode->i_mode, rdev);
	inode->i_op = &f2fs_special_inode_operations;

668
	f2fs_lock_op(sbi);
669 670 671
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
672
	f2fs_unlock_op(sbi);
673 674

	alloc_nid_done(sbi, inode->i_ino);
J
Jaegeuk Kim 已提交
675

676 677
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
678 679 680

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
681 682

	f2fs_balance_fs(sbi, true);
683 684
	return 0;
out:
685
	handle_failed_inode(inode);
686 687 688
	return err;
}

C
Chao Yu 已提交
689 690 691 692 693 694 695
static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
					umode_t mode, struct inode **whiteout)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
	struct inode *inode;
	int err;

C
Chao Yu 已提交
696 697 698 699
	err = dquot_initialize(dir);
	if (err)
		return err;

C
Chao Yu 已提交
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
	inode = f2fs_new_inode(dir, mode);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

	if (whiteout) {
		init_special_inode(inode, inode->i_mode, WHITEOUT_DEV);
		inode->i_op = &f2fs_special_inode_operations;
	} else {
		inode->i_op = &f2fs_file_inode_operations;
		inode->i_fop = &f2fs_file_operations;
		inode->i_mapping->a_ops = &f2fs_dblock_aops;
	}

	f2fs_lock_op(sbi);
	err = acquire_orphan_inode(sbi);
	if (err)
		goto out;

	err = f2fs_do_tmpfile(inode, dir);
	if (err)
		goto release_out;

	/*
	 * add this non-linked tmpfile to orphan list, in this way we could
	 * remove all unused data of tmpfile after abnormal power-off.
	 */
726
	add_orphan_inode(inode);
C
Chao Yu 已提交
727 728 729
	alloc_nid_done(sbi, inode->i_ino);

	if (whiteout) {
730
		f2fs_i_links_write(inode, false);
C
Chao Yu 已提交
731 732 733 734
		*whiteout = inode;
	} else {
		d_tmpfile(dentry, inode);
	}
735 736
	/* link_count was changed by d_tmpfile as well. */
	f2fs_unlock_op(sbi);
C
Chao Yu 已提交
737
	unlock_new_inode(inode);
738 739

	f2fs_balance_fs(sbi, true);
C
Chao Yu 已提交
740 741 742 743 744 745 746 747 748 749 750
	return 0;

release_out:
	release_orphan_inode(sbi);
out:
	handle_failed_inode(inode);
	return err;
}

static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
{
751 752 753
	if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
		return -EIO;

754
	if (f2fs_encrypted_inode(dir)) {
755
		int err = fscrypt_get_encryption_info(dir);
756 757 758 759
		if (err)
			return err;
	}

C
Chao Yu 已提交
760 761 762 763 764
	return __f2fs_tmpfile(dir, dentry, mode, NULL);
}

static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
{
765 766 767
	if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
		return -EIO;

C
Chao Yu 已提交
768 769 770
	return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
}

771
static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
C
Chao Yu 已提交
772 773
			struct inode *new_dir, struct dentry *new_dentry,
			unsigned int flags)
774
{
775
	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
776 777
	struct inode *old_inode = d_inode(old_dentry);
	struct inode *new_inode = d_inode(new_dentry);
C
Chao Yu 已提交
778
	struct inode *whiteout = NULL;
779
	struct page *old_dir_page;
C
Chao Yu 已提交
780
	struct page *old_page, *new_page = NULL;
781 782 783
	struct f2fs_dir_entry *old_dir_entry = NULL;
	struct f2fs_dir_entry *old_entry;
	struct f2fs_dir_entry *new_entry;
784
	bool is_old_inline = f2fs_has_inline_dentry(old_dir);
785
	int err = -ENOENT;
786

787 788 789
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
790 791 792 793 794
	if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
			(!projid_eq(F2FS_I(new_dir)->i_projid,
			F2FS_I(old_dentry->d_inode)->i_projid)))
		return -EXDEV;

C
Chao Yu 已提交
795 796 797 798 799 800 801 802
	err = dquot_initialize(old_dir);
	if (err)
		goto out;

	err = dquot_initialize(new_dir);
	if (err)
		goto out;

J
Jaegeuk Kim 已提交
803 804 805 806 807 808
	if (new_inode) {
		err = dquot_initialize(new_inode);
		if (err)
			goto out;
	}

809
	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
810 811 812
	if (!old_entry) {
		if (IS_ERR(old_page))
			err = PTR_ERR(old_page);
813
		goto out;
814
	}
815 816 817

	if (S_ISDIR(old_inode->i_mode)) {
		old_dir_entry = f2fs_parent_dir(old_inode, &old_dir_page);
818
		if (!old_dir_entry) {
819 820
			if (IS_ERR(old_dir_page))
				err = PTR_ERR(old_dir_page);
821
			goto out_old;
822
		}
823 824
	}

C
Chao Yu 已提交
825 826 827 828 829 830
	if (flags & RENAME_WHITEOUT) {
		err = f2fs_create_whiteout(old_dir, &whiteout);
		if (err)
			goto out_dir;
	}

831 832 833 834
	if (new_inode) {

		err = -ENOTEMPTY;
		if (old_dir_entry && !f2fs_empty_dir(new_inode))
C
Chao Yu 已提交
835
			goto out_whiteout;
836 837 838 839

		err = -ENOENT;
		new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name,
						&new_page);
840 841 842
		if (!new_entry) {
			if (IS_ERR(new_page))
				err = PTR_ERR(new_page);
C
Chao Yu 已提交
843
			goto out_whiteout;
844
		}
845

J
Jaegeuk Kim 已提交
846
		f2fs_balance_fs(sbi, true);
847

848 849
		f2fs_lock_op(sbi);

J
Jaegeuk Kim 已提交
850 851 852 853
		err = acquire_orphan_inode(sbi);
		if (err)
			goto put_out_dir;

854 855
		f2fs_set_link(new_dir, new_entry, new_page, old_inode);

856
		new_inode->i_ctime = current_time(new_inode);
857
		down_write(&F2FS_I(new_inode)->i_sem);
858
		if (old_dir_entry)
859 860
			f2fs_i_links_write(new_inode, false);
		f2fs_i_links_write(new_inode, false);
861 862
		up_write(&F2FS_I(new_inode)->i_sem);

863
		if (!new_inode->i_nlink)
864
			add_orphan_inode(new_inode);
J
Jaegeuk Kim 已提交
865 866
		else
			release_orphan_inode(sbi);
867
	} else {
J
Jaegeuk Kim 已提交
868
		f2fs_balance_fs(sbi, true);
869

870 871
		f2fs_lock_op(sbi);

872
		err = f2fs_add_link(new_dentry, old_inode);
873 874
		if (err) {
			f2fs_unlock_op(sbi);
C
Chao Yu 已提交
875
			goto out_whiteout;
876
		}
877

878
		if (old_dir_entry)
879
			f2fs_i_links_write(new_dir, true);
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894

		/*
		 * old entry and new entry can locate in the same inline
		 * dentry in inode, when attaching new entry in inline dentry,
		 * it could force inline dentry conversion, after that,
		 * old_entry and old_page will point to wrong address, in
		 * order to avoid this, let's do the check and update here.
		 */
		if (is_old_inline && !f2fs_has_inline_dentry(old_dir)) {
			f2fs_put_page(old_page, 0);
			old_page = NULL;

			old_entry = f2fs_find_entry(old_dir,
						&old_dentry->d_name, &old_page);
			if (!old_entry) {
895 896 897
				err = -ENOENT;
				if (IS_ERR(old_page))
					err = PTR_ERR(old_page);
898 899 900 901
				f2fs_unlock_op(sbi);
				goto out_whiteout;
			}
		}
902 903
	}

904
	down_write(&F2FS_I(old_inode)->i_sem);
905 906 907 908
	if (!old_dir_entry || whiteout)
		file_lost_pino(old_inode);
	else
		F2FS_I(old_inode)->i_pino = new_dir->i_ino;
909 910
	up_write(&F2FS_I(old_inode)->i_sem);

911
	old_inode->i_ctime = current_time(old_inode);
912
	f2fs_mark_inode_dirty_sync(old_inode, false);
913

914
	f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
915

C
Chao Yu 已提交
916 917
	if (whiteout) {
		whiteout->i_state |= I_LINKABLE;
918
		set_inode_flag(whiteout, FI_INC_LINK);
C
Chao Yu 已提交
919 920 921 922 923 924 925
		err = f2fs_add_link(old_dentry, whiteout);
		if (err)
			goto put_out_dir;
		whiteout->i_state &= ~I_LINKABLE;
		iput(whiteout);
	}

926
	if (old_dir_entry) {
927
		if (old_dir != new_dir && !whiteout)
928 929
			f2fs_set_link(old_inode, old_dir_entry,
						old_dir_page, new_dir);
930
		else
931
			f2fs_put_page(old_dir_page, 0);
932
		f2fs_i_links_write(old_dir, false);
933
	}
934
	add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
935

936
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
937 938 939

	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
		f2fs_sync_fs(sbi->sb, 1);
940 941
	return 0;

J
Jaegeuk Kim 已提交
942
put_out_dir:
943
	f2fs_unlock_op(sbi);
944
	if (new_page)
C
Chao Yu 已提交
945 946 947 948
		f2fs_put_page(new_page, 0);
out_whiteout:
	if (whiteout)
		iput(whiteout);
949
out_dir:
950
	if (old_dir_entry)
951 952 953 954 955 956 957
		f2fs_put_page(old_dir_page, 0);
out_old:
	f2fs_put_page(old_page, 0);
out:
	return err;
}

C
Chao Yu 已提交
958 959 960
static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
			     struct inode *new_dir, struct dentry *new_dentry)
{
961
	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
962 963
	struct inode *old_inode = d_inode(old_dentry);
	struct inode *new_inode = d_inode(new_dentry);
C
Chao Yu 已提交
964 965 966 967 968 969
	struct page *old_dir_page, *new_dir_page;
	struct page *old_page, *new_page;
	struct f2fs_dir_entry *old_dir_entry = NULL, *new_dir_entry = NULL;
	struct f2fs_dir_entry *old_entry, *new_entry;
	int old_nlink = 0, new_nlink = 0;
	int err = -ENOENT;
970

971 972 973
	if (unlikely(f2fs_cp_error(sbi)))
		return -EIO;

C
Chao Yu 已提交
974 975 976 977 978 979 980 981
	if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
			!projid_eq(F2FS_I(new_dir)->i_projid,
			F2FS_I(old_dentry->d_inode)->i_projid)) ||
	    (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
			!projid_eq(F2FS_I(old_dir)->i_projid,
			F2FS_I(new_dentry->d_inode)->i_projid)))
		return -EXDEV;

C
Chao Yu 已提交
982 983 984 985 986 987 988 989
	err = dquot_initialize(old_dir);
	if (err)
		goto out;

	err = dquot_initialize(new_dir);
	if (err)
		goto out;

C
Chao Yu 已提交
990
	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
991 992 993
	if (!old_entry) {
		if (IS_ERR(old_page))
			err = PTR_ERR(old_page);
C
Chao Yu 已提交
994
		goto out;
995
	}
C
Chao Yu 已提交
996 997

	new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, &new_page);
998 999 1000
	if (!new_entry) {
		if (IS_ERR(new_page))
			err = PTR_ERR(new_page);
C
Chao Yu 已提交
1001
		goto out_old;
1002
	}
C
Chao Yu 已提交
1003 1004 1005 1006 1007 1008

	/* prepare for updating ".." directory entry info later */
	if (old_dir != new_dir) {
		if (S_ISDIR(old_inode->i_mode)) {
			old_dir_entry = f2fs_parent_dir(old_inode,
							&old_dir_page);
1009
			if (!old_dir_entry) {
1010 1011
				if (IS_ERR(old_dir_page))
					err = PTR_ERR(old_dir_page);
C
Chao Yu 已提交
1012
				goto out_new;
1013
			}
C
Chao Yu 已提交
1014 1015 1016 1017 1018
		}

		if (S_ISDIR(new_inode->i_mode)) {
			new_dir_entry = f2fs_parent_dir(new_inode,
							&new_dir_page);
1019
			if (!new_dir_entry) {
1020 1021
				if (IS_ERR(new_dir_page))
					err = PTR_ERR(new_dir_page);
C
Chao Yu 已提交
1022
				goto out_old_dir;
1023
			}
C
Chao Yu 已提交
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
		}
	}

	/*
	 * If cross rename between file and directory those are not
	 * in the same directory, we will inc nlink of file's parent
	 * later, so we should check upper boundary of its nlink.
	 */
	if ((!old_dir_entry || !new_dir_entry) &&
				old_dir_entry != new_dir_entry) {
		old_nlink = old_dir_entry ? -1 : 1;
		new_nlink = -old_nlink;
		err = -EMLINK;
1037 1038
		if ((old_nlink > 0 && old_dir->i_nlink >= F2FS_LINK_MAX) ||
			(new_nlink > 0 && new_dir->i_nlink >= F2FS_LINK_MAX))
C
Chao Yu 已提交
1039 1040 1041
			goto out_new_dir;
	}

J
Jaegeuk Kim 已提交
1042
	f2fs_balance_fs(sbi, true);
1043

C
Chao Yu 已提交
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
	f2fs_lock_op(sbi);

	/* update ".." directory entry info of old dentry */
	if (old_dir_entry)
		f2fs_set_link(old_inode, old_dir_entry, old_dir_page, new_dir);

	/* update ".." directory entry info of new dentry */
	if (new_dir_entry)
		f2fs_set_link(new_inode, new_dir_entry, new_dir_page, old_dir);

	/* update directory entry info of old dir inode */
	f2fs_set_link(old_dir, old_entry, old_page, new_inode);

	down_write(&F2FS_I(old_inode)->i_sem);
	file_lost_pino(old_inode);
	up_write(&F2FS_I(old_inode)->i_sem);

1061
	old_dir->i_ctime = current_time(old_dir);
C
Chao Yu 已提交
1062 1063
	if (old_nlink) {
		down_write(&F2FS_I(old_dir)->i_sem);
1064
		f2fs_i_links_write(old_dir, old_nlink > 0);
C
Chao Yu 已提交
1065 1066
		up_write(&F2FS_I(old_dir)->i_sem);
	}
1067
	f2fs_mark_inode_dirty_sync(old_dir, false);
C
Chao Yu 已提交
1068 1069 1070 1071 1072 1073 1074 1075

	/* update directory entry info of new dir inode */
	f2fs_set_link(new_dir, new_entry, new_page, old_inode);

	down_write(&F2FS_I(new_inode)->i_sem);
	file_lost_pino(new_inode);
	up_write(&F2FS_I(new_inode)->i_sem);

1076
	new_dir->i_ctime = current_time(new_dir);
C
Chao Yu 已提交
1077 1078
	if (new_nlink) {
		down_write(&F2FS_I(new_dir)->i_sem);
1079
		f2fs_i_links_write(new_dir, new_nlink > 0);
C
Chao Yu 已提交
1080 1081
		up_write(&F2FS_I(new_dir)->i_sem);
	}
1082
	f2fs_mark_inode_dirty_sync(new_dir, false);
C
Chao Yu 已提交
1083

1084 1085 1086
	add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO);
	add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);

C
Chao Yu 已提交
1087
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
1088 1089 1090

	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
		f2fs_sync_fs(sbi->sb, 1);
C
Chao Yu 已提交
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
	return 0;
out_new_dir:
	if (new_dir_entry) {
		f2fs_put_page(new_dir_page, 0);
	}
out_old_dir:
	if (old_dir_entry) {
		f2fs_put_page(old_dir_page, 0);
	}
out_new:
	f2fs_put_page(new_page, 0);
out_old:
	f2fs_put_page(old_page, 0);
out:
	return err;
}

static int f2fs_rename2(struct inode *old_dir, struct dentry *old_dentry,
			struct inode *new_dir, struct dentry *new_dentry,
			unsigned int flags)
{
1112 1113
	int err;

C
Chao Yu 已提交
1114
	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
C
Chao Yu 已提交
1115 1116
		return -EINVAL;

1117 1118 1119 1120 1121
	err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
				     flags);
	if (err)
		return err;

C
Chao Yu 已提交
1122 1123 1124 1125 1126 1127 1128 1129
	if (flags & RENAME_EXCHANGE) {
		return f2fs_cross_rename(old_dir, old_dentry,
					 new_dir, new_dentry);
	}
	/*
	 * VFS has already handled the new dentry existence case,
	 * here, we just deal with "RENAME_NOREPLACE" as regular rename.
	 */
C
Chao Yu 已提交
1130
	return f2fs_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
C
Chao Yu 已提交
1131 1132
}

1133
static const char *f2fs_encrypted_get_link(struct dentry *dentry,
1134 1135
					   struct inode *inode,
					   struct delayed_call *done)
C
Chao Yu 已提交
1136
{
1137 1138
	struct page *page;
	const char *target;
1139

1140 1141 1142
	if (!dentry)
		return ERR_PTR(-ECHILD);

1143 1144 1145
	page = read_mapping_page(inode->i_mapping, 0, NULL);
	if (IS_ERR(page))
		return ERR_CAST(page);
1146

1147 1148 1149 1150
	target = fscrypt_get_symlink(inode, page_address(page),
				     inode->i_sb->s_blocksize, done);
	put_page(page);
	return target;
C
Chao Yu 已提交
1151 1152
}

1153
const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
1154
	.get_link       = f2fs_encrypted_get_link,
1155 1156
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
1157
#ifdef CONFIG_F2FS_FS_XATTR
1158
	.listxattr	= f2fs_listxattr,
1159
#endif
1160 1161
};

1162 1163 1164 1165 1166 1167 1168 1169 1170
const struct inode_operations f2fs_dir_inode_operations = {
	.create		= f2fs_create,
	.lookup		= f2fs_lookup,
	.link		= f2fs_link,
	.unlink		= f2fs_unlink,
	.symlink	= f2fs_symlink,
	.mkdir		= f2fs_mkdir,
	.rmdir		= f2fs_rmdir,
	.mknod		= f2fs_mknod,
1171
	.rename		= f2fs_rename2,
C
Chao Yu 已提交
1172
	.tmpfile	= f2fs_tmpfile,
1173
	.getattr	= f2fs_getattr,
1174 1175
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
1176
	.set_acl	= f2fs_set_acl,
1177 1178 1179 1180 1181 1182
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
};

const struct inode_operations f2fs_symlink_inode_operations = {
1183
	.get_link       = f2fs_get_link,
1184
	.getattr	= f2fs_getattr,
1185 1186 1187 1188 1189 1190 1191
	.setattr	= f2fs_setattr,
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
};

const struct inode_operations f2fs_special_inode_operations = {
1192
	.getattr	= f2fs_getattr,
1193 1194
	.setattr        = f2fs_setattr,
	.get_acl	= f2fs_get_acl,
1195
	.set_acl	= f2fs_set_acl,
1196 1197 1198 1199
#ifdef CONFIG_F2FS_FS_XATTR
	.listxattr	= f2fs_listxattr,
#endif
};