For lz4 worst compress case, caller should allocate buffer with size
of LZ4_compressBound(inputsize) for target compressed data storing.

However lz4 supports partial data compression, so we can get rid of
output buffer size limitation now, then we can avoid 2 * 4KB size
intermediate buffer allocation when log_cluster_size is 2, and avoid
unnecessary compressing work of compressor if we can not save at
least 4KB space.

Suggested-by: Daeho Jeong <daehoje...@google.com>
Signed-off-by: Chao Yu <yuch...@huawei.com>
---
 fs/f2fs/compress.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
index 5e4947250262..23825f559bcf 100644
--- a/fs/f2fs/compress.c
+++ b/fs/f2fs/compress.c
@@ -228,7 +228,12 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc)
        if (!cc->private)
                return -ENOMEM;
 
-       cc->clen = LZ4_compressBound(PAGE_SIZE << cc->log_cluster_size);
+       /*
+        * we do not change cc->clen to LZ4_compressBound(inputsize) to
+        * adapt worst compress case, because lz4 algorithm supports partial
+        * compression.
+        */
+       cc->clen = cc->rlen - PAGE_SIZE - COMPRESS_HEADER_SIZE;
        return 0;
 }
 
@@ -244,11 +249,9 @@ static int lz4_compress_pages(struct compress_ctx *cc)
 
        len = LZ4_compress_default(cc->rbuf, cc->cbuf->cdata, cc->rlen,
                                                cc->clen, cc->private);
-       if (!len) {
-               printk_ratelimited("%sF2FS-fs (%s): lz4 compress failed\n",
-                               KERN_ERR, F2FS_I_SB(cc->inode)->sb->s_id);
-               return -EIO;
-       }
+       if (!len)
+               return -EAGAIN;
+
        cc->clen = len;
        return 0;
 }
-- 
2.18.0.rc1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to