hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/fs/f2fs/inode.c
....@@ -18,6 +18,10 @@
1818
1919 #include <trace/events/f2fs.h>
2020
21
+#ifdef CONFIG_F2FS_FS_COMPRESSION
22
+extern const struct address_space_operations f2fs_compress_aops;
23
+#endif
24
+
2125 void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)
2226 {
2327 if (is_inode_flag_set(inode, FI_NEW_INODE))
....@@ -256,8 +260,8 @@
256260 return false;
257261 }
258262
259
- if (F2FS_I(inode)->extent_tree) {
260
- struct extent_info *ei = &F2FS_I(inode)->extent_tree->largest;
263
+ if (fi->extent_tree[EX_READ]) {
264
+ struct extent_info *ei = &fi->extent_tree[EX_READ]->largest;
261265
262266 if (ei->len &&
263267 (!f2fs_is_valid_blkaddr(sbi, ei->blk,
....@@ -272,8 +276,7 @@
272276 }
273277 }
274278
275
- if (f2fs_has_inline_data(inode) &&
276
- (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))) {
279
+ if (f2fs_sanity_check_inline_data(inode)) {
277280 set_sbi_flag(sbi, SBI_NEED_FSCK);
278281 f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_data, run fsck to fix",
279282 __func__, inode->i_ino, inode->i_mode);
....@@ -287,11 +290,19 @@
287290 return false;
288291 }
289292
293
+ if ((fi->i_flags & F2FS_CASEFOLD_FL) && !f2fs_sb_has_casefold(sbi)) {
294
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
295
+ f2fs_warn(sbi, "%s: inode (ino=%lx) has casefold flag, but casefold feature is off",
296
+ __func__, inode->i_ino);
297
+ return false;
298
+ }
299
+
290300 if (f2fs_has_extra_attr(inode) && f2fs_sb_has_compression(sbi) &&
291301 fi->i_flags & F2FS_COMPR_FL &&
292302 F2FS_FITS_IN_INODE(ri, fi->i_extra_isize,
293303 i_log_cluster_size)) {
294304 if (ri->i_compress_algorithm >= COMPRESS_MAX) {
305
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
295306 f2fs_warn(sbi, "%s: inode (ino=%lx) has unsupported "
296307 "compress algorithm: %u, run fsck to fix",
297308 __func__, inode->i_ino,
....@@ -300,15 +311,17 @@
300311 }
301312 if (le64_to_cpu(ri->i_compr_blocks) >
302313 SECTOR_TO_BLOCK(inode->i_blocks)) {
314
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
303315 f2fs_warn(sbi, "%s: inode (ino=%lx) has inconsistent "
304316 "i_compr_blocks:%llu, i_blocks:%llu, run fsck to fix",
305317 __func__, inode->i_ino,
306318 le64_to_cpu(ri->i_compr_blocks),
307
- (u64)SECTOR_TO_BLOCK(inode->i_blocks));
319
+ SECTOR_TO_BLOCK(inode->i_blocks));
308320 return false;
309321 }
310322 if (ri->i_log_cluster_size < MIN_COMPRESS_LOG_SIZE ||
311323 ri->i_log_cluster_size > MAX_COMPRESS_LOG_SIZE) {
324
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
312325 f2fs_warn(sbi, "%s: inode (ino=%lx) has unsupported "
313326 "log cluster size: %u, run fsck to fix",
314327 __func__, inode->i_ino,
....@@ -367,9 +380,6 @@
367380 fi->i_pino = le32_to_cpu(ri->i_pino);
368381 fi->i_dir_level = ri->i_dir_level;
369382
370
- if (f2fs_init_extent_tree(inode, &ri->i_ext))
371
- set_page_dirty(node_page);
372
-
373383 get_inline_info(inode, ri);
374384
375385 fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
....@@ -402,6 +412,7 @@
402412
403413 /* try to recover cold bit for non-dir inode */
404414 if (!S_ISDIR(inode->i_mode) && !is_cold_node(node_page)) {
415
+ f2fs_wait_on_page_writeback(node_page, NODE, true, true);
405416 set_cold_node(node_page, false);
406417 set_page_dirty(node_page);
407418 }
....@@ -442,9 +453,11 @@
442453 (fi->i_flags & F2FS_COMPR_FL)) {
443454 if (F2FS_FITS_IN_INODE(ri, fi->i_extra_isize,
444455 i_log_cluster_size)) {
445
- fi->i_compr_blocks = le64_to_cpu(ri->i_compr_blocks);
456
+ atomic_set(&fi->i_compr_blocks,
457
+ le64_to_cpu(ri->i_compr_blocks));
446458 fi->i_compress_algorithm = ri->i_compress_algorithm;
447459 fi->i_log_cluster_size = ri->i_log_cluster_size;
460
+ fi->i_compress_flag = le16_to_cpu(ri->i_compress_flag);
448461 fi->i_cluster_size = 1 << fi->i_log_cluster_size;
449462 set_inode_flag(inode, FI_COMPRESSED_FILE);
450463 }
....@@ -454,13 +467,18 @@
454467 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
455468 F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
456469 F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
470
+
471
+ /* Need all the flag bits */
472
+ f2fs_init_read_extent_tree(inode, node_page);
473
+ f2fs_init_age_extent_tree(inode);
474
+
457475 f2fs_put_page(node_page, 1);
458476
459477 stat_inc_inline_xattr(inode);
460478 stat_inc_inline_inode(inode);
461479 stat_inc_inline_dir(inode);
462480 stat_inc_compr_inode(inode);
463
- stat_add_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks);
481
+ stat_add_compr_blocks(inode, atomic_read(&fi->i_compr_blocks));
464482
465483 return 0;
466484 }
....@@ -482,6 +500,11 @@
482500 if (ino == F2FS_NODE_INO(sbi) || ino == F2FS_META_INO(sbi))
483501 goto make_now;
484502
503
+#ifdef CONFIG_F2FS_FS_COMPRESSION
504
+ if (ino == F2FS_COMPRESS_INO(sbi))
505
+ goto make_now;
506
+#endif
507
+
485508 ret = do_read_inode(inode);
486509 if (ret)
487510 goto bad_inode;
....@@ -492,6 +515,12 @@
492515 } else if (ino == F2FS_META_INO(sbi)) {
493516 inode->i_mapping->a_ops = &f2fs_meta_aops;
494517 mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
518
+ } else if (ino == F2FS_COMPRESS_INO(sbi)) {
519
+#ifdef CONFIG_F2FS_FS_COMPRESSION
520
+ inode->i_mapping->a_ops = &f2fs_compress_aops;
521
+#endif
522
+ mapping_set_gfp_mask(inode->i_mapping,
523
+ GFP_NOFS | __GFP_HIGHMEM | __GFP_MOVABLE);
495524 } else if (S_ISREG(inode->i_mode)) {
496525 inode->i_op = &f2fs_file_inode_operations;
497526 inode->i_fop = &f2fs_file_operations;
....@@ -545,7 +574,7 @@
545574 void f2fs_update_inode(struct inode *inode, struct page *node_page)
546575 {
547576 struct f2fs_inode *ri;
548
- struct extent_tree *et = F2FS_I(inode)->extent_tree;
577
+ struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ];
549578
550579 f2fs_wait_on_page_writeback(node_page, NODE, true, true);
551580 set_page_dirty(node_page);
....@@ -564,7 +593,7 @@
564593
565594 if (et) {
566595 read_lock(&et->lock);
567
- set_raw_extent(&et->largest, &ri->i_ext);
596
+ set_raw_read_extent(&et->largest, &ri->i_ext);
568597 read_unlock(&et->lock);
569598 } else {
570599 memset(&ri->i_ext, 0, sizeof(ri->i_ext));
....@@ -619,9 +648,12 @@
619648 F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
620649 i_log_cluster_size)) {
621650 ri->i_compr_blocks =
622
- cpu_to_le64(F2FS_I(inode)->i_compr_blocks);
651
+ cpu_to_le64(atomic_read(
652
+ &F2FS_I(inode)->i_compr_blocks));
623653 ri->i_compress_algorithm =
624654 F2FS_I(inode)->i_compress_algorithm;
655
+ ri->i_compress_flag =
656
+ cpu_to_le16(F2FS_I(inode)->i_compress_flag);
625657 ri->i_log_cluster_size =
626658 F2FS_I(inode)->i_log_cluster_size;
627659 }
....@@ -631,7 +663,7 @@
631663
632664 /* deleted inode */
633665 if (inode->i_nlink == 0)
634
- clear_inline_node(node_page);
666
+ clear_page_private_inline(node_page);
635667
636668 F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
637669 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
....@@ -651,11 +683,13 @@
651683 node_page = f2fs_get_node_page(sbi, inode->i_ino);
652684 if (IS_ERR(node_page)) {
653685 int err = PTR_ERR(node_page);
686
+
654687 if (err == -ENOMEM) {
655688 cond_resched();
656689 goto retry;
657690 } else if (err != -ENOENT) {
658
- f2fs_stop_checkpoint(sbi, false);
691
+ f2fs_stop_checkpoint(sbi, false,
692
+ STOP_CP_REASON_UPDATE_INODE);
659693 }
660694 return;
661695 }
....@@ -683,7 +717,7 @@
683717
684718 /*
685719 * We need to balance fs here to prevent from producing dirty node pages
686
- * during the urgent cleaning time when runing out of free sections.
720
+ * during the urgent cleaning time when running out of free sections.
687721 */
688722 f2fs_update_inode_page(inode);
689723 if (wbc && wbc->nr_to_write)
....@@ -707,8 +741,12 @@
707741 trace_f2fs_evict_inode(inode);
708742 truncate_inode_pages_final(&inode->i_data);
709743
744
+ if (test_opt(sbi, COMPRESS_CACHE) && f2fs_compressed_file(inode))
745
+ f2fs_invalidate_compress_pages(sbi, inode->i_ino);
746
+
710747 if (inode->i_ino == F2FS_NODE_INO(sbi) ||
711
- inode->i_ino == F2FS_META_INO(sbi))
748
+ inode->i_ino == F2FS_META_INO(sbi) ||
749
+ inode->i_ino == F2FS_COMPRESS_INO(sbi))
712750 goto out_clear;
713751
714752 f2fs_bug_on(sbi, get_dirty_pages(inode));
....@@ -729,7 +767,8 @@
729767 f2fs_remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
730768 f2fs_remove_ino_entry(sbi, inode->i_ino, FLUSH_INO);
731769
732
- sb_start_intwrite(inode->i_sb);
770
+ if (!is_sbi_flag_set(sbi, SBI_IS_FREEZING))
771
+ sb_start_intwrite(inode->i_sb);
733772 set_inode_flag(inode, FI_NO_ALLOC);
734773 i_size_write(inode, 0);
735774 retry:
....@@ -745,8 +784,22 @@
745784 f2fs_lock_op(sbi);
746785 err = f2fs_remove_inode_page(inode);
747786 f2fs_unlock_op(sbi);
748
- if (err == -ENOENT)
787
+ if (err == -ENOENT) {
749788 err = 0;
789
+
790
+ /*
791
+ * in fuzzed image, another node may has the same
792
+ * block address as inode's, if it was truncated
793
+ * previously, truncation of inode node will fail.
794
+ */
795
+ if (is_inode_flag_set(inode, FI_DIRTY_INODE)) {
796
+ f2fs_warn(F2FS_I_SB(inode),
797
+ "f2fs_evict_inode: inconsistent node id, ino:%lu",
798
+ inode->i_ino);
799
+ f2fs_inode_synced(inode);
800
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
801
+ }
802
+ }
750803 }
751804
752805 /* give more chances, if ENOMEM case */
....@@ -760,7 +813,8 @@
760813 if (dquot_initialize_needed(inode))
761814 set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
762815 }
763
- sb_end_intwrite(inode->i_sb);
816
+ if (!is_sbi_flag_set(sbi, SBI_IS_FREEZING))
817
+ sb_end_intwrite(inode->i_sb);
764818 no_delete:
765819 dquot_drop(inode);
766820
....@@ -768,7 +822,8 @@
768822 stat_dec_inline_dir(inode);
769823 stat_dec_inline_inode(inode);
770824 stat_dec_compr_inode(inode);
771
- stat_sub_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks);
825
+ stat_sub_compr_blocks(inode,
826
+ atomic_read(&F2FS_I(inode)->i_compr_blocks));
772827
773828 if (likely(!f2fs_cp_error(sbi) &&
774829 !is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
....@@ -832,9 +887,10 @@
832887 * so we can prevent losing this orphan when encoutering checkpoint
833888 * and following suddenly power-off.
834889 */
835
- err = f2fs_get_node_info(sbi, inode->i_ino, &ni);
890
+ err = f2fs_get_node_info(sbi, inode->i_ino, &ni, false);
836891 if (err) {
837892 set_sbi_flag(sbi, SBI_NEED_FSCK);
893
+ set_inode_flag(inode, FI_FREE_NID);
838894 f2fs_warn(sbi, "May loss orphan inode, run fsck to fix.");
839895 goto out;
840896 }