Commit 4f868703f6f2: "libext2fs: use fallocate for creating journals and hugefiles" introduced a regression for the mke2fs hugefile feature. The problem is that the fallocate library function intersperses the extent tree metadata blocks with the data blocks, and this violates the hugefile guarantee that the created files should be physically contiguous on disk. Unfortuantely the m_hugefile regression test was flawed, and didn't pick up the regression. This commit fixes the regression test so that it detects the problem before fixing mke2fs, and also fixes the mke2fs hugefile by reverting the mke2fs hugefile portion of commit 4f868703f6f2. Signed-off-by: Theodore Ts'o <tytso@xxxxxxx> --- misc/mk_hugefiles.c | 99 +++++++++++++++++++++++++++++++++++------ tests/m_hugefile/expect | 114 ++++++++++++++++++++++++++++++++++++++++-------- tests/m_hugefile/script | 4 +- 3 files changed, 185 insertions(+), 32 deletions(-) diff --git a/misc/mk_hugefiles.c b/misc/mk_hugefiles.c index 5882394d..ec4e0470 100644 --- a/misc/mk_hugefiles.c +++ b/misc/mk_hugefiles.c @@ -262,8 +262,12 @@ static errcode_t mk_hugefile(ext2_filsys fs, blk64_t num, { errcode_t retval; + blk64_t lblk, bend = 0; + __u64 size; + blk64_t left; + blk64_t count = 0; struct ext2_inode inode; - int falloc_flags; + ext2_extent_handle_t handle; retval = ext2fs_new_inode(fs, 0, LINUX_S_IFREG, NULL, ino); if (retval) @@ -283,20 +287,85 @@ static errcode_t mk_hugefile(ext2_filsys fs, blk64_t num, ext2fs_inode_alloc_stats2(fs, *ino, +1, 0); - if (ext2fs_has_feature_extents(fs->super)) - inode.i_flags |= EXT4_EXTENTS_FL; - - falloc_flags = EXT2_FALLOCATE_FORCE_INIT; - if (zero_hugefile) - falloc_flags |= EXT2_FALLOCATE_ZERO_BLOCKS; - retval = ext2fs_fallocate(fs, falloc_flags, *ino, &inode, goal, 0, num); + retval = ext2fs_extent_open2(fs, *ino, &inode, &handle); if (retval) return retval; - retval = ext2fs_inode_size_set(fs, &inode, num * fs->blocksize); + + lblk = 0; + left = num ? num : 1; + while (left) { + blk64_t pblk, end; + blk64_t n = left; + + retval = ext2fs_find_first_zero_block_bitmap2(fs->block_map, + goal, ext2fs_blocks_count(fs->super) - 1, &end); + if (retval) + goto errout; + goal = end; + + retval = ext2fs_find_first_set_block_bitmap2(fs->block_map, goal, + ext2fs_blocks_count(fs->super) - 1, &bend); + if (retval == ENOENT) { + bend = ext2fs_blocks_count(fs->super); + if (num == 0) + left = 0; + } + if (!num || bend - goal < left) + n = bend - goal; + pblk = goal; + if (num) + left -= n; + goal += n; + count += n; + ext2fs_block_alloc_stats_range(fs, pblk, n, +1); + + if (zero_hugefile) { + blk64_t ret_blk; + retval = ext2fs_zero_blocks2(fs, pblk, n, + &ret_blk, NULL); + + if (retval) + com_err(program_name, retval, + _("while zeroing block %llu " + "for hugefile"), ret_blk); + } + + while (n) { + blk64_t l = n; + struct ext2fs_extent newextent; + + if (l > EXT_INIT_MAX_LEN) + l = EXT_INIT_MAX_LEN; + + newextent.e_len = l; + newextent.e_pblk = pblk; + newextent.e_lblk = lblk; + newextent.e_flags = 0; + + retval = ext2fs_extent_insert(handle, + EXT2_EXTENT_INSERT_AFTER, &newextent); + if (retval) + return retval; + pblk += l; + lblk += l; + n -= l; + } + } + + retval = ext2fs_read_inode(fs, *ino, &inode); if (retval) - return retval; + goto errout; + + retval = ext2fs_iblk_add_blocks(fs, &inode, + count / EXT2FS_CLUSTER_RATIO(fs)); + if (retval) + goto errout; + size = (__u64) count * fs->blocksize; + retval = ext2fs_inode_size_set(fs, &inode, size); + if (retval) + goto errout; - retval = ext2fs_write_inode(fs, *ino, &inode); + retval = ext2fs_write_new_inode(fs, *ino, &inode); if (retval) goto errout; @@ -314,7 +383,13 @@ retry: goto retry; } + if (retval) + goto errout; + errout: + if (handle) + ext2fs_extent_free(handle); + return retval; } @@ -499,8 +574,6 @@ errcode_t mk_hugefiles(ext2_filsys fs, const char *device_name) printf(_("with %llu blocks each"), num_blocks); fputs(": ", stdout); } - if (num_blocks == 0) - num_blocks = ext2fs_blocks_count(fs->super) - goal; for (i=0; i < num_files; i++) { ext2_ino_t ino; diff --git a/tests/m_hugefile/expect b/tests/m_hugefile/expect index 82a60319..aee63f90 100644 --- a/tests/m_hugefile/expect +++ b/tests/m_hugefile/expect @@ -14,23 +14,103 @@ Pass 4: Checking reference counts Pass 5: Checking group summary information Exit status is 0 -debugfs -R "extents /store/big-data" test.img | head +debugfs -R "extents /store/big-data" test.img Level Entries Logical Physical Length Flags 0/ 2 1/ 1 0 - 1073610751 131070 1073610752 1/ 2 1/ 97 0 - 11108351 131071 11108352 - 2/ 2 1/339 0 - 32767 131072 - 163839 32768 - 2/ 2 2/339 32768 - 65535 163840 - 196607 32768 - 2/ 2 3/339 65536 - 98303 196608 - 229375 32768 - 2/ 2 4/339 98304 - 131071 229376 - 262143 32768 - 2/ 2 5/339 131072 - 163839 262144 - 294911 32768 - 2/ 2 6/339 163840 - 196607 294912 - 327679 32768 - 2/ 2 7/339 196608 - 229375 327680 - 360447 32768 - 2/ 2 8/339 229376 - 262143 360448 - 393215 32768 - 2/ 2 9/339 262144 - 294911 393216 - 425983 32768 - 2/ 2 10/339 294912 - 327679 425984 - 458751 32768 - 2/ 2 11/339 327680 - 360447 458752 - 491519 32768 - 2/ 2 12/339 360448 - 393215 491520 - 524287 32768 - 2/ 2 13/339 393216 - 425983 524288 - 557055 32768 - 2/ 2 14/339 425984 - 458751 557056 - 589823 32768 - 2/ 2 15/339 458752 - 491519 589824 - 622591 32768 - 2/ 2 16/339 491520 - 524287 622592 - 655359 32768 + 1/ 2 2/ 97 11108352 - 22216703 98567 11108352 + 1/ 2 3/ 97 22216704 - 33325055 98568 11108352 + 1/ 2 4/ 97 33325056 - 44433407 98569 11108352 + 1/ 2 5/ 97 44433408 - 55541759 98570 11108352 + 1/ 2 6/ 97 55541760 - 66650111 98571 11108352 + 1/ 2 7/ 97 66650112 - 77758463 98572 11108352 + 1/ 2 8/ 97 77758464 - 88866815 98573 11108352 + 1/ 2 9/ 97 88866816 - 99975167 98574 11108352 + 1/ 2 10/ 97 99975168 - 111083519 98575 11108352 + 1/ 2 11/ 97 111083520 - 122191871 98576 11108352 + 1/ 2 12/ 97 122191872 - 133300223 98577 11108352 + 1/ 2 13/ 97 133300224 - 144408575 98578 11108352 + 1/ 2 14/ 97 144408576 - 155516927 98579 11108352 + 1/ 2 15/ 97 155516928 - 166625279 98580 11108352 + 1/ 2 16/ 97 166625280 - 177733631 98581 11108352 + 1/ 2 17/ 97 177733632 - 188841983 98582 11108352 + 1/ 2 18/ 97 188841984 - 199950335 98583 11108352 + 1/ 2 19/ 97 199950336 - 211058687 98584 11108352 + 1/ 2 20/ 97 211058688 - 222167039 98585 11108352 + 1/ 2 21/ 97 222167040 - 233275391 98586 11108352 + 1/ 2 22/ 97 233275392 - 244383743 98587 11108352 + 1/ 2 23/ 97 244383744 - 255492095 98588 11108352 + 1/ 2 24/ 97 255492096 - 266600447 98589 11108352 + 1/ 2 25/ 97 266600448 - 277708799 98590 11108352 + 1/ 2 26/ 97 277708800 - 288817151 98591 11108352 + 1/ 2 27/ 97 288817152 - 299925503 98592 11108352 + 1/ 2 28/ 97 299925504 - 311033855 98593 11108352 + 1/ 2 29/ 97 311033856 - 322142207 98594 11108352 + 1/ 2 30/ 97 322142208 - 333250559 98595 11108352 + 1/ 2 31/ 97 333250560 - 344358911 98596 11108352 + 1/ 2 32/ 97 344358912 - 355467263 98597 11108352 + 1/ 2 33/ 97 355467264 - 366575615 98598 11108352 + 1/ 2 34/ 97 366575616 - 377683967 98599 11108352 + 1/ 2 35/ 97 377683968 - 388792319 98600 11108352 + 1/ 2 36/ 97 388792320 - 399900671 98601 11108352 + 1/ 2 37/ 97 399900672 - 411009023 98602 11108352 + 1/ 2 38/ 97 411009024 - 422117375 98603 11108352 + 1/ 2 39/ 97 422117376 - 433225727 98604 11108352 + 1/ 2 40/ 97 433225728 - 444334079 98605 11108352 + 1/ 2 41/ 97 444334080 - 455442431 98606 11108352 + 1/ 2 42/ 97 455442432 - 466550783 98607 11108352 + 1/ 2 43/ 97 466550784 - 477659135 98608 11108352 + 1/ 2 44/ 97 477659136 - 488767487 98609 11108352 + 1/ 2 45/ 97 488767488 - 499875839 98610 11108352 + 1/ 2 46/ 97 499875840 - 510984191 98611 11108352 + 1/ 2 47/ 97 510984192 - 522092543 98612 11108352 + 1/ 2 48/ 97 522092544 - 533200895 98613 11108352 + 1/ 2 49/ 97 533200896 - 544309247 98614 11108352 + 1/ 2 50/ 97 544309248 - 555417599 98615 11108352 + 1/ 2 51/ 97 555417600 - 566525951 98616 11108352 + 1/ 2 52/ 97 566525952 - 577634303 98617 11108352 + 1/ 2 53/ 97 577634304 - 588742655 98618 11108352 + 1/ 2 54/ 97 588742656 - 599851007 98619 11108352 + 1/ 2 55/ 97 599851008 - 610959359 98620 11108352 + 1/ 2 56/ 97 610959360 - 622067711 98621 11108352 + 1/ 2 57/ 97 622067712 - 633176063 98622 11108352 + 1/ 2 58/ 97 633176064 - 644284415 98623 11108352 + 1/ 2 59/ 97 644284416 - 655392767 98624 11108352 + 1/ 2 60/ 97 655392768 - 666501119 98625 11108352 + 1/ 2 61/ 97 666501120 - 677609471 98626 11108352 + 1/ 2 62/ 97 677609472 - 688717823 98627 11108352 + 1/ 2 63/ 97 688717824 - 699826175 98628 11108352 + 1/ 2 64/ 97 699826176 - 710934527 98629 11108352 + 1/ 2 65/ 97 710934528 - 722042879 98630 11108352 + 1/ 2 66/ 97 722042880 - 733151231 98631 11108352 + 1/ 2 67/ 97 733151232 - 744259583 98632 11108352 + 1/ 2 68/ 97 744259584 - 755367935 98633 11108352 + 1/ 2 69/ 97 755367936 - 766476287 98634 11108352 + 1/ 2 70/ 97 766476288 - 777584639 98635 11108352 + 1/ 2 71/ 97 777584640 - 788692991 98636 11108352 + 1/ 2 72/ 97 788692992 - 799801343 98637 11108352 + 1/ 2 73/ 97 799801344 - 810909695 98638 11108352 + 1/ 2 74/ 97 810909696 - 822018047 98639 11108352 + 1/ 2 75/ 97 822018048 - 833126399 98640 11108352 + 1/ 2 76/ 97 833126400 - 844234751 98641 11108352 + 1/ 2 77/ 97 844234752 - 855343103 98642 11108352 + 1/ 2 78/ 97 855343104 - 866451455 98643 11108352 + 1/ 2 79/ 97 866451456 - 877559807 98644 11108352 + 1/ 2 80/ 97 877559808 - 888668159 98645 11108352 + 1/ 2 81/ 97 888668160 - 899776511 98646 11108352 + 1/ 2 82/ 97 899776512 - 910884863 98647 11108352 + 1/ 2 83/ 97 910884864 - 921993215 98648 11108352 + 1/ 2 84/ 97 921993216 - 933101567 98649 11108352 + 1/ 2 85/ 97 933101568 - 944209919 98650 11108352 + 1/ 2 86/ 97 944209920 - 955318271 98651 11108352 + 1/ 2 87/ 97 955318272 - 966426623 98652 11108352 + 1/ 2 88/ 97 966426624 - 977534975 98653 11108352 + 1/ 2 89/ 97 977534976 - 988643327 98654 11108352 + 1/ 2 90/ 97 988643328 - 999751679 98655 11108352 + 1/ 2 91/ 97 999751680 - 1010860031 98656 11108352 + 1/ 2 92/ 97 1010860032 - 1021968383 98657 11108352 + 1/ 2 93/ 97 1021968384 - 1033076735 98658 11108352 + 1/ 2 94/ 97 1033076736 - 1044185087 98659 11108352 + 1/ 2 95/ 97 1044185088 - 1055293439 98660 11108352 + 1/ 2 96/ 97 1055293440 - 1066401791 98661 11108352 + 1/ 2 97/ 97 1066401792 - 1073610751 98662 7208960 diff --git a/tests/m_hugefile/script b/tests/m_hugefile/script index 2750d538..317deabf 100644 --- a/tests/m_hugefile/script +++ b/tests/m_hugefile/script @@ -44,9 +44,9 @@ $FSCK $FSCK_OPT -N test_filesys $TMPFILE >> $OUT 2>&1 status=$? echo Exit status is $status >> $OUT -echo 'debugfs -R "extents /store/big-data" test.img | head' >> $OUT +echo 'debugfs -R "extents /store/big-data" test.img' >> $OUT -$DEBUGFS -R "extents /store/big-data" $TMPFILE 2>&1 | head -n 20 >> $OUT 2>&1 +$DEBUGFS -R "extents -n /store/big-data" $TMPFILE 2>&1 >> $OUT 2>&1 rm $TMPFILE -- 2.11.0.rc0.7.gbe5a750