inode.c 21.6 KB
Newer Older
C
Chao Yu 已提交
1
// SPDX-License-Identifier: GPL-2.0
J
Jaegeuk Kim 已提交
2
/*
J
Jaegeuk Kim 已提交
3 4 5 6 7 8 9 10
 * fs/f2fs/inode.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 */
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/buffer_head.h>
11
#include <linux/backing-dev.h>
J
Jaegeuk Kim 已提交
12 13 14 15
#include <linux/writeback.h>

#include "f2fs.h"
#include "node.h"
16
#include "segment.h"
17
#include "xattr.h"
J
Jaegeuk Kim 已提交
18

19 20
#include <trace/events/f2fs.h>

21
void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)
J
Jaegeuk Kim 已提交
22
{
23 24 25
	if (is_inode_flag_set(inode, FI_NEW_INODE))
		return;

26
	if (f2fs_inode_dirtied(inode, sync))
J
Jaegeuk Kim 已提交
27
		return;
28

J
Jaegeuk Kim 已提交
29 30 31
	mark_inode_dirty_sync(inode);
}

J
Jaegeuk Kim 已提交
32 33 34
void f2fs_set_inode_flags(struct inode *inode)
{
	unsigned int flags = F2FS_I(inode)->i_flags;
35
	unsigned int new_fl = 0;
J
Jaegeuk Kim 已提交
36

37
	if (flags & F2FS_SYNC_FL)
38
		new_fl |= S_SYNC;
39
	if (flags & F2FS_APPEND_FL)
40
		new_fl |= S_APPEND;
41
	if (flags & F2FS_IMMUTABLE_FL)
42
		new_fl |= S_IMMUTABLE;
43
	if (flags & F2FS_NOATIME_FL)
44
		new_fl |= S_NOATIME;
45
	if (flags & F2FS_DIRSYNC_FL)
46
		new_fl |= S_DIRSYNC;
47
	if (file_is_encrypt(inode))
48
		new_fl |= S_ENCRYPTED;
Z
Zhang Zhen 已提交
49
	inode_set_flags(inode, new_fl,
50 51
			S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|
			S_ENCRYPTED);
J
Jaegeuk Kim 已提交
52 53
}

54 55
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
56 57
	int extra_size = get_extra_isize(inode);

58 59
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
			S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
60 61 62
		if (ri->i_addr[extra_size])
			inode->i_rdev = old_decode_dev(
				le32_to_cpu(ri->i_addr[extra_size]));
63
		else
64 65
			inode->i_rdev = new_decode_dev(
				le32_to_cpu(ri->i_addr[extra_size + 1]));
66 67 68
	}
}

69
static int __written_first_block(struct f2fs_sb_info *sbi,
70
					struct f2fs_inode *ri)
71
{
72
	block_t addr = le32_to_cpu(ri->i_addr[offset_in_addr(ri)]);
J
Jaegeuk Kim 已提交
73

74 75
	if (!__is_valid_data_blkaddr(addr))
		return 1;
C
Chao Yu 已提交
76
	if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC_ENHANCE))
77 78
		return -EFAULT;
	return 0;
79 80
}

81 82
static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
83 84
	int extra_size = get_extra_isize(inode);

85 86
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
		if (old_valid_dev(inode->i_rdev)) {
87
			ri->i_addr[extra_size] =
C
Chris Fries 已提交
88
				cpu_to_le32(old_encode_dev(inode->i_rdev));
89
			ri->i_addr[extra_size + 1] = 0;
90
		} else {
91 92
			ri->i_addr[extra_size] = 0;
			ri->i_addr[extra_size + 1] =
C
Chris Fries 已提交
93
				cpu_to_le32(new_encode_dev(inode->i_rdev));
94
			ri->i_addr[extra_size + 2] = 0;
95 96 97 98
		}
	}
}

99
static void __recover_inline_status(struct inode *inode, struct page *ipage)
100
{
C
Chao Yu 已提交
101
	void *inline_data = inline_data_addr(inode, ipage);
102
	__le32 *start = inline_data;
C
Chao Yu 已提交
103
	__le32 *end = start + MAX_INLINE_DATA(inode) / sizeof(__le32);
104

105 106
	while (start < end) {
		if (*start++) {
107
			f2fs_wait_on_page_writeback(ipage, NODE, true, true);
108

109 110
			set_inode_flag(inode, FI_DATA_EXIST);
			set_raw_inline(inode, F2FS_INODE(ipage));
111 112 113
			set_page_dirty(ipage);
			return;
		}
114
	}
115
	return;
116 117
}

