f2fs: fix to tag gcing flag on page during block migration
[platform/kernel/linux-starfive.git] / fs / f2fs / file.c
index ca59041..dcf2d92 100644 (file)
@@ -42,7 +42,7 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
        vm_fault_t ret;
 
        ret = filemap_fault(vmf);
-       if (!ret)
+       if (ret & VM_FAULT_LOCKED)
                f2fs_update_iostat(F2FS_I_SB(inode), inode,
                                        APP_MAPPED_READ_IO, F2FS_BLKSIZE);
 
@@ -1317,6 +1317,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
                        }
                        memcpy_page(pdst, 0, psrc, 0, PAGE_SIZE);
                        set_page_dirty(pdst);
+                       set_page_private_gcing(pdst);
                        f2fs_put_page(pdst, 1);
                        f2fs_put_page(psrc, 1);
 
@@ -2818,6 +2819,11 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
                        goto out;
        }
 
+       if (f2fs_compressed_file(src) || f2fs_compressed_file(dst)) {
+               ret = -EOPNOTSUPP;
+               goto out_unlock;
+       }
+
        ret = -EINVAL;
        if (pos_in + len > src->i_size || pos_in + len < pos_in)
                goto out_unlock;
@@ -3258,6 +3264,7 @@ int f2fs_precache_extents(struct inode *inode)
                return -EOPNOTSUPP;
 
        map.m_lblk = 0;
+       map.m_pblk = 0;
        map.m_next_pgofs = NULL;
        map.m_next_extent = &m_next_extent;
        map.m_seg_type = NO_CHECK_TYPE;
@@ -4005,6 +4012,15 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg)
        F2FS_I(inode)->i_compress_algorithm = option.algorithm;
        F2FS_I(inode)->i_log_cluster_size = option.log_cluster_size;
        F2FS_I(inode)->i_cluster_size = BIT(option.log_cluster_size);
+       /* Set default level */
+       if (F2FS_I(inode)->i_compress_algorithm == COMPRESS_ZSTD)
+               F2FS_I(inode)->i_compress_level = F2FS_ZSTD_DEFAULT_CLEVEL;
+       else
+               F2FS_I(inode)->i_compress_level = 0;
+       /* Adjust mount option level */
+       if (option.algorithm == F2FS_OPTION(sbi).compress_algorithm &&
+           F2FS_OPTION(sbi).compress_level)
+               F2FS_I(inode)->i_compress_level = F2FS_OPTION(sbi).compress_level;
        f2fs_mark_inode_dirty_sync(inode, true);
 
        if (!f2fs_is_compress_backend_ready(inode))
@@ -4044,6 +4060,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
                f2fs_bug_on(F2FS_I_SB(inode), !page);
 
                set_page_dirty(page);
+               set_page_private_gcing(page);
                f2fs_put_page(page, 1);
                f2fs_put_page(page, 0);
        }