inode.c (31d1b7710262fba12282b24083f20dc76e0efc93) inode.c (bae0ee7a767ceeea6d8e170da3f228fbc7480331)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/inode.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 89 unchanged lines hidden (view full) ---

98static void __recover_inline_status(struct inode *inode, struct page *ipage)
99{
100 void *inline_data = inline_data_addr(inode, ipage);
101 __le32 *start = inline_data;
102 __le32 *end = start + MAX_INLINE_DATA(inode) / sizeof(__le32);
103
104 while (start < end) {
105 if (*start++) {
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/inode.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 89 unchanged lines hidden (view full) ---

98static void __recover_inline_status(struct inode *inode, struct page *ipage)
99{
100 void *inline_data = inline_data_addr(inode, ipage);
101 __le32 *start = inline_data;
102 __le32 *end = start + MAX_INLINE_DATA(inode) / sizeof(__le32);
103
104 while (start < end) {
105 if (*start++) {
106 f2fs_wait_on_page_writeback(ipage, NODE, true);
106 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
107
108 set_inode_flag(inode, FI_DATA_EXIST);
109 set_raw_inline(inode, F2FS_INODE(ipage));
110 set_page_dirty(ipage);
111 return;
112 }
113 }
114 return;
115}
116
117static bool f2fs_enable_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
118{
119 struct f2fs_inode *ri = &F2FS_NODE(page)->i;
120
107
108 set_inode_flag(inode, FI_DATA_EXIST);
109 set_raw_inline(inode, F2FS_INODE(ipage));
110 set_page_dirty(ipage);
111 return;
112 }
113 }
114 return;
115}
116
117static bool f2fs_enable_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
118{
119 struct f2fs_inode *ri = &F2FS_NODE(page)->i;
120
121 if (!f2fs_sb_has_inode_chksum(sbi->sb))
121 if (!f2fs_sb_has_inode_chksum(sbi))
122 return false;
123
124 if (!IS_INODE(page) || !(ri->i_inline & F2FS_EXTRA_ATTR))
125 return false;
126
127 if (!F2FS_FITS_IN_INODE(ri, le16_to_cpu(ri->i_extra_isize),
128 i_inode_checksum))
129 return false;

--- 83 unchanged lines hidden (view full) ---

213 f2fs_msg(sbi->sb, KERN_WARNING,
214 "%s: corrupted inode footer i_ino=%lx, ino,nid: "
215 "[%u, %u] run fsck to fix.",
216 __func__, inode->i_ino,
217 ino_of_node(node_page), nid_of_node(node_page));
218 return false;
219 }
220
122 return false;
123
124 if (!IS_INODE(page) || !(ri->i_inline & F2FS_EXTRA_ATTR))
125 return false;
126
127 if (!F2FS_FITS_IN_INODE(ri, le16_to_cpu(ri->i_extra_isize),
128 i_inode_checksum))
129 return false;

--- 83 unchanged lines hidden (view full) ---

213 f2fs_msg(sbi->sb, KERN_WARNING,
214 "%s: corrupted inode footer i_ino=%lx, ino,nid: "
215 "[%u, %u] run fsck to fix.",
216 __func__, inode->i_ino,
217 ino_of_node(node_page), nid_of_node(node_page));
218 return false;
219 }
220
221 if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)
221 if (f2fs_sb_has_flexible_inline_xattr(sbi)
222 && !f2fs_has_extra_attr(inode)) {
223 set_sbi_flag(sbi, SBI_NEED_FSCK);
224 f2fs_msg(sbi->sb, KERN_WARNING,
225 "%s: corrupted inode ino=%lx, run fsck to fix.",
226 __func__, inode->i_ino);
227 return false;
228 }
229
230 if (f2fs_has_extra_attr(inode) &&
222 && !f2fs_has_extra_attr(inode)) {
223 set_sbi_flag(sbi, SBI_NEED_FSCK);
224 f2fs_msg(sbi->sb, KERN_WARNING,
225 "%s: corrupted inode ino=%lx, run fsck to fix.",
226 __func__, inode->i_ino);
227 return false;
228 }
229
230 if (f2fs_has_extra_attr(inode) &&
231 !f2fs_sb_has_extra_attr(sbi->sb)) {
231 !f2fs_sb_has_extra_attr(sbi)) {
232 set_sbi_flag(sbi, SBI_NEED_FSCK);
233 f2fs_msg(sbi->sb, KERN_WARNING,
234 "%s: inode (ino=%lx) is with extra_attr, "
235 "but extra_attr feature is off",
236 __func__, inode->i_ino);
237 return false;
238 }
239

