Re: E2fsprogs master branch now has all 64-bit patch applied

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Ted,

  I try to :
1. force to enable 64bits feature even the size <16TB
2. fix the "block_bmap" overflow issue when resizing.

It seems OK when resize to >16TB .
(the content of the test file is correct).
But after it grown up, it will get error when do fsck.

My modification is as the following:

lib/ext2fs/openfs.c
@@ -109,6 +109,8 @@ errcode_t ext2fs_open2(const char *name, const
char *io_options,
        memset(fs, 0, sizeof(struct struct_ext2_filsys));
        fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS;
        fs->flags = flags;
+       fs->flags |= EXT2_FLAG_64BITS;
        /* don't overwrite sb backups unless flag is explicitly cleared */
        fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
        fs->umask = 022;

misc/mke2fs.c
@@ -1530,6 +1531,8 @@ static void PRS(int argc, char *argv[])
                        EXT2_BLOCK_SIZE(&fs_param));
                exit(1);
        }
+       fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;

        ext2fs_blocks_count_set(&fs_param, fs_blocks_count);


resize/resize2fs.c
index 064c4c4..e28f5f2 100644
--- a/resize/resize2fs.c
+++ b/resize/resize2fs.c
@@ -294,7 +294,8 @@ errcode_t adjust_fs_info(ext2_filsys fs, ext2_filsys old_fs,
        blk64_t         overhead = 0;
        blk64_t         rem;
        blk64_t         blk, group_block;
-       ext2_ino_t      real_end;
+       __u64           real_end;
        blk64_t         adj, old_numblocks, numblocks, adjblocks;
        unsigned long   i, j, old_desc_blocks, max_group;
        unsigned int    meta_bg, meta_bg_size;
@@ -381,9 +382,9 @@ retry:
                                            fs->inode_map);
        if (retval) goto errout;

-       real_end = ((EXT2_BLOCKS_PER_GROUP(fs->super)
-                    * fs->group_desc_count)) - 1 +
-                            fs->super->s_first_data_block;
+       real_end = ((__u64)(EXT2_BLOCKS_PER_GROUP(fs->super)
+                    * (__u64)fs->group_desc_count)) - 1ULL +
+                            (__u64)fs->super->s_first_data_block;
        retval = ext2fs_resize_block_bitmap2(ext2fs_blocks_count(fs->super)-1,
                                            real_end, fs->block_map);

@@ -585,6 +586,8 @@ static errcode_t adjust_superblock(ext2_resize_t
rfs, blk64_t new_size)
        if (retval)
                return retval;

+       fs->super->s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
        retval = adjust_fs_info(fs, rfs->old_fs, rfs->reserve_blocks, new_size);
        if (retval)
                goto errout;

My test case:
1. build a linear raid (1 x 2TB disk)
2. mkfs.ext4, mount it and"echo 123 > test" to
touch a test file.
3.  grown the linear raid to >16TB (9 x 2TB + 1 x 1.5TB)
4. do resize ( resize -fpF /dev/md2 )
After resizing, the content of the test file is correct.

But "fsck -nyv" will get the following error:

e2fsck 1.41.12 (17-May-2010)
###open|= EXT2_FLAG_64BITS
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences:  +(244154882--244187135) +(244187650--244188163)
Fix? no
/dev/md2: ********** WARNING: Filesystem still has errors **********
      12 inodes used (0.00%)
       0 non-contiguous files (0.0%)
       0 non-contiguous directories (0.0%)
         # of inodes with ind/dind/tind blocks: 0/0/0
         Extent depth histogram: 2
74638645 blocks used (1.57%)
       0 bad blocks
       0 large files
       1 regular file
       2 directories
       0 character device files
       0 block device files
       0 fifos
       0 links
       0 symbolic links (0 fast symbolic links)
       0 sockets
--------
       3 files


I think maybe I should modify "ext2_ino_t" type from
"__u32" to "__u64".
Maybe this modification will fix many overflow issue.

Do you have any idea of this fsck error or any opinions of this approach?

Thanks

                                                                -HsuanTing



