namei.c 26.2 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>
18 19

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

static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
{
27
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
28 29 30
	nid_t ino;
	struct inode *inode;
	bool nid_free = false;
31
	int err;
32

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

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

45
	inode_init_owner(inode, dir, mode);
46 47 48 49 50 51 52 53 54 55

	inode->i_ino = ino;
	inode->i_blocks = 0;
	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
	inode->i_generation = sbi->s_next_generation++;

	err = insert_inode_locked(inode);
	if (err) {
		err = -EINVAL;
		nid_free = true;
56
		goto fail;
57
	}
C
Chao Yu 已提交
58

59 60 61 62
	/* If the directory encrypted, then we should encrypt the inode. */
	if (f2fs_encrypted_inode(dir) && f2fs_may_encrypt(inode))
		f2fs_set_encrypted_inode(inode);

63
	if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
64
		set_inode_flag(F2FS_I(inode), FI_INLINE_DATA);
65
	if (f2fs_may_inline_dentry(inode))
C
Chao Yu 已提交
66 67
		set_inode_flag(F2FS_I(inode), FI_INLINE_DENTRY);

J
Jaegeuk Kim 已提交
68 69
	f2fs_init_extent_tree(inode, NULL);

C
Chao Yu 已提交
70
	stat_inc_inline_xattr(inode);
71 72 73
	stat_inc_inline_inode(inode);
	stat_inc_inline_dir(inode);

74
	trace_f2fs_new_inode(inode, 0);
75 76 77 78
	mark_inode_dirty(inode);
	return inode;

fail:
79
	trace_f2fs_new_inode(inode, err);
80
	make_bad_inode(inode);
81
	if (nid_free)
82 83
		set_inode_flag(F2FS_I(inode), FI_FREE_NID);
	iput(inode);
84 85 86 87 88
	return ERR_PTR(err);
}

static int is_multimedia_file(const unsigned char *s, const char *sub)
{
89 90
	size_t slen = strlen(s);
	size_t sublen = strlen(sub);
91

C
Chao Yu 已提交
92 93 94 95 96 97 98 99
	/*
	 * filename format of multimedia file should be defined as:
	 * "filename + '.' + extension".
	 */
	if (slen < sublen + 2)
		return 0;

	if (s[slen - sublen - 1] != '.')
100
		return 0;
101

102
	return !strncasecmp(s + slen - sublen, sub, sublen);
103 104
}

J
Jaegeuk Kim 已提交
105
/*
106 107
 * Set multimedia files as cold files for hot/cold data separation
 */
108
static inline void set_cold_files(struct f2fs_sb_info *sbi, struct inode *inode,
109 110 111 112 113 114 115
		const unsigned char *name)
{
	int i;
	__u8 (*extlist)[8] = sbi->raw_super->extension_list;

	int count = le32_to_cpu(sbi->raw_super->extension_count);
	for (i = 0; i < count; i++) {
116
		if (is_multimedia_file(name, extlist[i])) {
117
			file_set_cold(inode);
118 119 120 121 122 123 124 125
			break;
		}
	}
}

static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
						bool excl)
{
126
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
127 128
	struct inode *inode;
	nid_t ino = 0;
129
	int err;
130 131 132 133 134 135

	inode = f2fs_new_inode(dir, mode);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

	if (!test_opt(sbi, DISABLE_EXT_IDENTIFY))
136
		set_cold_files(sbi, inode, dentry->d_name.name);
137 138 139 140 141 142

	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;

J
Jaegeuk Kim 已提交
143
	f2fs_balance_fs(sbi, true);
144

145
	f2fs_lock_op(sbi);
146 147 148
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
149
	f2fs_unlock_op(sbi);
150 151 152

	alloc_nid_done(sbi, ino);

153
	d_instantiate(dentry, inode);
154
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
155 156 157

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
158 159
	return 0;
out:
160
	handle_failed_inode(inode);
161 162 163 164 165 166
	return err;
}