--- 95 unchanged lines hidden (view full) ---

335 if (f2fs_init_extent_tree(inode, &ri->i_ext))
336 set_page_dirty(node_page);
337
338 get_inline_info(inode, ri);
339
340 fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
341 le16_to_cpu(ri->i_extra_isize) : 0;
342
232 set_sbi_flag(sbi, SBI_NEED_FSCK);
233 f2fs_msg(sbi->sb, KERN_WARNING,
234 "%s: inode (ino=%lx) is with extra_attr, "
235 "but extra_attr feature is off",
236 __func__, inode->i_ino);
237 return false;
238 }
239

--- 95 unchanged lines hidden (view full) ---

335 if (f2fs_init_extent_tree(inode, &ri->i_ext))
336 set_page_dirty(node_page);
337
338 get_inline_info(inode, ri);
339
340 fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
341 le16_to_cpu(ri->i_extra_isize) : 0;
342
343 if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)) {
343 if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
344 fi->i_inline_xattr_size = le16_to_cpu(ri->i_inline_xattr_size);
345 } else if (f2fs_has_inline_xattr(inode) ||
346 f2fs_has_inline_dentry(inode)) {
347 fi->i_inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
348 } else {
349
350 /*
351 * Previous inline data or directory always reserved 200 bytes

--- 33 unchanged lines hidden (view full) ---

385 }
386
387 if (!f2fs_need_inode_block_update(sbi, inode->i_ino))
388 fi->last_disk_size = inode->i_size;
389
390 if (fi->i_flags & F2FS_PROJINHERIT_FL)
391 set_inode_flag(inode, FI_PROJ_INHERIT);
392
344 fi->i_inline_xattr_size = le16_to_cpu(ri->i_inline_xattr_size);
345 } else if (f2fs_has_inline_xattr(inode) ||
346 f2fs_has_inline_dentry(inode)) {
347 fi->i_inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
348 } else {
349
350 /*
351 * Previous inline data or directory always reserved 200 bytes

--- 33 unchanged lines hidden (view full) ---

385 }
386
387 if (!f2fs_need_inode_block_update(sbi, inode->i_ino))
388 fi->last_disk_size = inode->i_size;
389
390 if (fi->i_flags & F2FS_PROJINHERIT_FL)
391 set_inode_flag(inode, FI_PROJ_INHERIT);
392
393 if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi->sb) &&
393 if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi) &&
394 F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_projid))
395 i_projid = (projid_t)le32_to_cpu(ri->i_projid);
396 else
397 i_projid = F2FS_DEF_PROJID;
398 fi->i_projid = make_kprojid(&init_user_ns, i_projid);
399
394 F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_projid))
395 i_projid = (projid_t)le32_to_cpu(ri->i_projid);
396 else
397 i_projid = F2FS_DEF_PROJID;
398 fi->i_projid = make_kprojid(&init_user_ns, i_projid);
399
400 if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi->sb) &&
400 if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi) &&
401 F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
402 fi->i_crtime.tv_sec = le64_to_cpu(ri->i_crtime);
403 fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
404 }
405
406 F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
407 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
408 F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;

--- 83 unchanged lines hidden (view full) ---

492 return inode;
493}
494
495void f2fs_update_inode(struct inode *inode, struct page *node_page)
496{
497 struct f2fs_inode *ri;
498 struct extent_tree *et = F2FS_I(inode)->extent_tree;
499
401 F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
402 fi->i_crtime.tv_sec = le64_to_cpu(ri->i_crtime);
403 fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
404 }
405
406 F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
407 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
408 F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;

--- 83 unchanged lines hidden (view full) ---

492 return inode;
493}
494
495void f2fs_update_inode(struct inode *inode, struct page *node_page)
496{
497 struct f2fs_inode *ri;
498 struct extent_tree *et = F2FS_I(inode)->extent_tree;
499
500 f2fs_wait_on_page_writeback(node_page, NODE, true);
500 f2fs_wait_on_page_writeback(node_page, NODE, true, true);
501 set_page_dirty(node_page);
502
503 f2fs_inode_synced(inode);
504
505 ri = F2FS_INODE(node_page);
506
507 ri->i_mode = cpu_to_le16(inode->i_mode);
508 ri->i_advise = F2FS_I(inode)->i_advise;

--- 28 unchanged lines hidden (view full) ---

537 ri->i_flags = cpu_to_le32(F2FS_I(inode)->i_flags);
538 ri->i_pino = cpu_to_le32(F2FS_I(inode)->i_pino);
539 ri->i_generation = cpu_to_le32(inode->i_generation);
540 ri->i_dir_level = F2FS_I(inode)->i_dir_level;
541
542 if (f2fs_has_extra_attr(inode)) {
543 ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
544
501 set_page_dirty(node_page);
502
503 f2fs_inode_synced(inode);
504
505 ri = F2FS_INODE(node_page);
506
507 ri->i_mode = cpu_to_le16(inode->i_mode);
508 ri->i_advise = F2FS_I(inode)->i_advise;

--- 28 unchanged lines hidden (view full) ---

537 ri->i_flags = cpu_to_le32(F2FS_I(inode)->i_flags);
538 ri->i_pino = cpu_to_le32(F2FS_I(inode)->i_pino);
539 ri->i_generation = cpu_to_le32(inode->i_generation);
540 ri->i_dir_level = F2FS_I(inode)->i_dir_level;
541
542 if (f2fs_has_extra_attr(inode)) {
543 ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
544
545 if (f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(inode)->sb))
545 if (f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(inode)))
546 ri->i_inline_xattr_size =
547 cpu_to_le16(F2FS_I(inode)->i_inline_xattr_size);
548
546 ri->i_inline_xattr_size =
547 cpu_to_le16(F2FS_I(inode)->i_inline_xattr_size);
548
549 if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) &&
549 if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)) &&
550 F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
551 i_projid)) {
552 projid_t i_projid;
553
554 i_projid = from_kprojid(&init_user_ns,
555 F2FS_I(inode)->i_projid);
556 ri->i_projid = cpu_to_le32(i_projid);
557 }
558
550 F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
551 i_projid)) {
552 projid_t i_projid;
553
554 i_projid = from_kprojid(&init_user_ns,
555 F2FS_I(inode)->i_projid);
556 ri->i_projid = cpu_to_le32(i_projid);
557 }
558
559 if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)->sb) &&
559 if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)) &&
560 F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
561 i_crtime)) {
562 ri->i_crtime =
563 cpu_to_le64(F2FS_I(inode)->i_crtime.tv_sec);
564 ri->i_crtime_nsec =
565 cpu_to_le32(F2FS_I(inode)->i_crtime.tv_nsec);
566 }
567 }

--- 226 unchanged lines hidden ---
560 F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
561 i_crtime)) {
562 ri->i_crtime =
563 cpu_to_le64(F2FS_I(inode)->i_crtime.tv_sec);
564 ri->i_crtime_nsec =
565 cpu_to_le32(F2FS_I(inode)->i_crtime.tv_nsec);
566 }
567 }

--- 226 unchanged lines hidden ---