revert "resize2fs: fix overly-pessimistic calculation of minimum size required" 10/143510/1 accepted/tizen_4.0_base accepted/tizen/4.0/base/20170828.221306 accepted/tizen/base/20170814.055754 submit/tizen_4.0_base/20170828.000000 submit/tizen_4.0_base/20170828.000001 submit/tizen_base/20170811.072713 tizen_4.0.IoT.p1_release tizen_4.0.IoT.p2_release tizen_4.0.m2_release
authorYunmi Ha <yunmi.ha@samsung.com>
Thu, 10 Aug 2017 07:17:22 +0000 (16:17 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Thu, 10 Aug 2017 07:17:22 +0000 (16:17 +0900)
resize2fs: fix overly-pessimistic calculation of minimum size required

For extent-mapped file systems, we need to reserve some extra space in
case we need to grow the extent tree.  Calculate the safety margin
more intelligently, so we don't overestimate the amount of space
required.
(https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/commit/?id=b4f30fcfe66c76a95689b9a39c229cef2446b385)

This patch increased start block for reserving margin
so it sometimes failed to resize when filesystem is very small.
(error message - resize2fs: No space left on device while trying to
 resize csc.img)

Therefore, it is only available in the extent-mapped file system.
We can't use this patch.

Change-Id: I5783fe33dd000717828a361ecb628d5750b39940
Signed-off-by: Yunmi Ha <yunmi.ha@samsung.com>
resize/resize2fs.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 0dd7838..9540863
@@ -2838,10 +2838,9 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
         * inode tables of slack space so the resize operation can be
         * guaranteed to finish.
         */
-       blks_needed = data_needed;
        if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG) {
                extra_groups = flexbg_size - (groups & (flexbg_size - 1));
-               blks_needed += fs->inode_blocks_per_group * extra_groups;
+               data_needed += fs->inode_blocks_per_group * extra_groups;
                extra_groups = groups % flexbg_size;
        }
 
@@ -2875,8 +2874,8 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
         * if we need more group descriptors in order to accomodate our data
         * then we need to add them here
         */
-       while (blks_needed > data_blocks) {
-               blk64_t remainder = blks_needed - data_blocks;
+       while (data_needed > data_blocks) {
+               blk64_t remainder = data_needed - data_blocks;
                dgrp_t extra_grps;
 
                /* figure out how many more groups we need for the data */
@@ -2916,16 +2915,17 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
                         */
                        extra_groups = flexbg_size -
                                                (groups & (flexbg_size - 1));
-                       blks_needed += (fs->inode_blocks_per_group *
+                       data_needed += (fs->inode_blocks_per_group *
                                        extra_groups);
                        extra_groups = groups % flexbg_size;
                }
 #ifdef RESIZE2FS_DEBUG
                if (flags & RESIZE_DEBUG_MIN_CALC)
                        printf("Added %d extra group(s), "
-                              "blks_needed %llu, data_blocks %llu, "
-                              "last_start %llu\n", extra_grps, blks_needed,
-                              data_blocks, last_start);
+                              "data_needed %llu, data_blocks %llu, "
+                              "last_start %llu\n",
+                              extra_grps, data_needed, data_blocks,
+                              last_start);
 #endif
        }
 
@@ -2940,8 +2940,8 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
         * if this is the case then the last group is going to have data in it
         * so we need to adjust the size of the last group accordingly
         */
-       if (last_start < blks_needed) {
-               blk64_t remainder = blks_needed - last_start;
+       if (last_start < data_needed) {
+               blk64_t remainder = data_needed - last_start;
 
 #ifdef RESIZE2FS_DEBUG
                if (flags & RESIZE_DEBUG_MIN_CALC)
@@ -2999,25 +2999,10 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
         * We need to reserve a few extra blocks if extents are
         * enabled, in case we need to grow the extent tree.  The more
         * we shrink the file system, the more space we need.
-        *
-        * The absolute worst case is every single data block is in
-        * the part of the file system that needs to be evacuated,
-        * with each data block needs to be in its own extent, and
-        * with each inode needing at least one extent block.
         */
        if (ext2fs_has_feature_extents(fs->super)) {
                blk64_t safe_margin = (ext2fs_blocks_count(fs->super) -
                                       blks_needed)/500;
-               unsigned int exts_per_blk = (fs->blocksize /
-                                            sizeof(struct ext3_extent)) - 1;
-               blk64_t worst_case = ((data_needed + exts_per_blk - 1) /
-                                     exts_per_blk);
-
-               if (worst_case < inode_count)
-                       worst_case = inode_count;
-
-               if (safe_margin > worst_case)
-                       safe_margin = worst_case;
 
 #ifdef RESIZE2FS_DEBUG
                if (flags & RESIZE_DEBUG_MIN_CALC)