C
Chao Yu 已提交
118 119 120 121
static bool f2fs_enable_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
{
	struct f2fs_inode *ri = &F2FS_NODE(page)->i;

122
	if (!f2fs_sb_has_inode_chksum(sbi))
C
Chao Yu 已提交
123 124
		return false;

C
Chao Yu 已提交
125
	if (!IS_INODE(page) || !(ri->i_inline & F2FS_EXTRA_ATTR))
C
Chao Yu 已提交
126 127
		return false;

128 129
	if (!F2FS_FITS_IN_INODE(ri, le16_to_cpu(ri->i_extra_isize),
				i_inode_checksum))
C
Chao Yu 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
		return false;

	return true;
}

static __u32 f2fs_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
{
	struct f2fs_node *node = F2FS_NODE(page);
	struct f2fs_inode *ri = &node->i;
	__le32 ino = node->footer.ino;
	__le32 gen = ri->i_generation;
	__u32 chksum, chksum_seed;
	__u32 dummy_cs = 0;
	unsigned int offset = offsetof(struct f2fs_inode, i_inode_checksum);
	unsigned int cs_size = sizeof(dummy_cs);

	chksum = f2fs_chksum(sbi, sbi->s_chksum_seed, (__u8 *)&ino,
							sizeof(ino));
	chksum_seed = f2fs_chksum(sbi, chksum, (__u8 *)&gen, sizeof(gen));

	chksum = f2fs_chksum(sbi, chksum_seed, (__u8 *)ri, offset);
	chksum = f2fs_chksum(sbi, chksum, (__u8 *)&dummy_cs, cs_size);
	offset += cs_size;
	chksum = f2fs_chksum(sbi, chksum, (__u8 *)ri + offset,
						F2FS_BLKSIZE - offset);
	return chksum;
}

bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page)
{
	struct f2fs_inode *ri;
	__u32 provided, calculated;

163 164 165
	if (unlikely(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)))
		return true;

166 167 168
#ifdef CONFIG_F2FS_CHECK_FS
	if (!f2fs_enable_inode_chksum(sbi, page))
#else
169 170
	if (!f2fs_enable_inode_chksum(sbi, page) ||
			PageDirty(page) || PageWriteback(page))
171
#endif
C
Chao Yu 已提交
172 173 174 175 176 177 178
		return true;

	ri = &F2FS_NODE(page)->i;
	provided = le32_to_cpu(ri->i_inode_checksum);
	calculated = f2fs_inode_chksum(sbi, page);

	if (provided != calculated)
179 180
		f2fs_warn(sbi, "checksum invalid, nid = %lu, ino_of_node = %x, %x vs. %x",
			  page->index, ino_of_node(page), provided, calculated);
C
Chao Yu 已提交
181 182 183 184 185 186 187 188 189 190 191 192 193 194

	return provided == calculated;
}

void f2fs_inode_chksum_set(struct f2fs_sb_info *sbi, struct page *page)
{
	struct f2fs_inode *ri = &F2FS_NODE(page)->i;

	if (!f2fs_enable_inode_chksum(sbi, page))
		return;

	ri->i_inode_checksum = cpu_to_le32(f2fs_inode_chksum(sbi, page));
}

195
static bool sanity_check_inode(struct inode *inode, struct page *node_page)
196 197
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
198
	struct f2fs_inode_info *fi = F2FS_I(inode);
199 200 201 202 203
	unsigned long long iblocks;

	iblocks = le64_to_cpu(F2FS_INODE(node_page)->i_blocks);
	if (!iblocks) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
204 205
		f2fs_warn(sbi, "%s: corrupted inode i_blocks i_ino=%lx iblocks=%llu, run fsck to fix.",
			  __func__, inode->i_ino, iblocks);
206 207 208 209 210
		return false;
	}

	if (ino_of_node(node_page) != nid_of_node(node_page)) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
211 212 213
		f2fs_warn(sbi, "%s: corrupted inode footer i_ino=%lx, ino,nid: [%u, %u] run fsck to fix.",
			  __func__, inode->i_ino,
			  ino_of_node(node_page), nid_of_node(node_page));
214 215
		return false;
	}
216

217
	if (f2fs_sb_has_flexible_inline_xattr(sbi)
218 219
			&& !f2fs_has_extra_attr(inode)) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
