From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: tytso@mit.edu, darrick.wong@oracle.com
Cc: linux-ext4@vger.kernel.org
Subject: [PATCH 17/25] resize2fs: when toggling 64bit, don't free in-use bg data clusters
Date: Thu, 17 Oct 2013 21:50:50 -0700 [thread overview]
Message-ID: <20131018045050.7339.79597.stgit@birch.djwong.org> (raw)
In-Reply-To: <20131018044854.7339.48457.stgit@birch.djwong.org>
Currently, move_bg_metadata() assumes that if a block containing a
superblock or a group descriptor is no longer needed, then it is safe
to free the whole cluster. This of course isn't true, for bitmaps and
inode tables can share these clusters. Therefore, check a little more
carefully before freeing clusters.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
resize/resize2fs.c | 71 ++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 55 insertions(+), 16 deletions(-)
diff --git a/resize/resize2fs.c b/resize/resize2fs.c
index 05ba6e1..472aa4a 100644
--- a/resize/resize2fs.c
+++ b/resize/resize2fs.c
@@ -307,11 +307,11 @@ static errcode_t resize_group_descriptors(ext2_resize_t rfs, blk64_t new_size)
static errcode_t move_bg_metadata(ext2_resize_t rfs)
{
dgrp_t i;
- blk64_t b, c, d;
+ blk64_t b, c, d, old_desc_blocks, new_desc_blocks, j;
ext2fs_block_bitmap old_map, new_map;
int old, new;
errcode_t retval;
- int zero = 0, one = 1;
+ int zero = 0, one = 1, cluster_ratio;
if (!(rfs->flags & (RESIZE_DISABLE_64BIT | RESIZE_ENABLE_64BIT)))
return 0;
@@ -324,6 +324,17 @@ static errcode_t move_bg_metadata(ext2_resize_t rfs)
if (retval)
goto out;
+ if (EXT2_HAS_INCOMPAT_FEATURE(rfs->old_fs->super,
+ EXT2_FEATURE_INCOMPAT_META_BG)) {
+ old_desc_blocks = rfs->old_fs->super->s_first_meta_bg;
+ new_desc_blocks = rfs->new_fs->super->s_first_meta_bg;
+ } else {
+ old_desc_blocks = rfs->old_fs->desc_blocks +
+ rfs->old_fs->super->s_reserved_gdt_blocks;
+ new_desc_blocks = rfs->new_fs->desc_blocks +
+ rfs->new_fs->super->s_reserved_gdt_blocks;
+ }
+
/* Construct bitmaps of super/descriptor blocks in old and new fs */
for (i = 0; i < rfs->old_fs->group_desc_count; i++) {
retval = ext2fs_super_and_bgd_loc2(rfs->old_fs, i, &b, &c, &d,
@@ -331,7 +342,8 @@ static errcode_t move_bg_metadata(ext2_resize_t rfs)
if (retval)
goto out;
ext2fs_mark_block_bitmap2(old_map, b);
- ext2fs_mark_block_bitmap2(old_map, c);
+ for (j = 0; c != 0 && j < old_desc_blocks; j++)
+ ext2fs_mark_block_bitmap2(old_map, c + j);
ext2fs_mark_block_bitmap2(old_map, d);
retval = ext2fs_super_and_bgd_loc2(rfs->new_fs, i, &b, &c, &d,
@@ -339,45 +351,72 @@ static errcode_t move_bg_metadata(ext2_resize_t rfs)
if (retval)
goto out;
ext2fs_mark_block_bitmap2(new_map, b);
- ext2fs_mark_block_bitmap2(new_map, c);
+ for (j = 0; c != 0 && j < new_desc_blocks; j++)
+ ext2fs_mark_block_bitmap2(new_map, c + j);
ext2fs_mark_block_bitmap2(new_map, d);
}
+ cluster_ratio = EXT2FS_CLUSTER_RATIO(rfs->new_fs);
+
/* Find changes in block allocations for bg metadata */
for (b = 0;
b < ext2fs_blocks_count(rfs->new_fs->super);
- b += EXT2FS_CLUSTER_RATIO(rfs->new_fs)) {
+ b += cluster_ratio) {
old = ext2fs_test_block_bitmap2(old_map, b);
new = ext2fs_test_block_bitmap2(new_map, b);
- if (old && !new)
- ext2fs_unmark_block_bitmap2(rfs->new_fs->block_map, b);
- else if (!old && new)
- ; /* empty ext2fs_mark_block_bitmap2(new_map, b); */
- else
+ if (old && !new) {
+ /* mark old_map, unmark new_map */
+ if (cluster_ratio == 1)
+ ext2fs_unmark_block_bitmap2(
+ rfs->new_fs->block_map, b);
+ } else if (!old && new)
+ ; /* unmark old_map, mark new_map */
+ else {
+ ext2fs_unmark_block_bitmap2(old_map, b);
ext2fs_unmark_block_bitmap2(new_map, b);
+ }
}
- /* new_map now shows blocks that have been newly allocated. */
- /* Move any conflicting bitmaps and inode tables */
+ /*
+ * new_map now shows blocks that have been newly allocated.
+ * old_map now shows blocks that have been newly freed.
+ */
+
+ /*
+ * Move any conflicting bitmaps and inode tables. Ensure that we
+ * don't try to free clusters associated with bitmaps or tables.
+ */
for (i = 0; i < rfs->old_fs->group_desc_count; i++) {
b = ext2fs_block_bitmap_loc(rfs->new_fs, i);
if (ext2fs_test_block_bitmap2(new_map, b))
ext2fs_block_bitmap_loc_set(rfs->new_fs, i, 0);
+ else if (ext2fs_test_block_bitmap2(old_map, b))
+ ext2fs_unmark_block_bitmap2(old_map, b);
b = ext2fs_inode_bitmap_loc(rfs->new_fs, i);
if (ext2fs_test_block_bitmap2(new_map, b))
ext2fs_inode_bitmap_loc_set(rfs->new_fs, i, 0);
+ else if (ext2fs_test_block_bitmap2(old_map, b))
+ ext2fs_unmark_block_bitmap2(old_map, b);
c = ext2fs_inode_table_loc(rfs->new_fs, i);
- for (b = 0; b < rfs->new_fs->inode_blocks_per_group; b++) {
- if (ext2fs_test_block_bitmap2(new_map, b + c)) {
+ for (b = 0;
+ b < rfs->new_fs->inode_blocks_per_group;
+ b++) {
+ if (ext2fs_test_block_bitmap2(new_map, b + c))
ext2fs_inode_table_loc_set(rfs->new_fs, i, 0);
- break;
- }
+ else if (ext2fs_test_block_bitmap2(old_map, b + c))
+ ext2fs_unmark_block_bitmap2(old_map, b + c);
}
}
+ /* Free unused clusters */
+ for (b = 0;
+ cluster_ratio > 1 && b < ext2fs_blocks_count(rfs->new_fs->super);
+ b += cluster_ratio)
+ if (ext2fs_test_block_bitmap2(old_map, b))
+ ext2fs_unmark_block_bitmap2(rfs->new_fs->block_map, b);
out:
if (old_map)
ext2fs_free_block_bitmap(old_map);
next prev parent reply other threads:[~2013-10-18 4:50 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-18 4:48 [PATCH v2 00/25] e2fsprogs patchbomb 10/2013 Darrick J. Wong
2013-10-18 4:49 ` [PATCH 01/25] libext2fs: stop iterating dirents when done linking Darrick J. Wong
2013-10-23 23:39 ` Theodore Ts'o
2013-10-18 4:49 ` [PATCH 02/25] libext2fs: fix ext2fs_open2() truncation of the superblock parameter Darrick J. Wong
2013-10-18 18:32 ` Darrick J. Wong
2013-10-23 14:49 ` Lukáš Czerner
2013-10-18 4:49 ` [PATCH 03/25] mke2fs: don't let resize= turn on resize_inode when meta_bg is set Darrick J. Wong
2013-10-23 15:08 ` Lukáš Czerner
2013-10-23 23:40 ` Theodore Ts'o
2013-10-18 4:49 ` [PATCH 04/25] libext2fs: reject 64bit badblocks numbers Darrick J. Wong
2013-10-23 15:24 ` Lukáš Czerner
2013-10-23 23:58 ` Theodore Ts'o
2013-10-24 11:40 ` Lukáš Czerner
2013-10-18 4:49 ` [PATCH 05/25] libext2fs: don't overflow when punching indirect blocks with large blocks Darrick J. Wong
2013-10-24 0:08 ` Theodore Ts'o
2013-12-04 4:40 ` Darrick J. Wong
2013-10-18 4:49 ` [PATCH 06/25] libext2fs: fix tests that set LARGE_FILE Darrick J. Wong
2013-11-25 7:09 ` Zheng Liu
2013-11-25 17:57 ` Darrick J. Wong
2013-10-18 4:49 ` [PATCH 07/25] mke2fs: load configfile blocksize setting before 64bit checks Darrick J. Wong
2013-11-25 8:01 ` Zheng Liu
2013-10-18 4:49 ` [PATCH 08/25] debugfs: fix various minor bogosity Darrick J. Wong
2013-11-25 8:08 ` Zheng Liu
2013-11-25 18:05 ` Darrick J. Wong
2013-10-18 4:49 ` [PATCH 09/25] e2fsck: teach EA refcounting code to handle 64bit block addresses Darrick J. Wong
2013-10-18 18:37 ` Darrick J. Wong
2013-11-25 8:18 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 10/25] debugfs: handle 64bit block numbers Darrick J. Wong
2013-10-18 18:47 ` Darrick J. Wong
2013-11-25 8:33 ` Zheng Liu
2013-11-25 17:49 ` Darrick J. Wong
2013-10-18 4:50 ` [PATCH 11/25] libext2fs: only punch complete clusters Darrick J. Wong
2013-10-18 18:55 ` Darrick J. Wong
2013-11-25 8:51 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 12/25] libext2fs: don't update the summary counts when doing implied cluster allocation Darrick J. Wong
2013-11-25 9:03 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 13/25] libext2fs: use ext2fs_punch() to truncate quota file Darrick J. Wong
2013-11-25 9:08 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 14/25] e2fsck: only release clusters when shortening a directory during a rehash Darrick J. Wong
2013-11-25 11:09 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 15/25] e2fsck: print cluster ranges when encountering bitmap errors Darrick J. Wong
2013-11-25 11:56 ` Zheng Liu
2013-10-18 4:50 ` [PATCH 16/25] resize2fs: convert fs to and from 64bit mode Darrick J. Wong
2013-10-18 18:59 ` Darrick J. Wong
2013-11-26 6:44 ` Zheng Liu
2013-11-26 18:39 ` Darrick J. Wong
2013-11-27 2:21 ` Zheng Liu
2013-10-18 4:50 ` Darrick J. Wong [this message]
2013-10-18 4:50 ` [PATCH 18/25] resize2fs: adjust reserved_gdt_blocks when changing group descriptor size Darrick J. Wong
2013-10-18 4:51 ` [PATCH 19/25] resize2fs: during shrink, don't free in-use bg data clusters Darrick J. Wong
2013-10-18 4:51 ` [PATCH 20/25] resize2fs: don't free in-use clusters when moving blocks Darrick J. Wong
2013-10-18 4:51 ` [PATCH 21/25] misc: use the checksum predicate function, not raw flag tests Darrick J. Wong
2013-10-18 4:51 ` [PATCH 22/25] resize2fs: rewrite extent/dir/ea block checksums when migrating Darrick J. Wong
2013-10-18 4:51 ` [PATCH 23/25] libext2fs: support modifying arbitrary extended attributes Darrick J. Wong
2013-10-18 19:25 ` Darrick J. Wong
2013-10-22 1:13 ` Darrick J. Wong
2013-11-26 7:21 ` Zheng Liu
2013-11-26 19:55 ` Darrick J. Wong
2013-11-27 2:52 ` Zheng Liu
2013-11-27 3:13 ` Darrick J. Wong
2013-11-27 11:36 ` Zheng Liu
2013-11-27 1:56 ` Darrick J. Wong
2013-11-29 5:30 ` Zheng Liu
2013-11-29 8:17 ` Jan Kara
2013-11-30 20:24 ` Darrick J. Wong
2013-12-02 8:38 ` Jan Kara
2013-10-18 4:51 ` [PATCH 24/25] misc: add fuse2fs, a FUSE server for e2fsprogs Darrick J. Wong
2013-10-18 19:36 ` Darrick J. Wong
2013-10-22 1:20 ` Darrick J. Wong
2013-10-18 13:13 ` [PATCH v2 00/25] e2fsprogs patchbomb 10/2013 Lukáš Czerner
2013-10-18 18:13 ` Darrick J. Wong
2013-10-18 20:37 ` Darrick J. Wong
2013-10-18 18:39 ` Theodore Ts'o
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131018045050.7339.79597.stgit@birch.djwong.org \
--to=darrick.wong@oracle.com \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).