static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
		struct dentry *dentry)
{
167
	struct inode *inode = d_inode(old_dentry);
168
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
169
	int err;
170

171
	if (f2fs_encrypted_inode(dir) &&
172
			!fscrypt_has_permitted_context(dir, inode))
173 174
		return -EPERM;

J
Jaegeuk Kim 已提交
175
	f2fs_balance_fs(sbi, true);
176

177
	inode->i_ctime = CURRENT_TIME;
J
Jaegeuk Kim 已提交
178
	ihold(inode);
179 180

	set_inode_flag(F2FS_I(inode), FI_INC_LINK);
181
	f2fs_lock_op(sbi);
182 183 184
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
185
	f2fs_unlock_op(sbi);
186 187

	d_instantiate(dentry, inode);
J
Jaegeuk Kim 已提交
188 189 190

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
191 192 193 194
	return 0;
out:
	clear_inode_flag(F2FS_I(inode), FI_INC_LINK);
	iput(inode);
195
	f2fs_unlock_op(sbi);
196 197 198 199 200 201
	return err;
}

struct dentry *f2fs_get_parent(struct dentry *child)
{
	struct qstr dotdot = QSTR_INIT("..", 2);
202
	unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot);
203 204
	if (!ino)
		return ERR_PTR(-ENOENT);
205
	return d_obtain_alias(f2fs_iget(d_inode(child)->i_sb, ino));
206 207
}

208 209 210 211 212 213 214 215 216
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;

217 218 219 220 221 222 223
	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;
	}

J
Jaegeuk Kim 已提交
224
	f2fs_balance_fs(sbi, true);
225

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
	f2fs_lock_op(sbi);

	de = f2fs_find_entry(dir, &dot, &page);
	if (de) {
		f2fs_dentry_kunmap(dir, page);
		f2fs_put_page(page, 0);
	} else {
		err = __f2fs_add_link(dir, &dot, NULL, dir->i_ino, S_IFDIR);
		if (err)
			goto out;
	}

	de = f2fs_find_entry(dir, &dotdot, &page);
	if (de) {
		f2fs_dentry_kunmap(dir, page);
		f2fs_put_page(page, 0);
	} else {
		err = __f2fs_add_link(dir, &dotdot, NULL, pino, S_IFDIR);
	}
out:
	if (!err) {
		clear_inode_flag(F2FS_I(dir), FI_INLINE_DOTS);
		mark_inode_dirty(dir);
	}

	f2fs_unlock_op(sbi);
	return err;
}

255 256 257 258 259 260
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;
J
Jaegeuk Kim 已提交
261
	nid_t ino;
262
	int err = 0;
263
	unsigned int root_ino = F2FS_ROOT_INO(F2FS_I_SB(dir));
264

265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
	if (f2fs_encrypted_inode(dir)) {
		int res = fscrypt_get_encryption_info(dir);

		/*
		 * DCACHE_ENCRYPTED_WITH_KEY is set if the dentry is
		 * created while the directory was encrypted and we
		 * don't have access to the key.
		 */
		if (fscrypt_has_encryption_key(dir))
			fscrypt_set_encrypted_dentry(dentry);
		fscrypt_set_d_op(dentry);
		if (res && res != -ENOKEY)
			return ERR_PTR(res);
	}

280
	if (dentry->d_name.len > F2FS_NAME_LEN)
281 282 283
		return ERR_PTR(-ENAMETOOLONG);

	de = f2fs_find_entry(dir, &dentry->d_name, &page);
J
Jaegeuk Kim 已提交
284 285
	if (!de)
		return d_splice_alias(inode, dentry);
286

J
Jaegeuk Kim 已提交
287 288 289
	ino = le32_to_cpu(de->ino);
	f2fs_dentry_kunmap(dir, page);
	f2fs_put_page(page, 0);
290

J
Jaegeuk Kim 已提交
291 292 293
	inode = f2fs_iget(dir->i_sb, ino);
	if (IS_ERR(inode))
		return ERR_CAST(inode);
294

295 296 297 298 299 300
	if ((dir->i_ino == root_ino) && f2fs_has_inline_dots(dir)) {
		err = __recover_dot_dentries(dir, root_ino);
		if (err)
			goto err_out;
	}

301
	if (f2fs_has_inline_dots(inode)) {
J
Jaegeuk Kim 已提交
302
		err = __recover_dot_dentries(inode, dir->i_ino);
303 304
		if (err)
			goto err_out;
305
	}