220 221
		f2fs_warn(sbi, "%s: corrupted inode ino=%lx, run fsck to fix.",
			  __func__, inode->i_ino);
222 223
		return false;
	}
224 225

	if (f2fs_has_extra_attr(inode) &&
226
			!f2fs_sb_has_extra_attr(sbi)) {
227
		set_sbi_flag(sbi, SBI_NEED_FSCK);
228 229
		f2fs_warn(sbi, "%s: inode (ino=%lx) is with extra_attr, but extra_attr feature is off",
			  __func__, inode->i_ino);
230 231
		return false;
	}
232

233 234 235
	if (fi->i_extra_isize > F2FS_TOTAL_EXTRA_ATTR_SIZE ||
			fi->i_extra_isize % sizeof(__le32)) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
236 237 238
		f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_extra_isize: %d, max: %zu",
			  __func__, inode->i_ino, fi->i_extra_isize,
			  F2FS_TOTAL_EXTRA_ATTR_SIZE);
239 240 241
		return false;
	}

242 243 244 245 246 247
	if (f2fs_has_extra_attr(inode) &&
		f2fs_sb_has_flexible_inline_xattr(sbi) &&
		f2fs_has_inline_xattr(inode) &&
		(!fi->i_inline_xattr_size ||
		fi->i_inline_xattr_size > MAX_INLINE_XATTR_SIZE)) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
248 249 250
		f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_inline_xattr_size: %d, max: %zu",
			  __func__, inode->i_ino, fi->i_inline_xattr_size,
			  MAX_INLINE_XATTR_SIZE);
251 252 253
		return false;
	}

254 255 256 257
	if (F2FS_I(inode)->extent_tree) {
		struct extent_info *ei = &F2FS_I(inode)->extent_tree->largest;

		if (ei->len &&
C
Chao Yu 已提交
258 259
			(!f2fs_is_valid_blkaddr(sbi, ei->blk,
						DATA_GENERIC_ENHANCE) ||
260
			!f2fs_is_valid_blkaddr(sbi, ei->blk + ei->len - 1,
C
Chao Yu 已提交
261
						DATA_GENERIC_ENHANCE))) {
262
			set_sbi_flag(sbi, SBI_NEED_FSCK);
263 264 265
			f2fs_warn(sbi, "%s: inode (ino=%lx) extent info [%u, %u, %u] is incorrect, run fsck to fix",
				  __func__, inode->i_ino,
				  ei->blk, ei->fofs, ei->len);
266 267 268
			return false;
		}
	}
269 270 271 272

	if (f2fs_has_inline_data(inode) &&
			(!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
273 274
		f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_data, run fsck to fix",
			  __func__, inode->i_ino, inode->i_mode);
275 276 277 278 279
		return false;
	}

	if (f2fs_has_inline_dentry(inode) && !S_ISDIR(inode->i_mode)) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
280 281
		f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_dentry, run fsck to fix",
			  __func__, inode->i_ino, inode->i_mode);
282 283 284
		return false;
	}

285 286 287
	return true;
}

