From 2f8c0d028cd8e3b24aaa357a796478c3435e21e4 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Wed, 10 Jun 2015 20:01:24 -0400 Subject: [PATCH] debugfs: implement fallocate Implement a fallocate function for debugfs, and add some tests to demonstrate that it works (more or less). Signed-off-by: Darrick J. Wong Signed-off-by: Theodore Ts'o --- debugfs/debug_cmds.ct | 3 + debugfs/debugfs.8.in | 7 ++ debugfs/debugfs.c | 36 ++++++ debugfs/debugfs.h | 1 + tests/d_fallocate/expect.gz | Bin 0 -> 3770 bytes tests/d_fallocate/name | 1 + tests/d_fallocate/script | 175 ++++++++++++++++++++++++++ tests/d_fallocate_bigalloc/expect.gz | Bin 0 -> 2673 bytes tests/d_fallocate_bigalloc/name | 1 + tests/d_fallocate_bigalloc/script | 176 +++++++++++++++++++++++++++ tests/d_fallocate_blkmap/expect | 58 +++++++++ tests/d_fallocate_blkmap/name | 1 + tests/d_fallocate_blkmap/script | 85 +++++++++++++ 13 files changed, 544 insertions(+) create mode 100644 tests/d_fallocate/expect.gz create mode 100644 tests/d_fallocate/name create mode 100644 tests/d_fallocate/script create mode 100644 tests/d_fallocate_bigalloc/expect.gz create mode 100644 tests/d_fallocate_bigalloc/name create mode 100644 tests/d_fallocate_bigalloc/script create mode 100644 tests/d_fallocate_blkmap/expect create mode 100644 tests/d_fallocate_blkmap/name create mode 100644 tests/d_fallocate_blkmap/script diff --git a/debugfs/debug_cmds.ct b/debugfs/debug_cmds.ct index c6f6d6c3a..34dad9e6f 100644 --- a/debugfs/debug_cmds.ct +++ b/debugfs/debug_cmds.ct @@ -157,6 +157,9 @@ request do_dirsearch, "Search a directory for a particular filename", request do_bmap, "Calculate the logical->physical block mapping for an inode", bmap; +request do_fallocate, "Allocate uninitialized blocks to an inode", + fallocate; + request do_punch, "Punch (or truncate) blocks from an inode by deallocating them", punch, truncate; diff --git a/debugfs/debugfs.8.in b/debugfs/debugfs.8.in index 9a09cbf4c..a463c73a1 100644 --- a/debugfs/debugfs.8.in +++ b/debugfs/debugfs.8.in @@ -306,6 +306,13 @@ from the file \fIfilespec\fR. Expand the directory .IR filespec . .TP +.BI fallocate " filespec start_block [end_block] +Allocate and map uninitialized blocks into \fIfilespec\fR between +logical block \fIstart_block\fR and \fIend_block\fR, inclusive. If +\fIend_block\fR is not supplied, this function maps until it runs out +of free disk blocks or the maximum file size is reached. Existing +mappings are left alone. +.TP .BI feature " [fs_feature] [-fs_feature] ..." Set or clear various filesystem features in the superblock. After setting or clearing any filesystem features that were requested, print the current diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index c677f5fbd..40ec05f63 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -2195,6 +2195,42 @@ void do_punch(int argc, char *argv[]) return; } } + +void do_fallocate(int argc, char *argv[]) +{ + ext2_ino_t ino; + blk64_t start, end; + int err; + errcode_t errcode; + + if (common_args_process(argc, argv, 3, 4, argv[0], + " start_blk [end_blk]", + CHECK_FS_RW | CHECK_FS_BITMAPS)) + return; + + ino = string_to_inode(argv[1]); + if (!ino) + return; + err = strtoblk(argv[0], argv[2], "logical block", &start); + if (err) + return; + if (argc == 4) { + err = strtoblk(argv[0], argv[3], "logical block", &end); + if (err) + return; + } else + end = ~0; + + errcode = ext2fs_fallocate(current_fs, EXT2_FALLOCATE_INIT_BEYOND_EOF, + ino, NULL, ~0ULL, start, end - start + 1); + + if (errcode) { + com_err(argv[0], errcode, + "while fallocating inode %u from %llu to %llu\n", ino, + (unsigned long long) start, (unsigned long long) end); + return; + } +} #endif /* READ_ONLY */ void do_symlink(int argc, char *argv[]) diff --git a/debugfs/debugfs.h b/debugfs/debugfs.h index e163d0a3b..76bb22c28 100644 --- a/debugfs/debugfs.h +++ b/debugfs/debugfs.h @@ -166,6 +166,7 @@ extern void do_imap(int argc, char **argv); extern void do_set_current_time(int argc, char **argv); extern void do_supported_features(int argc, char **argv); extern void do_punch(int argc, char **argv); +extern void do_fallocate(int argc, char **argv); extern void do_symlink(int argc, char **argv); extern void do_dump_mmp(int argc, char **argv); diff --git a/tests/d_fallocate/expect.gz b/tests/d_fallocate/expect.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e6ffc38595b7c451e3de0df3a16f795cf33421b GIT binary patch literal 3770 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 $EXP +else + EXP=$test_dir/expect +fi + +cp /dev/null $OUT + +cat > $TMPFILE.conf << ENDL +[fs_types] +ext4 = { + base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr,^has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit + blocksize = 1024 + inode_size = 256 + inode_ratio = 16384 +} +ENDL +MKE2FS_CONFIG=$TMPFILE.conf $MKE2FS -F -o Linux -b 1024 -O ^bigalloc -T ext4 $TMPFILE 65536 2>&1 | sed -f $cmd_dir/filter.sed >> $OUT 2>&1 +rm -rf $TMPFILE.conf + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +echo "debugfs write files" >> $OUT +make_file() { + name="$1" + start="$2" + flag="$3" + + cat << ENDL +write /dev/null $name +sif /$name size 40960 +eo /$name +set_bmap $flag 10 $((start + 10)) +set_bmap $flag 13 $((start + 13)) +set_bmap $flag 26 $((start + 26)) +set_bmap $flag 29 $((start + 29)) +ec +sif /$name blocks 8 +setb $((start + 10)) +setb $((start + 13)) +setb $((start + 26)) +setb $((start + 29)) +ENDL +} + +#Files we create: +# a: fallocate a 40k file +# b*: falloc sparse file starting at b* +# c*: falloc spare file ending at c* +# d: midcluster to midcluster, surrounding sparse +# e: partial middle cluster alloc +# f: one big file +# g*: falloc sparse init file starting at g* +# h*: falloc sparse init file ending at h* +# i: midcluster to midcluster, surrounding sparse init +# j: partial middle cluster alloc +# k: one big init file +base=5000 +cat > $TMPFILE.cmd << ENDL +write /dev/null a +sif /a size 40960 +fallocate /a 0 39 +ENDL +echo "ex /a" >> $TMPFILE.cmd2 + +make_file sample $base --uninit >> $TMPFILE.cmd +echo "ex /sample" >> $TMPFILE.cmd2 +base=10000 + +for i in 8 9 10 11 12 13 14 15; do + make_file b$i $(($base + (40 * ($i - 8)))) --uninit >> $TMPFILE.cmd + echo "fallocate /b$i $i 39" >> $TMPFILE.cmd + echo "ex /b$i" >> $TMPFILE.cmd2 +done + +for i in 24 25 26 27 28 29 30 31; do + make_file c$i $(($base + 320 + (40 * ($i - 24)))) --uninit >> $TMPFILE.cmd + echo "fallocate /c$i 0 $i" >> $TMPFILE.cmd + echo "ex /c$i" >> $TMPFILE.cmd2 +done + +make_file d $(($base + 640)) --uninit >> $TMPFILE.cmd +echo "fallocate /d 4 35" >> $TMPFILE.cmd +echo "ex /d" >> $TMPFILE.cmd2 + +make_file e $(($base + 680)) --uninit >> $TMPFILE.cmd +echo "fallocate /e 19 20" >> $TMPFILE.cmd +echo "ex /e" >> $TMPFILE.cmd2 + +cat >> $TMPFILE.cmd << ENDL +write /dev/null f +sif /f size 1024 +eo /f +set_bmap --uninit 0 9000 +ec +sif /f blocks 2 +setb 9000 +fallocate /f 0 8999 +ENDL +echo "ex /f" >> $TMPFILE.cmd2 + +# Now do it again, but with initialized blocks +base=20000 +for i in 8 9 10 11 12 13 14 15; do + make_file g$i $(($base + (40 * ($i - 8)))) >> $TMPFILE.cmd + echo "fallocate /g$i $i 39" >> $TMPFILE.cmd + echo "ex /g$i" >> $TMPFILE.cmd2 +done + +for i in 24 25 26 27 28 29 30 31; do + make_file h$i $(($base + 320 + (40 * ($i - 24)))) >> $TMPFILE.cmd + echo "fallocate /h$i 0 $i" >> $TMPFILE.cmd + echo "ex /h$i" >> $TMPFILE.cmd2 +done + +make_file i $(($base + 640)) >> $TMPFILE.cmd +echo "fallocate /i 4 35" >> $TMPFILE.cmd +echo "ex /i" >> $TMPFILE.cmd2 + +make_file j $(($base + 680)) >> $TMPFILE.cmd +echo "fallocate /j 19 20" >> $TMPFILE.cmd +echo "ex /j" >> $TMPFILE.cmd2 + +cat >> $TMPFILE.cmd << ENDL +write /dev/null k +sif /k size 1024 +eo /k +set_bmap 0 19000 +ec +sif /k blocks 2 +setb 19000 +fallocate /k 0 8999 +sif /k size 9216000 +ENDL +echo "ex /k" >> $TMPFILE.cmd2 + +$DEBUGFS_EXE -w -f $TMPFILE.cmd $TMPFILE > /dev/null 2>&1 +$DEBUGFS_EXE -f $TMPFILE.cmd2 $TMPFILE >> $OUT.new 2>&1 +sed -f $cmd_dir/filter.sed < $OUT.new >> $OUT +rm -rf $OUT.new $TMPFILE.cmd $TMPFILE.cmd2 + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +rm -f $TMPFILE + +cmp -s $OUT $EXP +status=$? + +if [ "$status" = 0 ] ; then + echo "$test_name: $test_description: ok" + touch $test_name.ok +else + echo "$test_name: $test_description: failed" + diff $DIFF_OPTS $EXP $OUT > $test_name.failed + rm -f $test_name.tmp +fi + +unset IMAGE FSCK_OPT OUT EXP + +else #if test -x $DEBUGFS_EXE; then + echo "$test_name: $test_description: skipped" +fi diff --git a/tests/d_fallocate_bigalloc/expect.gz b/tests/d_fallocate_bigalloc/expect.gz new file mode 100644 index 0000000000000000000000000000000000000000..8640bc29dc71b09810f110d07d84d883b1109b88 GIT binary patch literal 2673 zc-jGR3Xb(3iwFQXkyum$1KnF)Z``;QeGTSU5GV@l7Fk=oGE7&&g$cOx2ZO_SK@G2ici(; z`r%=FEk2j)!}G2b)n4om)x(2$-rSTsaZ~b|Snts#l&azaaTF8JKz5b-akK;yWk3gyI5aeZ=W|9;&{j52&>hv>-}EHEAi7^ zd3}GpnEh+q^lNv{ef6LEeqC1zy53Z~^7^pdeXCX4JzqDH`A%xE)Ae?(pZ{=nE z&-Kg14^5-2a97qGNm(fOozBER>X)QCbVuK>ADBBi9b&^bu!)v#!4d&h~H}sy-EGqe&FFU8m&E!S(-?>{>tOX(l{xu^W$6aq#}8;o+p{5@gy@1TpCX@^E^p8!;@Tw zC#gJ7Ql;@E6?oE#JZbQx6M4dOFL{P1S|WQPeme6 z1$eSEJgH@PBI$Xe_}R|!LZ7?*k>o)|oFB2S3plo-beahww4 zI3bSHTpZ`$!;=gRoXo=Ui>%|-Rkmt+wg5gQ7J3W+qKDJmm}Vq`?y>@`Ra5C(KN_>kpnxK9bRl@PwJEX(xFq7UHP@Pd1S!Of;OB zVK6cbj?XY0PmBqpX(xHI%kadA|E$t@V#I$=%rF@7pLHTnh~qpH$5plvPl)537{?iL zoQp)B5XU(o!^m8J@YEVC8sSMU!;?WAH;HlFAdZ{F48tIfn}iHQy8fOgqhv4scX+xv zA4@u932%XE?V62b2~pf6<`)K0+$7`|?D~VH9QHXMWT{*xyD+KQg+X><60-|~pl>3w zi#90v@jN|w)_>Wi&1{|-;L^-&p0(pm2Eor~&n=oqq_DP|TL>A-Ax#HRy9JxMSkSca z4#j{Rz`4a{>3Z7ZVza|F?SLE&PWqm1;mNJOVpUO(ji+0jPxhJx26qzRiZL9wIR92P z`CW4o%$<_PaHhp60?w@hVJ?wo441b!cSlXzcrik3rBObMBM!WV_KJ}-XVxo)MKbHIxk<)wXIq+g}1Upe>M`}-^W zczID2gRlKqpb&m^XLPBAQ!opG~=$f8WAe5Bq_QffL@3%)N3JG&ZbSy%N5xwmB^s?db zx~G>M(94E;Y24vU)oM;JhF%=47eg0ga`VrG z&oRBS5TSfVVfk!MFblzKv|!c?)|T301@j?~!cyCeV7|y!w=z~RA0FvgmKzmJE+beo z@h1u9>v$B_@n!_`6}+a66-+7!rV|Cz5KKo4hIk=4S}=xSJR=w_B$!DMENcKc1bZnc z4hTk}U0{{X9QEr2u4|=V7{_RVP$jX4I_9C ziuN1?&q0ZvgWx$R+H(**2Ss}hg6E(a&mr|fg6UMj7=m%MU@#pNZ8`|1gAz>#!E{ix z=^&U6iZ&gDctLZfgBKEP+H~Zng28kIrQ42Rd2d;TP_(76XxkAi@0Du_p)Lv%)Q|Bea59Q3Gbh91)?=3T8zOn3cRmbc9wgD{9)T+$~cQuE$koswABEmTd?n z;ijEfwgE0o`xN=KuPr5qWU7+~gk4Vs#OWJ7EVP1=P-7|kfY7?>50f)qc7BojWu=Z# zcBZiGd@6UaMn@<(Q&@2B3(X4&olgpFPK7oQ+Dr+3n%^q}q4Qy(PeZq_W;gAy(5InW z!GMgeJq3YShl0Tz1@-UKK-?7!<|wFq_XRV{2&QGCV7^G+v}uBAEXZgXE0~5k(lS;s z4FfW|=r+T@U_eG!TL%Pl z_XKkk>4CW}<3(yy=SV%CNDp&!*ibTN*2xg-NgE`VRRxpN<7+vNb5Uepd43onn zCg)TzhRF#wCG-We%Lv9QQ80#CVM-H>VOChh3dS%itfB>jSz%5T3}%IOv|unDJZd^r zwvb?{rh{QRIMH-4Ob17s4uE*;9%vmD9{WN$i@ z3&F$alMQ>5*_(moFdUn`8CVX(vDuq} zv87A<{WBAPuh13R!3wym@^{QAzkPbqR| z-ilyP%m2milHcyivi?GC6vWa2x{GkWd6FK_heE8>wzrXoKeEji)_~mauzkB=c&CmYp f9)!C;rDnRY1HYwqzH#!$)N=J-JwLQM>OTMg)z2kH literal 0 Hc-jL100001 diff --git a/tests/d_fallocate_bigalloc/name b/tests/d_fallocate_bigalloc/name new file mode 100644 index 000000000..915645ce4 --- /dev/null +++ b/tests/d_fallocate_bigalloc/name @@ -0,0 +1 @@ +fallocate sparse files and big files with bigalloc diff --git a/tests/d_fallocate_bigalloc/script b/tests/d_fallocate_bigalloc/script new file mode 100644 index 000000000..6b6bf97c3 --- /dev/null +++ b/tests/d_fallocate_bigalloc/script @@ -0,0 +1,176 @@ +if test -x $DEBUGFS_EXE; then + +FSCK_OPT=-fy +OUT=$test_name.log +if [ -f $test_dir/expect.gz ]; then + EXP=$test_name.tmp + gunzip < $test_dir/expect.gz > $EXP +else + EXP=$test_dir/expect +fi + +cp /dev/null $OUT + +cat > $TMPFILE.conf << ENDL +[fs_types] +ext4 = { + cluster_size = 8192 + base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr,^has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit + blocksize = 1024 + inode_size = 256 + inode_ratio = 16384 +} +ENDL +MKE2FS_CONFIG=$TMPFILE.conf $MKE2FS -F -o Linux -b 1024 -O bigalloc -T ext4 $TMPFILE 65536 2>&1 | sed -f $cmd_dir/filter.sed >> $OUT 2>&1 +rm -rf $TMPFILE.conf + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +echo "debugfs write files" >> $OUT +make_file() { + name="$1" + start="$2" + flag="$3" + + cat << ENDL +write /dev/null $name +sif /$name size 40960 +eo /$name +set_bmap $flag 10 $((start + 10)) +set_bmap $flag 13 $((start + 13)) +set_bmap $flag 26 $((start + 26)) +set_bmap $flag 29 $((start + 29)) +ec +sif /$name blocks 32 +setb $((start + 10)) +setb $((start + 13)) +setb $((start + 26)) +setb $((start + 29)) +ENDL +} + +#Files we create: +# a: fallocate a 40k file +# b*: falloc sparse file starting at b* +# c*: falloc spare file ending at c* +# d: midcluster to midcluster, surrounding sparse +# e: partial middle cluster alloc +# f: one big file +# g*: falloc sparse init file starting at g* +# h*: falloc sparse init file ending at h* +# i: midcluster to midcluster, surrounding sparse init +# j: partial middle cluster alloc +# k: one big init file +base=5000 +cat > $TMPFILE.cmd << ENDL +write /dev/null a +sif /a size 40960 +fallocate /a 0 39 +ENDL +echo "ex /a" >> $TMPFILE.cmd2 + +make_file sample $base --uninit >> $TMPFILE.cmd +echo "ex /sample" >> $TMPFILE.cmd2 +base=10000 + +for i in 8 9 10 11 12 13 14 15; do + make_file b$i $(($base + (40 * ($i - 8)))) --uninit >> $TMPFILE.cmd + echo "fallocate /b$i $i 39" >> $TMPFILE.cmd + echo "ex /b$i" >> $TMPFILE.cmd2 +done + +for i in 24 25 26 27 28 29 30 31; do + make_file c$i $(($base + 320 + (40 * ($i - 24)))) --uninit >> $TMPFILE.cmd + echo "fallocate /c$i 0 $i" >> $TMPFILE.cmd + echo "ex /c$i" >> $TMPFILE.cmd2 +done + +make_file d $(($base + 640)) --uninit >> $TMPFILE.cmd +echo "fallocate /d 4 35" >> $TMPFILE.cmd +echo "ex /d" >> $TMPFILE.cmd2 + +make_file e $(($base + 680)) --uninit >> $TMPFILE.cmd +echo "fallocate /e 19 20" >> $TMPFILE.cmd +echo "ex /e" >> $TMPFILE.cmd2 + +cat >> $TMPFILE.cmd << ENDL +write /dev/null f +sif /f size 1024 +eo /f +set_bmap --uninit 0 9000 +ec +sif /f blocks 16 +setb 9000 +fallocate /f 0 8999 +ENDL +echo "ex /f" >> $TMPFILE.cmd2 + +# Now do it again, but with initialized blocks +base=20000 +for i in 8 9 10 11 12 13 14 15; do + make_file g$i $(($base + (40 * ($i - 8)))) >> $TMPFILE.cmd + echo "fallocate /g$i $i 39" >> $TMPFILE.cmd + echo "ex /g$i" >> $TMPFILE.cmd2 +done + +for i in 24 25 26 27 28 29 30 31; do + make_file h$i $(($base + 320 + (40 * ($i - 24)))) >> $TMPFILE.cmd + echo "fallocate /h$i 0 $i" >> $TMPFILE.cmd + echo "ex /h$i" >> $TMPFILE.cmd2 +done + +make_file i $(($base + 640)) >> $TMPFILE.cmd +echo "fallocate /i 4 35" >> $TMPFILE.cmd +echo "ex /i" >> $TMPFILE.cmd2 + +make_file j $(($base + 680)) >> $TMPFILE.cmd +echo "fallocate /j 19 20" >> $TMPFILE.cmd +echo "ex /j" >> $TMPFILE.cmd2 + +cat >> $TMPFILE.cmd << ENDL +write /dev/null k +sif /k size 1024 +eo /k +set_bmap 0 19000 +ec +sif /k blocks 16 +setb 19000 +fallocate /k 0 8999 +sif /k size 9216000 +ENDL +echo "ex /k" >> $TMPFILE.cmd2 + +$DEBUGFS_EXE -w -f $TMPFILE.cmd $TMPFILE > /dev/null 2>&1 +$DEBUGFS_EXE -f $TMPFILE.cmd2 $TMPFILE >> $OUT.new 2>&1 +sed -f $cmd_dir/filter.sed < $OUT.new >> $OUT +rm -rf $OUT.new $TMPFILE.cmd $TMPFILE.cmd2 + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +rm -f $TMPFILE + +cmp -s $OUT $EXP +status=$? + +if [ "$status" = 0 ] ; then + echo "$test_name: $test_description: ok" + touch $test_name.ok +else + echo "$test_name: $test_description: failed" + diff $DIFF_OPTS $EXP $OUT > $test_name.failed + rm -f $test_name.tmp +fi + +unset IMAGE FSCK_OPT OUT EXP + +else #if test -x $DEBUGFS_EXE; then + echo "$test_name: $test_description: skipped" +fi diff --git a/tests/d_fallocate_blkmap/expect b/tests/d_fallocate_blkmap/expect new file mode 100644 index 000000000..f7ae606b9 --- /dev/null +++ b/tests/d_fallocate_blkmap/expect @@ -0,0 +1,58 @@ +Creating filesystem with 65536 1k blocks and 4096 inodes +Superblock backups stored on blocks: + 8193, 24577, 40961, 57345 + +Allocating group tables: done +Writing inode tables: done +Writing superblocks and filesystem accounting information: done + +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 +test_filesys: 11/4096 files (0.0% non-contiguous), 2340/65536 blocks +Exit status is 0 +debugfs write files +debugfs: stat /a +Inode: 12 Type: regular Mode: 0666 Flags: 0x0 +Generation: 0 Version: 0x00000000:00000000 +User: 0 Group: 0 Size: 40960 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 82 +Fragment: Address: 0 Number: 0 Size: 0 +Size of extra inode fields: 28 +BLOCKS: +(0-1):1312-1313, (2-11):8000-8009, (IND):8010, (12-39):8011-8038 +TOTAL: 41 + +debugfs: stat /b +Inode: 13 Type: regular Mode: 0666 Flags: 0x0 +Generation: 0 Version: 0x00000000:00000000 +User: 0 Group: 0 Size: 10240000 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 20082 +Fragment: Address: 0 Number: 0 Size: 0 +Size of extra inode fields: 28 +BLOCKS: +(0-11):10000-10011, (IND):10012, (12-267):10013-10268, (DIND):10269, (IND):10270, (268-523):10271-10526, (IND):10527, (524-779):10528-10783, (IND):10784, (780-1035):10785-11040, (IND):11041, (1036-1291):11042-11297, (IND):11298, (1292-1547):11299-11554, (IND):11555, (1548-1803):11556-11811, (IND):11812, (1804-2059):11813-12068, (IND):12069, (2060-2315):12070-12325, (IND):12326, (2316-2571):12327-12582, (IND):12583, (2572-2827):12584-12839, (IND):12840, (2828-3083):12841-13096, (IND):13097, (3084-3339):13098-13353, (IND):13354, (3340-3595):13355-13610, (IND):13611, (3596-3851):13612-13867, (IND):13868, (3852-4107):13869-14124, (IND):14125, (4108-4363):14126-14381, (IND):14382, (4364-4619):14383-14638, (IND):14639, (4620-4875):14640-14895, (IND):14896, (4876-5131):14897-15152, (IND):15153, (5132-5387):15154-15409, (IND):15410, (5388-5643):15411-15666, (IND):15667, (5644-5899):15668-15923, (IND):15924, (5900-6155):15925-16180, (IND):16181, (6156-6411):16182-16437, (IND):16438, (6412-6667):16439-16694, (IND):16695, (6668-6923):16696-16951, (IND):16952, (6924-7179):16953-17208, (IND):17209, (7180-7435):17210-17465, (IND):17466, (7436-7691):17467-17722, (IND):17723, (7692-7947):17724-17979, (IND):17980, (7948-8203):17981-18236, (IND):18237, (8204-8459):18238-18493, (IND):18494, (8460-8715):18495-18750, (IND):18751, (8716-8971):18752-19007, (IND):19008, (8972-9227):19009-19264, (IND):19265, (9228-9483):19266-19521, (IND):19522, (9484-9739):19523-19778, (IND):19779, (9740-9995):19780-20035, (IND):20036, (9996-9999):20037-20040 +TOTAL: 10041 + +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 +Free blocks count wrong for group #0 (6841, counted=6840). +Fix? yes + +Free blocks count wrong for group #1 (1551, counted=1550). +Fix? yes + +Free blocks count wrong (53116, counted=53114). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 13/4096 files (7.7% non-contiguous), 12422/65536 blocks +Exit status is 1 diff --git a/tests/d_fallocate_blkmap/name b/tests/d_fallocate_blkmap/name new file mode 100644 index 000000000..ba2b61d45 --- /dev/null +++ b/tests/d_fallocate_blkmap/name @@ -0,0 +1 @@ +fallocate sparse files and big files on a blockmap fs diff --git a/tests/d_fallocate_blkmap/script b/tests/d_fallocate_blkmap/script new file mode 100644 index 000000000..9c48cbc90 --- /dev/null +++ b/tests/d_fallocate_blkmap/script @@ -0,0 +1,85 @@ +if test -x $DEBUGFS_EXE; then + +FSCK_OPT=-fy +OUT=$test_name.log +if [ -f $test_dir/expect.gz ]; then + EXP=$test_name.tmp + gunzip < $test_dir/expect.gz > $EXP1 +else + EXP=$test_dir/expect +fi + +cp /dev/null $OUT + +cat > $TMPFILE.conf << ENDL +[fs_types] +ext4 = { + base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr,^has_journal,^extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,^64bit + blocksize = 1024 + inode_size = 256 + inode_ratio = 16384 +} +ENDL +MKE2FS_CONFIG=$TMPFILE.conf $MKE2FS -F -o Linux -b 1024 -O ^bigalloc -T ext4 $TMPFILE 65536 2>&1 | sed -f $cmd_dir/filter.sed >> $OUT 2>&1 +rm -rf $TMPFILE.conf + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +echo "debugfs write files" >> $OUT + +#Files we create: +# a: fallocate a 40k file +# k: one big file +base=5000 +cat > $TMPFILE.cmd << ENDL +write /dev/null a +sif /a bmap[2] 8000 +sif /a size 40960 +sif /a i_blocks 2 +setb 8000 +fallocate /a 0 39 + +write /dev/null b +sif /b size 10240000 +sif /b bmap[0] 10000 +sif /b i_blocks 2 +setb 10000 +fallocate /b 0 9999 +ENDL +echo "stat /a" >> $TMPFILE.cmd2 +echo "stat /b" >> $TMPFILE.cmd2 + +$DEBUGFS_EXE -w -f $TMPFILE.cmd $TMPFILE > /dev/null 2>&1 +$DEBUGFS_EXE -f $TMPFILE.cmd2 $TMPFILE >> $OUT.new 2>&1 +sed -f $cmd_dir/filter.sed -e '/^.*time:.*$/d' < $OUT.new >> $OUT +rm -rf $OUT.new $TMPFILE.cmd $TMPFILE.cmd2 + +$FSCK -fy -N test_filesys $TMPFILE > $OUT.new 2>&1 +status=$? +echo Exit status is $status >> $OUT.new +sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new >> $OUT +rm -f $OUT.new + +rm -f $TMPFILE + +cmp -s $OUT $EXP +status=$? + +if [ "$status" = 0 ] ; then + echo "$test_name: $test_description: ok" + touch $test_name.ok +else + echo "$test_name: $test_description: failed" + diff $DIFF_OPTS $EXP $OUT > $test_name.failed + rm -f $test_name.tmp +fi + +unset IMAGE FSCK_OPT OUT EXP + +else #if test -x $DEBUGFS_EXE; then + echo "$test_name: $test_description: skipped" +fi -- 2.47.3