306 307 308 309 310 311 312 313
	if (!IS_ERR(inode) && f2fs_encrypted_inode(dir) &&
			(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
			!fscrypt_has_permitted_context(dir, inode)) {
		bool nokey = f2fs_encrypted_inode(inode) &&
			!fscrypt_has_encryption_key(inode);
		iput(inode);
		return nokey ? ERR_PTR(-ENOKEY) : ERR_PTR(-EPERM);
	}
314
	return d_splice_alias(inode, dentry);
315 316 317 318

err_out:
	iget_failed(inode);
	return ERR_PTR(err);
319 320 321 322
}

static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
{
323
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
324
	struct inode *inode = d_inode(dentry);
325 326 327 328
	struct f2fs_dir_entry *de;
	struct page *page;
	int err = -ENOENT;

329
	trace_f2fs_unlink_enter(dir, dentry);
330

331 332 333 334
	de = f2fs_find_entry(dir, &dentry->d_name, &page);
	if (!de)
		goto fail;

J
Jaegeuk Kim 已提交
335
	f2fs_balance_fs(sbi, true);
336

337
	f2fs_lock_op(sbi);
J
Jaegeuk Kim 已提交
338
	err = acquire_orphan_inode(sbi);
339
	if (err) {
340
		f2fs_unlock_op(sbi);
341
		f2fs_dentry_kunmap(dir, page);
342 343 344
		f2fs_put_page(page, 0);
		goto fail;
	}
345
	f2fs_delete_entry(de, page, dir, inode);
346
	f2fs_unlock_op(sbi);
347

A
arter97 已提交
348
	/* In order to evict this inode, we set it dirty */
349
	mark_inode_dirty(inode);
J
Jaegeuk Kim 已提交
350 351 352

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
353
fail:
354
	trace_f2fs_unlink_exit(inode, err);
355 356 357
	return err;
}

358
static const char *f2fs_get_link(struct dentry *dentry,
359 360
				 struct inode *inode,
				 struct delayed_call *done)
361
{
362
	const char *link = page_get_link(dentry, inode, done);
363 364
	if (!IS_ERR(link) && !*link) {
		/* this is broken symlink case */
365 366
		do_delayed_call(done);
		clear_delayed_call(done);
367
		link = ERR_PTR(-ENOENT);
368
	}
369
	return link;
370 371
}