J
Jaegeuk Kim 已提交
288 289
static int do_read_inode(struct inode *inode)
{
290
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
291 292 293
	struct f2fs_inode_info *fi = F2FS_I(inode);
	struct page *node_page;
	struct f2fs_inode *ri;
C
Chao Yu 已提交
294
	projid_t i_projid;
295
	int err;
J
Jaegeuk Kim 已提交
296 297

	/* Check if ino is within scope */
C
Chao Yu 已提交
298
	if (f2fs_check_nid_range(sbi, inode->i_ino))
299
		return -EINVAL;
J
Jaegeuk Kim 已提交
300

C
Chao Yu 已提交
301
	node_page = f2fs_get_node_page(sbi, inode->i_ino);
J
Jaegeuk Kim 已提交
302 303 304
	if (IS_ERR(node_page))
		return PTR_ERR(node_page);

305
	ri = F2FS_INODE(node_page);
J
Jaegeuk Kim 已提交
306 307 308 309 310 311

	inode->i_mode = le16_to_cpu(ri->i_mode);
	i_uid_write(inode, le32_to_cpu(ri->i_uid));
	i_gid_write(inode, le32_to_cpu(ri->i_gid));
	set_nlink(inode, le32_to_cpu(ri->i_links));
	inode->i_size = le64_to_cpu(ri->i_size);
312
	inode->i_blocks = SECTOR_FROM_BLOCK(le64_to_cpu(ri->i_blocks) - 1);
J
Jaegeuk Kim 已提交
313 314 315 316 317 318 319 320

	inode->i_atime.tv_sec = le64_to_cpu(ri->i_atime);
	inode->i_ctime.tv_sec = le64_to_cpu(ri->i_ctime);
	inode->i_mtime.tv_sec = le64_to_cpu(ri->i_mtime);
	inode->i_atime.tv_nsec = le32_to_cpu(ri->i_atime_nsec);
	inode->i_ctime.tv_nsec = le32_to_cpu(ri->i_ctime_nsec);
	inode->i_mtime.tv_nsec = le32_to_cpu(ri->i_mtime_nsec);
	inode->i_generation = le32_to_cpu(ri->i_generation);
321 322 323
	if (S_ISDIR(inode->i_mode))
		fi->i_current_depth = le32_to_cpu(ri->i_current_depth);
	else if (S_ISREG(inode->i_mode))
324 325
		fi->i_gc_failures[GC_FAILURE_PIN] =
					le16_to_cpu(ri->i_gc_failures);
J
Jaegeuk Kim 已提交
326 327
	fi->i_xattr_nid = le32_to_cpu(ri->i_xattr_nid);
	fi->i_flags = le32_to_cpu(ri->i_flags);
328 329
	if (S_ISREG(inode->i_mode))
		fi->i_flags &= ~F2FS_PROJINHERIT_FL;
J
Jaegeuk Kim 已提交
330 331
	fi->flags = 0;
	fi->i_advise = ri->i_advise;
332
	fi->i_pino = le32_to_cpu(ri->i_pino);
333
	fi->i_dir_level = ri->i_dir_level;
334

335 336
	if (f2fs_init_extent_tree(inode, &ri->i_ext))
		set_page_dirty(node_page);
337

338
	get_inline_info(inode, ri);
339

340 341 342
	fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
					le16_to_cpu(ri->i_extra_isize) : 0;

343
	if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
C
Chao Yu 已提交
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
		fi->i_inline_xattr_size = le16_to_cpu(ri->i_inline_xattr_size);
	} else if (f2fs_has_inline_xattr(inode) ||
				f2fs_has_inline_dentry(inode)) {
		fi->i_inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
	} else {

		/*
		 * Previous inline data or directory always reserved 200 bytes
		 * in inode layout, even if inline_xattr is disabled. In order
		 * to keep inline_dentry's structure for backward compatibility,
		 * we get the space back only from inline_data.
		 */
		fi->i_inline_xattr_size = 0;
	}

359 360 361 362 363
	if (!sanity_check_inode(inode, node_page)) {
		f2fs_put_page(node_page, 1);
		return -EINVAL;
	}

364 365
	/* check data exist */
	if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode))
366
		__recover_inline_status(inode, node_page);
367

368 369 370 371 372 373
	/* try to recover cold bit for non-dir inode */
	if (!S_ISDIR(inode->i_mode) && !is_cold_node(node_page)) {
		set_cold_node(node_page, false);
		set_page_dirty(node_page);
	}

374 375 376
	/* get rdev by using inline_info */
	__get_inode_rdev(inode, ri);

377 378 379 380 381 382 383 384
	if (S_ISREG(inode->i_mode)) {
		err = __written_first_block(sbi, ri);
		if (err < 0) {
			f2fs_put_page(node_page, 1);
			return err;
		}
		if (!err)
			set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
385
	}
386

C
Chao Yu 已提交
387
	if (!f2fs_need_inode_block_update(sbi, inode->i_ino))
388 389
		fi->last_disk_size = inode->i_size;

390
	if (fi->i_flags & F2FS_PROJINHERIT_FL)
C
Chao Yu 已提交
391 392
		set_inode_flag(inode, FI_PROJ_INHERIT);

393
	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi) &&
C
Chao Yu 已提交
394 395 396 397 398 399
			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_projid))
		i_projid = (projid_t)le32_to_cpu(ri->i_projid);
	else
		i_projid = F2FS_DEF_PROJID;
	fi->i_projid = make_kprojid(&init_user_ns, i_projid);

400
	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi) &&
C
Chao Yu 已提交
401 402 403 404 405
			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
		fi->i_crtime.tv_sec = le64_to_cpu(ri->i_crtime);
		fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
	}

406 407 408
	F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
	F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
	F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
409
	F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
