Hello all,

During my development, I noticed following bug while creating system image
(ext4):

make_ext4fs -s -l 929038336 -a system
out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
out/target/product/generic/system
error: do_inode_allocate_extents: Failed to allocate 36805 blocks

Creating filesystem with parameters:
    Size: 929038336
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8112
    Inode size: 256
    Journal blocks: 3544
    Label:
    Blocks: 226816
    Block groups: 7
    Reserved block group size: 55

After debugging it looks like ext4_allocate_partial does not allocate from
group which has any data blocks used.

Following patch seems to resolve the problem but I am not sure why there is
check at first place.

If anyone can throw some light on reason for this check in
allocate.c(ext4_allocate_partial):

               if (aux_info.bgs[i].data_blocks_used == 0) {

TIA,
Pradeep


diff --git a/ext4_utils/allocate.c b/ext4_utils/allocate.c
index c0b2c7e..d448a01 100644
--- a/ext4_utils/allocate.c
+++ b/ext4_utils/allocate.c
@@ -400,34 +400,32 @@ static struct region *ext4_allocate_partial(u32 len)
        struct region *reg;

        for (i = 0; i < aux_info.groups; i++) {
-               if (aux_info.bgs[i].data_blocks_used == 0) {
-                       u32 bg_len = aux_info.bgs[i].free_blocks;
-                       u32 block;
-
-                       if (len <= bg_len) {
-                               /* If the requested length would fit in a
block group,
-                                use the regular allocator to try to fit it
in a partially
-                                used block group */
-                               bg_len = len;
-                               reg = ext4_allocate_contiguous_blocks(len);
-                       } else {
-                               block =
ext4_allocate_blocks_from_block_group(bg_len, i);
-
-                               if (block == EXT4_ALLOCATE_FAILED) {
-                                       error("failed to allocate %d blocks
in block group %d", bg_len, i);
-                                       return NULL;
-                               }
-
-                               reg = malloc(sizeof(struct region));
-                               reg->block = block;
-                               reg->len = bg_len;
-                               reg->next = NULL;
-                               reg->prev = NULL;
-                               reg->bg = i;
+               u32 bg_len = aux_info.bgs[i].free_blocks;
+               u32 block;
+
+               if (len <= bg_len) {
+                       /* If the requested length would fit in a block
group,
+                          use the regular allocator to try to fit it in a
partially
+                          used block group */
+                       bg_len = len;
+                       reg = ext4_allocate_contiguous_blocks(len);
+               } else  if(bg_len > 1) {
+                       block =
ext4_allocate_blocks_from_block_group(bg_len, i);
+
+                       if (block == EXT4_ALLOCATE_FAILED) {
+                               error("failed to allocate %d blocks in
block group %d", bg_len, i);
+                               return NULL;
                        }

-                       return reg;
-               }
+                       reg = malloc(sizeof(struct region));
+                       reg->block = block;
+                       reg->len = bg_len;
+                       reg->next = NULL;
+                       reg->prev = NULL;
+                       reg->bg = i;
+               } else
+                       continue;
+               return reg;
        }
        return NULL;
 }

-- 
-- 
unsubscribe: android-kernel+unsubscr...@googlegroups.com
website: http://groups.google.com/group/android-kernel
--- 
You received this message because you are subscribed to the Google Groups 
"Android Linux Kernel Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-kernel+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to