372 373 374
static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
					const char *symname)
{
375
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
376
	struct inode *inode;
377
	size_t len = strlen(symname);
378 379
	struct fscrypt_str disk_link = FSTR_INIT((char *)symname, len + 1);
	struct fscrypt_symlink_data *sd = NULL;
380
	int err;
381

382
	if (f2fs_encrypted_inode(dir)) {
383
		err = fscrypt_get_encryption_info(dir);
384 385 386
		if (err)
			return err;

387
		if (!fscrypt_has_encryption_key(dir))
388 389
			return -EPERM;

390 391
		disk_link.len = (fscrypt_fname_encrypted_size(dir, len) +
				sizeof(struct fscrypt_symlink_data));
392 393 394
	}

	if (disk_link.len > dir->i_sb->s_blocksize)
395 396
		return -ENAMETOOLONG;

397 398 399 400
	inode = f2fs_new_inode(dir, S_IFLNK | S_IRWXUGO);
	if (IS_ERR(inode))
		return PTR_ERR(inode);

401 402 403 404
	if (f2fs_encrypted_inode(inode))
		inode->i_op = &f2fs_encrypted_symlink_inode_operations;
	else
		inode->i_op = &f2fs_symlink_inode_operations;
405
	inode_nohighmem(inode);
406 407
	inode->i_mapping->a_ops = &f2fs_dblock_aops;

J
Jaegeuk Kim 已提交
408
	f2fs_balance_fs(sbi, true);
409

410
	f2fs_lock_op(sbi);
411 412 413
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
414
	f2fs_unlock_op(sbi);
415 416
	alloc_nid_done(sbi, inode->i_ino);

417
	if (f2fs_encrypted_inode(inode)) {
418
		struct qstr istr = QSTR_INIT(symname, len);
419
		struct fscrypt_str ostr;
420

421 422 423
		sd = kzalloc(disk_link.len, GFP_NOFS);
		if (!sd) {
			err = -ENOMEM;
424
			goto err_out;
425
		}
426

427
		err = fscrypt_get_encryption_info(inode);
428 429 430
		if (err)
			goto err_out;

431
		if (!fscrypt_has_encryption_key(inode)) {
432
			err = -EPERM;
433 434 435
			goto err_out;
		}

436 437
		ostr.name = sd->encrypted_path;
		ostr.len = disk_link.len;
438
		err = fscrypt_fname_usr_to_disk(inode, &istr, &ostr);
439
		if (err < 0)
440
			goto err_out;
441 442 443

		sd->len = cpu_to_le16(ostr.len);
		disk_link.name = (char *)sd;
444 445
	}

446
	err = page_symlink(inode, disk_link.name, disk_link.len);
447 448

err_out:
449 450
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
451

452 453 454 455 456 457 458 459 460
	/*
	 * 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 已提交
461
	if (!err) {
462 463
		filemap_write_and_wait_range(inode->i_mapping, 0,
							disk_link.len - 1);
464

C
Chao Yu 已提交
465 466 467 468 469
		if (IS_DIRSYNC(dir))
			f2fs_sync_fs(sbi->sb, 1);
	} else {
		f2fs_unlink(dir, dentry);
	}
470 471

	kfree(sd);
472 473
	return err;
out:
474
	handle_failed_inode(inode);
475 476 477 478 479
	return err;
}

static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
{
480
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
481
	struct inode *inode;
482
	int err;
483 484 485

	inode = f2fs_new_inode(dir, S_IFDIR | mode);
	if (IS_ERR(inode))
486
		return PTR_ERR(inode);
487 488 489 490

	inode->i_op = &f2fs_dir_inode_operations;
	inode->i_fop = &f2fs_dir_operations;
	inode->i_mapping->a_ops = &f2fs_dblock_aops;
491
	mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_HIGH_ZERO);
492

J
Jaegeuk Kim 已提交
493
	f2fs_balance_fs(sbi, true);
494

495
	set_inode_flag(F2FS_I(inode), FI_INC_LINK);
496
	f2fs_lock_op(sbi);
497 498 499
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out_fail;
500
	f2fs_unlock_op(sbi);
501 502 503 504 505 506

	alloc_nid_done(sbi, inode->i_ino);

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

J
Jaegeuk Kim 已提交
507 508
	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
509 510 511 512
	return 0;

out_fail:
	clear_inode_flag(F2FS_I(inode), FI_INC_LINK);
513
	handle_failed_inode(inode);
514 515 516 517 518
	return err;
}

static int f2fs_rmdir(struct inode *dir, struct dentry *dentry)
{
519
	struct inode *inode = d_inode(dentry);
520 521 522 523 524 525 526 527
	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)
{
528
	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
529 530 531 532 533 534 535 536 537 538
	struct inode *inode;
	int err = 0;

	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;

J
Jaegeuk Kim 已提交
539
	f2fs_balance_fs(sbi, true);
540

541
	f2fs_lock_op(sbi);
542 543 544
	err = f2fs_add_link(dentry, inode);
	if (err)
		goto out;
545
	f2fs_unlock_op(sbi);
546 547

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

549 550
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
J
Jaegeuk Kim 已提交
551 552 553

	if (IS_DIRSYNC(dir))
		f2fs_sync_fs(sbi->sb, 1);
554 555
	return 0;
out:
556
	handle_failed_inode(inode);
557 558 559
	return err;
}

C
Chao Yu 已提交
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579
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;

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

J
Jaegeuk Kim 已提交
580
	f2fs_balance_fs(sbi, true);
581

C
Chao Yu 已提交
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
	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.
	 */
	add_orphan_inode(sbi, inode->i_ino);
	f2fs_unlock_op(sbi);

	alloc_nid_done(sbi, inode->i_ino);

	if (whiteout) {
		inode_dec_link_count(inode);
		*whiteout = inode;
	} else {
		d_tmpfile(dentry, inode);
	}
	unlock_new_inode(inode);
	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)
{
618
	if (f2fs_encrypted_inode(dir)) {
619
		int err = fscrypt_get_encryption_info(dir);
620 621 622 623
		if (err)
			return err;
	}

C
Chao Yu 已提交
624 625 626 627 628 629 630 631
	return __f2fs_tmpfile(dir, dentry, mode, NULL);
}