J
Jaegeuk Kim 已提交
410
	f2fs_put_page(node_page, 1);
411

C
Chao Yu 已提交
412
	stat_inc_inline_xattr(inode);
413 414 415
	stat_inc_inline_inode(inode);
	stat_inc_inline_dir(inode);

416
	return 0;
J
Jaegeuk Kim 已提交
417 418 419 420 421 422
}

struct inode *f2fs_iget(struct super_block *sb, unsigned long ino)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	struct inode *inode;
423
	int ret = 0;
J
Jaegeuk Kim 已提交
424 425 426 427

	inode = iget_locked(sb, ino);
	if (!inode)
		return ERR_PTR(-ENOMEM);
428 429 430

	if (!(inode->i_state & I_NEW)) {
		trace_f2fs_iget(inode);
J
Jaegeuk Kim 已提交
431
		return inode;
432
	}
J
Jaegeuk Kim 已提交
433 434 435 436 437 438 439 440 441
	if (ino == F2FS_NODE_INO(sbi) || ino == F2FS_META_INO(sbi))
		goto make_now;

	ret = do_read_inode(inode);
	if (ret)
		goto bad_inode;
make_now:
	if (ino == F2FS_NODE_INO(sbi)) {
		inode->i_mapping->a_ops = &f2fs_node_aops;
442
		mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
J
Jaegeuk Kim 已提交
443 444
	} else if (ino == F2FS_META_INO(sbi)) {
		inode->i_mapping->a_ops = &f2fs_meta_aops;
445
		mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
J
Jaegeuk Kim 已提交
446 447 448 449 450 451 452 453
	} else if (S_ISREG(inode->i_mode)) {
		inode->i_op = &f2fs_file_inode_operations;
		inode->i_fop = &f2fs_file_operations;
		inode->i_mapping->a_ops = &f2fs_dblock_aops;
	} else if (S_ISDIR(inode->i_mode)) {
		inode->i_op = &f2fs_dir_inode_operations;
		inode->i_fop = &f2fs_dir_operations;
		inode->i_mapping->a_ops = &f2fs_dblock_aops;
454
		inode_nohighmem(inode);
J
Jaegeuk Kim 已提交
455
	} else if (S_ISLNK(inode->i_mode)) {
456
		if (file_is_encrypt(inode))
457 458 459
			inode->i_op = &f2fs_encrypted_symlink_inode_operations;
		else
			inode->i_op = &f2fs_symlink_inode_operations;
460
		inode_nohighmem(inode);
J
Jaegeuk Kim 已提交
461 462 463 464 465 466 467 468 469
		inode->i_mapping->a_ops = &f2fs_dblock_aops;
	} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
			S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
		inode->i_op = &f2fs_special_inode_operations;
		init_special_inode(inode, inode->i_mode, inode->i_rdev);
	} else {
		ret = -EIO;
		goto bad_inode;
	}
J
Jaegeuk Kim 已提交
470
	f2fs_set_inode_flags(inode);
J
Jaegeuk Kim 已提交
471
	unlock_new_inode(inode);
472
	trace_f2fs_iget(inode);
J
Jaegeuk Kim 已提交
473 474 475
	return inode;

bad_inode:
476
	f2fs_inode_synced(inode);
J
Jaegeuk Kim 已提交
477
	iget_failed(inode);
478
	trace_f2fs_iget_exit(inode, ret);
J
Jaegeuk Kim 已提交
479 480 481
	return ERR_PTR(ret);
}

482 483 484 485 486 487 488 489 490 491 492 493 494 495
struct inode *f2fs_iget_retry(struct super_block *sb, unsigned long ino)
{
	struct inode *inode;
retry:
	inode = f2fs_iget(sb, ino);
	if (IS_ERR(inode)) {
		if (PTR_ERR(inode) == -ENOMEM) {
			congestion_wait(BLK_RW_ASYNC, HZ/50);
			goto retry;
		}
	}
	return inode;
}