2010/6/22 Hsuan-Ting <acht93@xxxxxxxxxxxxx>:
> 2010/6/22 <tytso@xxxxxxx>
>>
>> On Mon, Jun 21, 2010 at 09:44:31PM +0800, Hsuan-Ting wrote:
>> > Hi Ted,
>> >
>> >    Resize seems not work when the size is bigger than 16TB (offline resize).
>> >
>> > My test machine:
>> > x64 platform 2.6.32 kernel + this newest patch
>> >
>> > 1. <16TB ext4 enlarge to >16TB (offline)
>> >     a. I use "8 x 2TB WD disks" and "mdadm" build linear raid
>> >     b. then use mkfs.ext4 to make ext4 file system
>> >     c. grow the linear raid to "10 X 2TB"
>> >     d. finally it grow to "2.X TB" smaller than before
>>
>> This doesn't surprise me.  We should add some checks to simply not
>> allow the file system growing greater than 16TB if the 64-bit feature
>> is not set for now.  Making this work is going to be tricky, because
>> enabling the 64-bit feature doubles the size of the block group
>> descriptors, which means we have to make room for them.  This could
>> involve moving files out of the way, as well as moving the inode
>> table.
>>
>> This means that we may want to enable the 64-bit feature flag if there
>> is an expectation that the filesystem might be grown to a size large
>> enough where this would be an issue.
>
> Sounds like I must enable 64-bit feature when mkfs.
> Then it will work, right?
>
> But base on my test, it will occur core dump when resize:
> (gdb) bt
> #0  0x00000000004160bf in ext2fs_test_bit64 ()
> #1  0x0000000000416318 in ba_test_bmap ()
> #2  0x0000000000410629 in ext2fs_test_generic_bmap ()
> #3  0x0000000000410656 in ext2fs_test_block_bitmap_range2 ()
> #4  0x000000000040873d in ext2fs_get_free_blocks2 ()
> #5  0x000000000040936d in ext2fs_allocate_group_table ()
> #6  0x0000000000404456 in adjust_fs_info ()
> #7  0x0000000000404a81 in resize_fs ()
> #8  0x00000000004069c7 in main ()
>
> I do the following modification
> (to enable "EXT4_FEATURE_INCOMPAT_64BIT" and "EXT2_FLAG_64BITS"):
>
> misc/mke2fs.c :
> @@ -1530,6 +1945,8 @@ static void PRS(int argc, char *argv[])
>                        EXT2_BLOCK_SIZE(&fs_param));
>                exit(1);
>        }
> +       fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
>
>        ext2fs_blocks_count_set(&fs_param, fs_blocks_count);
>
>
> resize/resize2fs.c :
> @@ -585,6 +598,9 @@ static errcode_t adjust_superblock(ext2_resize_t
> rfs, blk64_t new_size)
>        if (retval)
>                return retval;
>
> +       fs->super->s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
>        retval = adjust_fs_info(fs, rfs->old_fs, rfs->reserve_blocks, new_size);
>
>
> lib/ext2fs/openfs.c :
> @@ -109,6 +109,8 @@ errcode_t ext2fs_open2(const char *name, const
> char *io_options,
>        memset(fs, 0, sizeof(struct struct_ext2_filsys));
>        fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS;
>        fs->flags = flags;
> +       fs->flags |= EXT2_FLAG_64BITS;
>
>
> Did I mistake something?
>
>>
>> > 2. >16TB offline resize, the steps is similiar as before.
>> >    a. I use "9 x 2TB WD disks" build linear raid
>> >    b. mkfs.ext4 and not mount
>> >    c. grow the linear raid to "10 X 2TB"
>> >    d. do resize
>> >    e. finally it grow to "2.X TB" smaller than before
>> >
>> > I try to on "EXT4_FEATURE_INCOMPAT_64BIT" and "EXT2_FLAG_64BITS"
>> > when mkfs and resize.
>> > And modify ext2fs_div_ceil code to ext2fs_div64_ceil.
>> > It seems work something, the fs size isn't grow but also not deduce,
>> > remain the same.
>>
>> I'm not sure I understand that last sentence; it's not parsing as an
>> understandable English sentence, sorry.  Are you saying that both
>> attempts to grow and shrink the filesystem is failing?  If so, how?
>> Are you getting an error message?  Is it appearing to succeed but the
>> file system size isn't changing?
>
>  Sorry for my poor English. The last sentence means "succeed but the
> file system size isn't changing".
> I also remove "flex_bg" feature in this case.
>
> Thanks.
>
>                                                              -HsuanTing
>
>>
>> Thanks for the bug report,
>>
>>                                        - Ted
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux