[PATCH v2.1 03/10] btrfs-progs: image: Don't waste memory when we're just extracting super block

Qu Wenruo
2019-07-04T06:11:16Z

There is no need to allocate 2 * max_pending_size (which can be 256M) if
we're just extracting super block.

We only need to prepare BTRFS_SUPER_INFO_SIZE as buffer size.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
image/main.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/image/main.c b/image/main.c
index 7c499c0853d0..162a578a3ff8 100644
--- a/image/main.c
+++ b/image/main.c
@@ -1522,9 +1522,14 @@ static int fill_mdres_info(struct mdrestore_struct *mdres,
return 0;

if (mdres->compress_method == COMPRESS_ZLIB) {
- size_t size = MAX_PENDING_SIZE * 2;
+ /*
+ * We know this item is superblock, its should only be 4K.
+ * Don't need to waste memory following max_pending_size as it
+ * can be as large as 256M.
+ */
+ size_t size = BTRFS_SUPER_INFO_SIZE;

- buffer = malloc(MAX_PENDING_SIZE * 2);
+ buffer = malloc(size);
if (!buffer)
return -ENOMEM;
ret = uncompress(buffer, (unsigned long *)&size,
@@ -1963,10 +1968,10 @@ static int build_chunk_tree(struct mdrestore_struct *mdres,
}

if (mdres->compress_method == COMPRESS_ZLIB) {
- size_t size = MAX_PENDING_SIZE * 2;
+ size_t size = BTRFS_SUPER_INFO_SIZE;
u8 *tmp;

- tmp = malloc(MAX_PENDING_SIZE * 2);
+ tmp = malloc(size);
if (!tmp) {
free(buffer);
return -ENOMEM;
--
2.22.0