C
Chao Yu 已提交
496
void f2fs_update_inode(struct inode *inode, struct page *node_page)
J
Jaegeuk Kim 已提交
497 498
{
	struct f2fs_inode *ri;
499
	struct extent_tree *et = F2FS_I(inode)->extent_tree;
J
Jaegeuk Kim 已提交
500

501
	f2fs_wait_on_page_writeback(node_page, NODE, true, true);
502 503 504
	set_page_dirty(node_page);

	f2fs_inode_synced(inode);
J
Jaegeuk Kim 已提交
505

506
	ri = F2FS_INODE(node_page);
J
Jaegeuk Kim 已提交
507 508 509 510 511 512 513

	ri->i_mode = cpu_to_le16(inode->i_mode);
	ri->i_advise = F2FS_I(inode)->i_advise;
	ri->i_uid = cpu_to_le32(i_uid_read(inode));
	ri->i_gid = cpu_to_le32(i_gid_read(inode));
	ri->i_links = cpu_to_le32(inode->i_nlink);
	ri->i_size = cpu_to_le64(i_size_read(inode));
514
	ri->i_blocks = cpu_to_le64(SECTOR_TO_BLOCK(inode->i_blocks) + 1);
515

516 517 518 519 520
	if (et) {
		read_lock(&et->lock);
		set_raw_extent(&et->largest, &ri->i_ext);
		read_unlock(&et->lock);
	} else {
J
Jaegeuk Kim 已提交
521
		memset(&ri->i_ext, 0, sizeof(ri->i_ext));
522
	}
523
	set_raw_inline(inode, ri);
J
Jaegeuk Kim 已提交
524 525 526 527 528 529 530

	ri->i_atime = cpu_to_le64(inode->i_atime.tv_sec);
	ri->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
	ri->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
	ri->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
	ri->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
	ri->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
531 532 533 534
	if (S_ISDIR(inode->i_mode))
		ri->i_current_depth =
			cpu_to_le32(F2FS_I(inode)->i_current_depth);
	else if (S_ISREG(inode->i_mode))
535 536
		ri->i_gc_failures =
			cpu_to_le16(F2FS_I(inode)->i_gc_failures[GC_FAILURE_PIN]);
J
Jaegeuk Kim 已提交
537 538
	ri->i_xattr_nid = cpu_to_le32(F2FS_I(inode)->i_xattr_nid);
	ri->i_flags = cpu_to_le32(F2FS_I(inode)->i_flags);
539
	ri->i_pino = cpu_to_le32(F2FS_I(inode)->i_pino);
J
Jaegeuk Kim 已提交
540
	ri->i_generation = cpu_to_le32(inode->i_generation);
541
	ri->i_dir_level = F2FS_I(inode)->i_dir_level;
542

C
Chao Yu 已提交
543
	if (f2fs_has_extra_attr(inode)) {
544 545
		ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);

546
		if (f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(inode)))
C
Chao Yu 已提交
547 548 549
			ri->i_inline_xattr_size =
				cpu_to_le16(F2FS_I(inode)->i_inline_xattr_size);

550
		if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)) &&
C
Chao Yu 已提交
551 552 553 554 555 556 557 558
			F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
								i_projid)) {
			projid_t i_projid;

			i_projid = from_kprojid(&init_user_ns,
						F2FS_I(inode)->i_projid);
			ri->i_projid = cpu_to_le32(i_projid);
		}
C
Chao Yu 已提交
559

560
		if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)) &&
C
Chao Yu 已提交
561 562 563 564 565 566 567
			F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
								i_crtime)) {
			ri->i_crtime =
				cpu_to_le64(F2FS_I(inode)->i_crtime.tv_sec);
			ri->i_crtime_nsec =
				cpu_to_le32(F2FS_I(inode)->i_crtime.tv_nsec);
		}
C
Chao Yu 已提交
568 569
	}

570
	__set_inode_rdev(inode, ri);
571

572 573 574 575
	/* deleted inode */
	if (inode->i_nlink == 0)
		clear_inline_node(node_page);

576 577 578
	F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
	F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
	F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
579
	F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
580 581 582 583

#ifdef CONFIG_F2FS_CHECK_FS
	f2fs_inode_chksum_set(F2FS_I_SB(inode), node_page);
#endif
J
Jaegeuk Kim 已提交
584 585
}

C
Chao Yu 已提交
586
void f2fs_update_inode_page(struct inode *inode)
J
Jaegeuk Kim 已提交
587
{
588
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
589
	struct page *node_page;
590
retry:
C
Chao Yu 已提交
591
	node_page = f2fs_get_node_page(sbi, inode->i_ino);
592 593 594 595 596 597
	if (IS_ERR(node_page)) {
		int err = PTR_ERR(node_page);
		if (err == -ENOMEM) {
			cond_resched();
			goto retry;
		} else if (err != -ENOENT) {
598
			f2fs_stop_checkpoint(sbi, false);
599
		}
600
		return;
601
	}
C
Chao Yu 已提交
602
	f2fs_update_inode(inode, node_page);
J
Jaegeuk Kim 已提交
603 604 605
	f2fs_put_page(node_page, 1);
}