static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
{
	return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
}

632
static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
C
Chao Yu 已提交
633 634
			struct inode *new_dir, struct dentry *new_dentry,
			unsigned int flags)
635
{
636
	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
637 638
	struct inode *old_inode = d_inode(old_dentry);
	struct inode *new_inode = d_inode(new_dentry);
C
Chao Yu 已提交
639
	struct inode *whiteout = NULL;
640
	struct page *old_dir_page;
C
Chao Yu 已提交
641
	struct page *old_page, *new_page = NULL;
642 643 644
	struct f2fs_dir_entry *old_dir_entry = NULL;
	struct f2fs_dir_entry *old_entry;
	struct f2fs_dir_entry *new_entry;
645
	bool is_old_inline = f2fs_has_inline_dentry(old_dir);
646
	int err = -ENOENT;
647

648
	if ((old_dir != new_dir) && f2fs_encrypted_inode(new_dir) &&
649
			!fscrypt_has_permitted_context(new_dir, old_inode)) {
650 651 652 653
		err = -EPERM;
		goto out;
	}

654 655 656 657 658 659 660 661 662 663 664
	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
	if (!old_entry)
		goto out;

	if (S_ISDIR(old_inode->i_mode)) {
		err = -EIO;
		old_dir_entry = f2fs_parent_dir(old_inode, &old_dir_page);
		if (!old_dir_entry)
			goto out_old;
	}

C
Chao Yu 已提交
665 666 667 668 669 670
	if (flags & RENAME_WHITEOUT) {
		err = f2fs_create_whiteout(old_dir, &whiteout);
		if (err)
			goto out_dir;
	}

671 672 673 674
	if (new_inode) {

		err = -ENOTEMPTY;
		if (old_dir_entry && !f2fs_empty_dir(new_inode))
C
Chao Yu 已提交
675
			goto out_whiteout;
676 677 678 679 680

		err = -ENOENT;
		new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name,
						&new_page);
		if (!new_entry)
C
Chao Yu 已提交
681
			goto out_whiteout;
682

J
Jaegeuk Kim 已提交
683
		f2fs_balance_fs(sbi, true);
684

685 686
		f2fs_lock_op(sbi);

J
Jaegeuk Kim 已提交
687 688 689 690
		err = acquire_orphan_inode(sbi);
		if (err)
			goto put_out_dir;

691 692 693
		err = update_dent_inode(old_inode, new_inode,
						&new_dentry->d_name);
		if (err) {
J
Jaegeuk Kim 已提交
694 695
			release_orphan_inode(sbi);
			goto put_out_dir;
696 697
		}

698 699 700
		f2fs_set_link(new_dir, new_entry, new_page, old_inode);

		new_inode->i_ctime = CURRENT_TIME;
701
		down_write(&F2FS_I(new_inode)->i_sem);
702 703 704
		if (old_dir_entry)
			drop_nlink(new_inode);
		drop_nlink(new_inode);
705 706
		up_write(&F2FS_I(new_inode)->i_sem);

707
		mark_inode_dirty(new_inode);
J
Jaegeuk Kim 已提交
708

709 710
		if (!new_inode->i_nlink)
			add_orphan_inode(sbi, new_inode->i_ino);
J
Jaegeuk Kim 已提交
711 712 713
		else
			release_orphan_inode(sbi);

714
		update_inode_page(old_inode);
715
		update_inode_page(new_inode);
716
	} else {
J
Jaegeuk Kim 已提交
717
		f2fs_balance_fs(sbi, true);
718

719 720
		f2fs_lock_op(sbi);

721
		err = f2fs_add_link(new_dentry, old_inode);
722 723
		if (err) {
			f2fs_unlock_op(sbi);
C
Chao Yu 已提交
724
			goto out_whiteout;
725
		}
726 727 728

		if (old_dir_entry) {
			inc_nlink(new_dir);
729
			update_inode_page(new_dir);
730
		}
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750

		/*
		 * 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) {
				err = -EIO;
				f2fs_unlock_op(sbi);
				goto out_whiteout;
			}
		}
751 752
	}

753 754
	down_write(&F2FS_I(old_inode)->i_sem);
	file_lost_pino(old_inode);
755 756
	if (new_inode && file_enc_name(new_inode))
		file_set_enc_name(old_inode);
757 758
	up_write(&F2FS_I(old_inode)->i_sem);

759 760 761
	old_inode->i_ctime = CURRENT_TIME;
	mark_inode_dirty(old_inode);

762
	f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
763

C
Chao Yu 已提交
764 765 766 767 768 769 770 771 772 773
	if (whiteout) {
		whiteout->i_state |= I_LINKABLE;
		set_inode_flag(F2FS_I(whiteout), FI_INC_LINK);
		err = f2fs_add_link(old_dentry, whiteout);
		if (err)
			goto put_out_dir;
		whiteout->i_state &= ~I_LINKABLE;
		iput(whiteout);
	}

774
	if (old_dir_entry) {
C
Chao Yu 已提交
775
		if (old_dir != new_dir && !whiteout) {
776 777
			f2fs_set_link(old_inode, old_dir_entry,
						old_dir_page, new_dir);
778
			update_inode_page(old_inode);
779
		} else {
780
			f2fs_dentry_kunmap(old_inode, old_dir_page);
781 782 783
			f2fs_put_page(old_dir_page, 0);
		}
		drop_nlink(old_dir);
784
		mark_inode_dirty(old_dir);
785
		update_inode_page(old_dir);
786 787
	}

788
	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
789 790 791

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

J
Jaegeuk Kim 已提交
794
put_out_dir:
795
	f2fs_unlock_op(sbi);
C
Chao Yu 已提交
796 797 798 799 800 801 802
	if (new_page) {
		f2fs_dentry_kunmap(new_dir, new_page);
		f2fs_put_page(new_page, 0);
	}
out_whiteout:
	if (whiteout)
		iput(whiteout);
803 804
out_dir:
	if (old_dir_entry) {
805
		f2fs_dentry_kunmap(old_inode, old_dir_page);
806 807 808
		f2fs_put_page(old_dir_page, 0);
	}
out_old:
809
	f2fs_dentry_kunmap(old_dir, old_page);
810 811 812 813 814
	f2fs_put_page(old_page, 0);
out:
	return err;
}

C
Chao Yu 已提交
815 816 817
static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
			     struct inode *new_dir, struct dentry *new_dentry)
{
818
	struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
819 820
	struct inode *old_inode = d_inode(old_dentry);
	struct inode *new_inode = d_inode(new_dentry);
C
Chao Yu 已提交
821 822 823 824 825 826 827
	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;

828
	if ((f2fs_encrypted_inode(old_dir) || f2fs_encrypted_inode(new_dir)) &&
829 830 831
			(old_dir != new_dir) &&
			(!fscrypt_has_permitted_context(new_dir, old_inode) ||
			 !fscrypt_has_permitted_context(old_dir, new_inode)))
832 833
		return -EPERM;

C
Chao Yu 已提交
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
	if (!old_entry)
		goto out;

	new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, &new_page);
	if (!new_entry)
		goto out_old;

	/* prepare for updating ".." directory entry info later */
	if (old_dir != new_dir) {
		if (S_ISDIR(old_inode->i_mode)) {
			err = -EIO;
			old_dir_entry = f2fs_parent_dir(old_inode,
							&old_dir_page);
			if (!old_dir_entry)
				goto out_new;
		}

		if (S_ISDIR(new_inode->i_mode)) {
			err = -EIO;
			new_dir_entry = f2fs_parent_dir(new_inode,
							&new_dir_page);
			if (!new_dir_entry)
				goto out_old_dir;
		}
	}

	/*
	 * 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;
		if ((old_nlink > 0 && old_inode->i_nlink >= F2FS_LINK_MAX) ||
			(new_nlink > 0 && new_inode->i_nlink >= F2FS_LINK_MAX))
			goto out_new_dir;
	}

J
Jaegeuk Kim 已提交
876
	f2fs_balance_fs(sbi, true);
877

C
Chao Yu 已提交
878 879
	f2fs_lock_op(sbi);

880
	err = update_dent_inode(old_inode, new_inode, &new_dentry->d_name);
C
Chao Yu 已提交
881 882
	if (err)
		goto out_unlock;
883 884
	if (file_enc_name(new_inode))
		file_set_enc_name(old_inode);
C
Chao Yu 已提交
885

886
	err = update_dent_inode(new_inode, old_inode, &old_dentry->d_name);
C
Chao Yu 已提交
887 888
	if (err)
		goto out_undo;
889 890
	if (file_enc_name(old_inode))
		file_set_enc_name(new_inode);
C
Chao Yu 已提交
891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942

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

	update_inode_page(old_inode);

	old_dir->i_ctime = CURRENT_TIME;
	if (old_nlink) {
		down_write(&F2FS_I(old_dir)->i_sem);
		if (old_nlink < 0)
			drop_nlink(old_dir);
		else
			inc_nlink(old_dir);
		up_write(&F2FS_I(old_dir)->i_sem);
	}
	mark_inode_dirty(old_dir);
	update_inode_page(old_dir);

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

	update_inode_page(new_inode);

	new_dir->i_ctime = CURRENT_TIME;
	if (new_nlink) {
		down_write(&F2FS_I(new_dir)->i_sem);
		if (new_nlink < 0)
			drop_nlink(new_dir);
		else
			inc_nlink(new_dir);
		up_write(&F2FS_I(new_dir)->i_sem);
	}
	mark_inode_dirty(new_dir);
	update_inode_page(new_dir);

	f2fs_unlock_op(sbi);
J
Jaegeuk Kim 已提交
943 944 945

	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
		f2fs_sync_fs(sbi->sb, 1);
C
Chao Yu 已提交
946 947
	return 0;
out_undo:
948 949 950 951 952
	/*
	 * Still we may fail to recover name info of f2fs_inode here
	 * Drop it, once its name is set as encrypted
	 */
	update_dent_inode(old_inode, old_inode, &old_dentry->d_name);
C
Chao Yu 已提交
953 954 955 956
out_unlock:
	f2fs_unlock_op(sbi);
out_new_dir:
	if (new_dir_entry) {
957
		f2fs_dentry_kunmap(new_inode, new_dir_page);
C
Chao Yu 已提交
958 959 960 961
		f2fs_put_page(new_dir_page, 0);
	}
out_old_dir:
	if (old_dir_entry) {
962
		f2fs_dentry_kunmap(old_inode, old_dir_page);
C
Chao Yu 已提交
963 964 965
		f2fs_put_page(old_dir_page, 0);
	}
out_new:
966
	f2fs_dentry_kunmap(new_dir, new_page);
C
Chao Yu 已提交
967 968
	f2fs_put_page(new_page, 0);
out_old:
969
	f2fs_dentry_kunmap(old_dir, old_page);
C
Chao Yu 已提交
970 971 972 973 974 975 976 977 978
	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)
{
C
Chao Yu 已提交
979
	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
C
Chao Yu 已提交
980 981 982 983 984 985 986 987 988 989
		return -EINVAL;

	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 已提交
990
	return f2fs_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
C
Chao Yu 已提交
991 992
}

