]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs: compress: remove unneeded preallocation
authorChao Yu <yuchao0@huawei.com>
Wed, 12 May 2021 09:52:58 +0000 (17:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:32:17 +0000 (13:32 +0200)
[ Upstream commit 8f1d49832636d514e949b29ce64370ebebf6d6d2 ]

We will reserve iblocks for compression saved, so during compressed
cluster overwrite, we don't need to preallocate blocks for later
write.

In addition, it adds a bug_on to detect wrong reserved iblock number
in __f2fs_cluster_blocks().

Bug fix in the original patch by Jaegeuk:
If we released compressed blocks having an immutable bit, we can see less
number of compressed block addresses. Let's fix wrong BUG_ON.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Stable-dep-of: 7c5dffb3d90c ("f2fs: compress: fix to relocate check condition in f2fs_{release,reserve}_compress_blocks()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/f2fs/compress.c
fs/f2fs/file.c

index 04b6de1a5874454950a181740eb0908713cb3f21..388ed7052d9b6627795efcd2a17f35fe8b3a95df 100644 (file)
@@ -900,6 +900,9 @@ static int __f2fs_cluster_blocks(struct inode *inode,
                                        ret++;
                        }
                }
+
+               f2fs_bug_on(F2FS_I_SB(inode),
+                       !compr && ret != cluster_size && !IS_IMMUTABLE(inode));
        }
 fail:
        f2fs_put_dnode(&dn);
@@ -960,21 +963,16 @@ static int prepare_compress_overwrite(struct compress_ctx *cc,
        struct f2fs_sb_info *sbi = F2FS_I_SB(cc->inode);
        struct address_space *mapping = cc->inode->i_mapping;
        struct page *page;
-       struct dnode_of_data dn;
        sector_t last_block_in_bio;
        unsigned fgp_flag = FGP_LOCK | FGP_WRITE | FGP_CREAT;
        pgoff_t start_idx = start_idx_of_cluster(cc);
        int i, ret;
-       bool prealloc;
 
 retry:
        ret = f2fs_is_compressed_cluster(cc->inode, start_idx);
        if (ret <= 0)
                return ret;
 
-       /* compressed case */
-       prealloc = (ret < cc->cluster_size);
-
        ret = f2fs_init_compress_ctx(cc);
        if (ret)
                return ret;
@@ -1032,25 +1030,6 @@ release_and_retry:
                }
        }
 
-       if (prealloc) {
-               f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
-
-               set_new_dnode(&dn, cc->inode, NULL, NULL, 0);
-
-               for (i = cc->cluster_size - 1; i > 0; i--) {
-                       ret = f2fs_get_block(&dn, start_idx + i);
-                       if (ret) {
-                               i = cc->cluster_size;
-                               break;
-                       }
-
-                       if (dn.data_blkaddr != NEW_ADDR)
-                               break;
-               }
-
-               f2fs_do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
-       }
-
        if (likely(!ret)) {
                *fsdata = cc->rpages;
                *pagep = cc->rpages[offset_in_cluster(cc, index)];
index 678d72a870259af1bb72f60ceb454b4dd5e8cfd3..8b136f2dc2d2248b1d69574b051e3a1da65ade4b 100644 (file)
@@ -81,10 +81,6 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
                        err = ret;
                        goto err;
                } else if (ret) {
-                       if (ret < F2FS_I(inode)->i_cluster_size) {
-                               err = -EAGAIN;
-                               goto err;
-                       }
                        need_alloc = false;
                }
        }