606 607
int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
{
608
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
609 610 611 612 613

	if (inode->i_ino == F2FS_NODE_INO(sbi) ||
			inode->i_ino == F2FS_META_INO(sbi))
		return 0;

614
	if (!is_inode_flag_set(inode, FI_DIRTY_INODE))
615 616
		return 0;

D
Daniel Rosenberg 已提交
617 618 619
	if (f2fs_is_checkpoint_ready(sbi))
		return -ENOSPC;

620
	/*
621
	 * We need to balance fs here to prevent from producing dirty node pages
622 623
	 * during the urgent cleaning time when runing out of free sections.
	 */
C
Chao Yu 已提交
624
	f2fs_update_inode_page(inode);
J
Jaegeuk Kim 已提交
625
	if (wbc && wbc->nr_to_write)
J
Jaegeuk Kim 已提交
626
		f2fs_balance_fs(sbi, true);
627
	return 0;
628 629
}

J
Jaegeuk Kim 已提交
630
/*
J
Jaegeuk Kim 已提交
631 632 633 634
 * Called at the last iput() if i_nlink is zero
 */
void f2fs_evict_inode(struct inode *inode)
{
635
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
636
	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
C
Chao Yu 已提交
637
	int err = 0;
J
Jaegeuk Kim 已提交
638

J
Jaegeuk Kim 已提交
639
	/* some remained atomic pages should discarded */
640
	if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
641
		f2fs_drop_inmem_pages(inode);
J
Jaegeuk Kim 已提交
642

643
	trace_f2fs_evict_inode(inode);
644
	truncate_inode_pages_final(&inode->i_data);
J
Jaegeuk Kim 已提交
645 646 647

	if (inode->i_ino == F2FS_NODE_INO(sbi) ||
			inode->i_ino == F2FS_META_INO(sbi))
648
		goto out_clear;
J
Jaegeuk Kim 已提交
649

650
	f2fs_bug_on(sbi, get_dirty_pages(inode));
C
Chao Yu 已提交
651
	f2fs_remove_dirty_inode(inode);
J
Jaegeuk Kim 已提交
652

J
Jaegeuk Kim 已提交
653 654
	f2fs_destroy_extent_tree(inode);

J
Jaegeuk Kim 已提交
655 656 657
	if (inode->i_nlink || is_bad_inode(inode))
		goto no_delete;

658 659 660 661 662
	err = dquot_initialize(inode);
	if (err) {
		err = 0;
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	}
C
Chao Yu 已提交
663

C
Chao Yu 已提交
664 665 666
	f2fs_remove_ino_entry(sbi, inode->i_ino, APPEND_INO);
	f2fs_remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
	f2fs_remove_ino_entry(sbi, inode->i_ino, FLUSH_INO);
667

668
	sb_start_intwrite(inode->i_sb);
669
	set_inode_flag(inode, FI_NO_ALLOC);
J
Jaegeuk Kim 已提交
670
	i_size_write(inode, 0);
671
retry:
J
Jaegeuk Kim 已提交
672
	if (F2FS_HAS_BLOCKS(inode))
673
		err = f2fs_truncate(inode);
J
Jaegeuk Kim 已提交
674

675 676 677 678
	if (time_to_inject(sbi, FAULT_EVICT_INODE)) {
		f2fs_show_injection_info(FAULT_EVICT_INODE);
		err = -EIO;
	}
679

C
Chao Yu 已提交
680 681
	if (!err) {
		f2fs_lock_op(sbi);
C
Chao Yu 已提交
682
		err = f2fs_remove_inode_page(inode);
C
Chao Yu 已提交
683
		f2fs_unlock_op(sbi);
C
Chao Yu 已提交
684 685
		if (err == -ENOENT)
			err = 0;
C
Chao Yu 已提交
686
	}
687

688 689 690 691 692 693
	/* give more chances, if ENOMEM case */
	if (err == -ENOMEM) {
		err = 0;
		goto retry;
	}

694
	if (err) {
C
Chao Yu 已提交
695
		f2fs_update_inode_page(inode);
696 697
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	}
698
	sb_end_intwrite(inode->i_sb);
J
Jaegeuk Kim 已提交
699
no_delete:
C
Chao Yu 已提交
700 701
	dquot_drop(inode);

C
Chao Yu 已提交
702
	stat_dec_inline_xattr(inode);
703
	stat_dec_inline_dir(inode);
704
	stat_dec_inline_inode(inode);
705

D
Daniel Rosenberg 已提交
706 707
	if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) &&
				!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
