summaryrefslogtreecommitdiffstats
path: root/e2fsprogs-1.41.4-minimum-resize.patch
diff options
context:
space:
mode:
Diffstat (limited to 'e2fsprogs-1.41.4-minimum-resize.patch')
-rw-r--r--e2fsprogs-1.41.4-minimum-resize.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/e2fsprogs-1.41.4-minimum-resize.patch b/e2fsprogs-1.41.4-minimum-resize.patch
new file mode 100644
index 0000000..233d8bc
--- /dev/null
+++ b/e2fsprogs-1.41.4-minimum-resize.patch
@@ -0,0 +1,93 @@
+Sent to the list:
+
+[PATCH] fix minimum size calculations
+
+The extra padding added to the minimum size calculations:
+
+ /*
+ * 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.
+ */
+ if (fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS)
+ blks_needed += (fs->super->s_blocks_count - blks_needed)/500;
+
+can go quite wrong if we've already added up more "blks_needed"
+than our current size, and the above subtraction wraps. This can
+easily happen for a filesystem which is almost completely full.
+
+In this case, just return the current fs size as the minimum and
+be done with it.
+
+With this fix we could probably call calculate_minimum_resize_size()
+for each resize2fs invocation and refuse to resize smaller than that?
+
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+
+[PATCH] resize2fs: don't try to resize below calculated minimum
+
+Without a force flag, don't allow resize2fs to even start resizing
+below what it thinks the minimum safe value is.
+
+This may stop resizes which could otherwise proceed with a bit
+of space still left, but seems like a reasonably safe thing to do.
+
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+---
+
+Index: e2fsprogs/resize/resize2fs.c
+===================================================================
+--- e2fsprogs.orig/resize/resize2fs.c
++++ e2fsprogs/resize/resize2fs.c
+@@ -2003,6 +2003,12 @@ blk_t calculate_minimum_resize_size(ext2
+ blks_needed += overhead;
+
+ /*
++ * If at this point we've already added up more "needed" than
++ * the current size, just return current size as minimum.
++ */
++ if (blks_needed >= fs->super->s_blocks_count)
++ return fs->super->s_blocks_count;
++ /*
+ * 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.
+
+Index: e2fsprogs/resize/main.c
+===================================================================
+--- e2fsprogs.orig/resize/main.c
++++ e2fsprogs/resize/main.c
+@@ -160,6 +160,7 @@ int main (int argc, char ** argv)
+ int fd, ret;
+ blk_t new_size = 0;
+ blk_t max_size = 0;
++ blk_t min_size = 0;
+ io_manager io_ptr;
+ char *new_size_str = 0;
+ int use_stride = -1;
+@@ -341,9 +342,11 @@ int main (int argc, char ** argv)
+ exit(1);
+ }
+
++ min_size = calculate_minimum_resize_size(fs);
++
+ if (print_min_size) {
+ printf(_("Estimated minimum size of the filesystem: %u\n"),
+- calculate_minimum_resize_size(fs));
++ min_size);
+ exit(0);
+ }
+
+@@ -388,6 +391,11 @@ int main (int argc, char ** argv)
+ new_size &= ~((sys_page_size / fs->blocksize)-1);
+ }
+
++ if (!force && new_size < min_size) {
++ com_err(program_name, 0,
++ _("New size smaller than minimum (%u)\n"), min_size);
++ exit(1);
++ }
+ if (use_stride >= 0) {
+ if (use_stride >= (int) fs->super->s_blocks_per_group) {
+ com_err(program_name, 0,
+