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