708
		f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
709 710
	else
		f2fs_inode_synced(inode);
711

712 713 714 715
	/* ino == 0, if f2fs_new_inode() was failed t*/
	if (inode->i_ino)
		invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino,
							inode->i_ino);
716 717
	if (xnid)
		invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid);
718 719
	if (inode->i_nlink) {
		if (is_inode_flag_set(inode, FI_APPEND_WRITE))
C
Chao Yu 已提交
720
			f2fs_add_ino_entry(sbi, inode->i_ino, APPEND_INO);
721
		if (is_inode_flag_set(inode, FI_UPDATE_WRITE))
C
Chao Yu 已提交
722
			f2fs_add_ino_entry(sbi, inode->i_ino, UPDATE_INO);
723
	}
724
	if (is_inode_flag_set(inode, FI_FREE_NID)) {
C
Chao Yu 已提交
725
		f2fs_alloc_nid_failed(sbi, inode->i_ino);
726
		clear_inode_flag(inode, FI_FREE_NID);
J
Jaegeuk Kim 已提交
727
	} else {
728 729
		/*
		 * If xattr nid is corrupted, we can reach out error condition,
C
Chao Yu 已提交
730 731
		 * err & !f2fs_exist_written_data(sbi, inode->i_ino, ORPHAN_INO)).
		 * In that case, f2fs_check_nid_range() is enough to give a clue.
732
		 */
733
	}
734
out_clear:
735
	fscrypt_put_encryption_info(inode);
736
	clear_inode(inode);
J
Jaegeuk Kim 已提交
737
}
738 739

/* caller should call f2fs_lock_op() */
C
Chao Yu 已提交
740
void f2fs_handle_failed_inode(struct inode *inode)
741 742
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
J
Jaegeuk Kim 已提交
743
	struct node_info ni;
744
	int err;
745

C
Chao Yu 已提交
746 747 748 749 750 751 752 753 754 755
	/*
	 * clear nlink of inode in order to release resource of inode
	 * immediately.
	 */
	clear_nlink(inode);

	/*
	 * we must call this to avoid inode being remained as dirty, resulting
	 * in a panic when flushing dirty inodes in gdirty_list.
	 */
C
Chao Yu 已提交
756
	f2fs_update_inode_page(inode);
757
	f2fs_inode_synced(inode);
C
Chao Yu 已提交
758

J
Jaegeuk Kim 已提交
759
	/* don't make bad inode, since it becomes a regular file. */
760 761
	unlock_new_inode(inode);

C
Chao Yu 已提交
762 763 764 765 766
	/*
	 * Note: we should add inode to orphan list before f2fs_unlock_op()
	 * so we can prevent losing this orphan when encoutering checkpoint
	 * and following suddenly power-off.
	 */
767 768 769
	err = f2fs_get_node_info(sbi, inode->i_ino, &ni);
	if (err) {
		set_sbi_flag(sbi, SBI_NEED_FSCK);
770
		f2fs_warn(sbi, "May loss orphan inode, run fsck to fix.");
771 772
		goto out;
	}
J
Jaegeuk Kim 已提交
773 774

	if (ni.blk_addr != NULL_ADDR) {
775
		err = f2fs_acquire_orphan_inode(sbi);
J
Jaegeuk Kim 已提交
776 777
		if (err) {
			set_sbi_flag(sbi, SBI_NEED_FSCK);
778
			f2fs_warn(sbi, "Too many orphan inodes, run fsck to fix.");
J
Jaegeuk Kim 已提交
779
		} else {
C
Chao Yu 已提交
780
			f2fs_add_orphan_inode(inode);
J
Jaegeuk Kim 已提交
781
		}
C
Chao Yu 已提交
782
		f2fs_alloc_nid_done(sbi, inode->i_ino);
J
Jaegeuk Kim 已提交
783
	} else {
784
		set_inode_flag(inode, FI_FREE_NID);
C
Chao Yu 已提交
785
	}
786

787
out:
788 789 790 791 792
	f2fs_unlock_op(sbi);

	/* iput will drop the inode object */
	iput(inode);
}