993
static const char *f2fs_encrypted_get_link(struct dentry *dentry,
994 995
					   struct inode *inode,
					   struct delayed_call *done)
C
Chao Yu 已提交
996
{
997 998
	struct page *cpage = NULL;
	char *caddr, *paddr = NULL;
999 1000 1001
	struct fscrypt_str cstr = FSTR_INIT(NULL, 0);
	struct fscrypt_str pstr = FSTR_INIT(NULL, 0);
	struct fscrypt_symlink_data *sd;
1002 1003 1004 1005
	loff_t size = min_t(loff_t, i_size_read(inode), PAGE_SIZE - 1);
	u32 max_size = inode->i_sb->s_blocksize;
	int res;

1006 1007 1008
	if (!dentry)
		return ERR_PTR(-ECHILD);

1009
	res = fscrypt_get_encryption_info(inode);
1010 1011 1012 1013 1014
	if (res)
		return ERR_PTR(res);

	cpage = read_mapping_page(inode->i_mapping, 0, NULL);
	if (IS_ERR(cpage))
1015
		return ERR_CAST(cpage);
1016
	caddr = page_address(cpage);
1017 1018 1019
	caddr[size] = 0;

	/* Symlink is encrypted */
1020
	sd = (struct fscrypt_symlink_data *)caddr;
1021
	cstr.name = sd->encrypted_path;
1022
	cstr.len = le16_to_cpu(sd->len);
1023 1024 1025 1026 1027 1028

	/* this is broken symlink case */
	if (unlikely(cstr.len == 0)) {
		res = -ENOENT;
		goto errout;
	}
1029 1030

	/* this is broken symlink case */
1031
	if (unlikely(cstr.name[0] == 0)) {
1032 1033 1034
		res = -ENOENT;
		goto errout;
	}
1035

1036
	if ((cstr.len + sizeof(struct fscrypt_symlink_data) - 1) > max_size) {
1037 1038 1039 1040
		/* Symlink data on the disk is corrupted */
		res = -EIO;
		goto errout;
	}
1041
	res = fscrypt_fname_alloc_buffer(inode, cstr.len, &pstr);
1042 1043 1044
	if (res)
		goto errout;

1045
	res = fscrypt_fname_disk_to_usr(inode, 0, 0, &cstr, &pstr);
1046 1047 1048 1049 1050 1051 1052 1053 1054
	if (res < 0)
		goto errout;

	paddr = pstr.name;

	/* Null-terminate the name */
	paddr[res] = '\0';

	page_cache_release(cpage);
1055 1056
	set_delayed_call(done, kfree_link, paddr);
	return paddr;
1057
errout:
1058
	fscrypt_fname_free_buffer(&pstr);
1059 1060
	page_cache_release(cpage);
	return ERR_PTR(res);
C
Chao Yu 已提交
1061 1062
}

