]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: fix rb_resize_bmap to handle the padding bits
authorTheodore Ts'o <tytso@mit.edu>
Sat, 26 Jul 2014 04:45:28 +0000 (00:45 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 26 Jul 2014 04:48:29 +0000 (00:48 -0400)
The bits between end and real_end are set as a safety measure for the
kernel when it uses the bit scan instructions.  We need to take this
into account when shrinking or growing the block allocation bitmap,
before we can safely use rbtree bitmaps in resize2fs.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/blkmap64_rb.c

index a1dde6db8be44b0350df1ac03bde216312f56ea4..fdbd330e8653255454fa3cf53ac7d03f2888e94c 100644 (file)
@@ -299,21 +299,19 @@ static errcode_t rb_resize_bmap(ext2fs_generic_bitmap bmap,
 {
        struct ext2fs_rb_private *bp;
 
-       if (new_real_end >= bmap->real_end) {
-               bmap->end = new_end;
-               bmap->real_end = new_real_end;
-               return 0;
-       }
-
        bp = (struct ext2fs_rb_private *) bmap->private;
        bp->rcursor = NULL;
        bp->wcursor = NULL;
 
-       /* truncate tree to new_real_end size */
-       rb_truncate(new_real_end, &bp->root);
+       rb_truncate(((new_end < bmap->end) ? new_end : bmap->end) - bmap->start,
+                   &bp->root);
 
        bmap->end = new_end;
        bmap->real_end = new_real_end;
+
+       if (bmap->end < bmap->real_end)
+               rb_insert_extent(bmap->end + 1 - bmap->start,
+                                bmap->real_end - bmap->end, bp);
        return 0;
 
 }