From: Gao Xiang <hsiang...@aol.com>

Seperate erofs_balloc() to make the logic more clearer.

Cc: Hu Weiwen <seh...@mail.scut.edu.cn>
Signed-off-by: Gao Xiang <hsiang...@aol.com>
---
 lib/cache.c | 81 +++++++++++++++++++++++++++++++++--------------------
 1 file changed, 50 insertions(+), 31 deletions(-)

diff --git a/lib/cache.c b/lib/cache.c
index 32a58311f563..f02413d0f887 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -125,25 +125,25 @@ int erofs_bh_balloon(struct erofs_buffer_head *bh, 
erofs_off_t incr)
        return __erofs_battach(bb, NULL, incr, 1, 0, false);
 }
 
-struct erofs_buffer_head *erofs_balloc(int type, erofs_off_t size,
-                                      unsigned int required_ext,
-                                      unsigned int inline_ext)
+static int erofs_bfind_for_attach(int type, erofs_off_t size,
+                                 unsigned int required_ext,
+                                 unsigned int inline_ext,
+                                 unsigned int alignsize,
+                                 struct erofs_buffer_block **bbp)
 {
        struct erofs_buffer_block *cur, *bb;
-       struct erofs_buffer_head *bh;
-       unsigned int alignsize, used0, usedmax;
-
-       int ret = get_alignsize(type, &type);
-
-       if (ret < 0)
-               return ERR_PTR(ret);
-       alignsize = ret;
+       unsigned int used0, usedmax;
 
        used0 = (size + required_ext) % EROFS_BLKSIZ + inline_ext;
+       /* inline data should be in the same fs block */
+       if (used0 > EROFS_BLKSIZ)
+               return -ENOSPC;
+
        usedmax = 0;
        bb = NULL;
 
        list_for_each_entry(cur, &blkh.list, list) {
+               int ret;
                unsigned int used_before, used;
 
                used_before = cur->buffers.off % EROFS_BLKSIZ;
@@ -179,34 +179,53 @@ struct erofs_buffer_head *erofs_balloc(int type, 
erofs_off_t size,
                        usedmax = used;
                }
        }
+       *bbp = bb;
+       return 0;
+}
+
+struct erofs_buffer_head *erofs_balloc(int type, erofs_off_t size,
+                                      unsigned int required_ext,
+                                      unsigned int inline_ext)
+{
+       struct erofs_buffer_block *bb;
+       struct erofs_buffer_head *bh;
+       unsigned int alignsize;
+
+       int ret = get_alignsize(type, &type);
+
+       if (ret < 0)
+               return ERR_PTR(ret);
+       alignsize = ret;
+
+       /* try to find if we could reuse an allocated buffer block */
+       ret = erofs_bfind_for_attach(type, size, required_ext, inline_ext,
+                                    alignsize, &bb);
+       if (ret)
+               return ERR_PTR(ret);
 
        if (bb) {
                bh = malloc(sizeof(struct erofs_buffer_head));
                if (!bh)
                        return ERR_PTR(-ENOMEM);
-               goto found;
-       }
-
-       /* allocate a new buffer block */
-       if (used0 > EROFS_BLKSIZ)
-               return ERR_PTR(-ENOSPC);
-
-       bb = malloc(sizeof(struct erofs_buffer_block));
-       if (!bb)
-               return ERR_PTR(-ENOMEM);
+       } else {
+               /* get a new buffer block instead */
+               bb = malloc(sizeof(struct erofs_buffer_block));
+               if (!bb)
+                       return ERR_PTR(-ENOMEM);
 
-       bb->type = type;
-       bb->blkaddr = NULL_ADDR;
-       bb->buffers.off = 0;
-       init_list_head(&bb->buffers.list);
-       list_add_tail(&bb->list, &blkh.list);
+               bb->type = type;
+               bb->blkaddr = NULL_ADDR;
+               bb->buffers.off = 0;
+               init_list_head(&bb->buffers.list);
+               list_add_tail(&bb->list, &blkh.list);
 
-       bh = malloc(sizeof(struct erofs_buffer_head));
-       if (!bh) {
-               free(bb);
-               return ERR_PTR(-ENOMEM);
+               bh = malloc(sizeof(struct erofs_buffer_head));
+               if (!bh) {
+                       free(bb);
+                       return ERR_PTR(-ENOMEM);
+               }
        }
-found:
+
        ret = __erofs_battach(bb, bh, size, alignsize,
                              required_ext + inline_ext, false);
        if (ret < 0)
-- 
2.24.0

Reply via email to