1063 1064
const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
	.readlink       = generic_readlink,
1065
	.get_link       = f2fs_encrypted_get_link,
1066 1067
	.getattr	= f2fs_getattr,
	.setattr	= f2fs_setattr,
1068
#ifdef CONFIG_F2FS_FS_XATTR
1069 1070 1071 1072
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
	.listxattr	= f2fs_listxattr,
	.removexattr	= generic_removexattr,
1073
#endif
1074 1075
};

1076 1077 1078 1079 1080 1081 1082 1083 1084
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,
C
Chao Yu 已提交
1085
	.rename2	= f2fs_rename2,
C
Chao Yu 已提交
1086
	.tmpfile	= f2fs_tmpfile,
1087
	.getattr	= f2fs_getattr,
1088 1089
	.setattr	= f2fs_setattr,
	.get_acl	= f2fs_get_acl,
1090
	.set_acl	= f2fs_set_acl,
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
#ifdef CONFIG_F2FS_FS_XATTR
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
	.listxattr	= f2fs_listxattr,
	.removexattr	= generic_removexattr,
#endif
};

const struct inode_operations f2fs_symlink_inode_operations = {
	.readlink       = generic_readlink,
1101
	.get_link       = f2fs_get_link,
1102
	.getattr	= f2fs_getattr,
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
	.setattr	= f2fs_setattr,
#ifdef CONFIG_F2FS_FS_XATTR
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
	.listxattr	= f2fs_listxattr,
	.removexattr	= generic_removexattr,
#endif
};

const struct inode_operations f2fs_special_inode_operations = {
1113
	.getattr	= f2fs_getattr,
1114 1115
	.setattr        = f2fs_setattr,
	.get_acl	= f2fs_get_acl,
1116
	.set_acl	= f2fs_set_acl,
1117 1118 1119 1120 1121 1122 1123
#ifdef CONFIG_F2FS_FS_XATTR
	.setxattr       = generic_setxattr,
	.getxattr       = generic_getxattr,
	.listxattr	= f2fs_listxattr,
	.removexattr    = generic_removexattr,
#endif
};