| if ! test -x $DEBUGFS_EXE; then | |
| echo "$test_name: $test_description: skipped (no debugfs)" | |
| return 0 | |
| fi | |
| OUT=$test_name.log | |
| TIMESTAMPS=$test_name.timestamps.log | |
| EXP=$test_dir/expect | |
| FSCK_OPT=-yf | |
| create_file_with_xtime_and_extra() { | |
| name=$1 | |
| time=$2 | |
| extra=$3 | |
| { | |
| echo "write /dev/null $name" | |
| for xtime in atime ctime mtime crtime; do | |
| echo "set_inode_field $name $xtime @$time" | |
| echo "set_inode_field $name ${xtime}_extra $extra" | |
| done | |
| } | $DEBUGFS -w -f /dev/stdin $TMPFILE >> $OUT 2>&1 | |
| } | |
| get_file_xtime_and_extra() { | |
| name=$1 | |
| echo "times for $name =" >> $TIMESTAMPS | |
| $DEBUGFS -R "stat $name" $TMPFILE 2>&1 | egrep '^( a| c| m|cr)time:' | | |
| sed 's/ --.*//' >> $TIMESTAMPS | |
| } | |
| rm -f $OUT $TIMESTAMPS | |
| # create an empty ext4 filesystem with 256-byte inodes for testing | |
| > $TMPFILE | |
| echo mkfs.ext4 -b 1024 -q -I 256 $TMPFILE 5000 >> $OUT | |
| $MKE2FS -t ext4 -b 1024 -q -I 256 -F $TMPFILE 5000 >> $OUT 2>&1 | |
| # this is a pre-1970 file encoded with the old encoding. | |
| # fsck should repair this | |
| create_file_with_xtime_and_extra year-1909 -1907928000 3 | |
| # these are all already encoded correctly | |
| create_file_with_xtime_and_extra year-1979 299592000 0 | |
| create_file_with_xtime_and_extra year-2039 2191752000 1 | |
| create_file_with_xtime_and_extra year-2139 5345352000 1 | |
| # confirm that the xtime is wrong on the pre-1970 file | |
| get_file_xtime_and_extra year-1909 | |
| # and confirm that it is right on the remaining files | |
| get_file_xtime_and_extra year-1979 | |
| get_file_xtime_and_extra year-2039 | |
| get_file_xtime_and_extra year-2139 | |
| # before we repair the filesystem, save off a copy so that | |
| # we can use it later | |
| cp -a $TMPFILE $TMPFILE.sav | |
| # repair the filesystem | |
| E2FSCK_TIME=1386393539 $FSCK $FSCK_OPT $TMPFILE >> $OUT 2>&1 | |
| # check that the dates and xtime_extra on the file is now correct | |
| get_file_xtime_and_extra year-1909 | |
| # check that the remaining dates have not been altered | |
| get_file_xtime_and_extra year-1979 | |
| get_file_xtime_and_extra year-2039 | |
| get_file_xtime_and_extra year-2139 | |
| if test $SIZEOF_TIME_T -gt 4 | |
| then | |
| # now we need to check that after the year 2242, e2fsck does not | |
| # modify dates with extra_xtime=3 | |
| # restore the unrepaired filesystem | |
| mv $TMPFILE.sav $TMPFILE | |
| #retry the repair | |
| E2FSCK_TIME=9270393539 $FSCK $FSCK_OPT $TMPFILE >> $OUT 2>&1 | |
| # check that the 1909 file is unaltered (i.e. it has a post-2378 date) | |
| get_file_xtime_and_extra year-1909 | |
| else | |
| rm -f TMPFILE.sav | |
| cat << EOF >> $TIMESTAMPS | |
| times for year-1909 = | |
| ctime: 0x8e475440:00000003 | |
| atime: 0x8e475440:00000003 | |
| mtime: 0x8e475440:00000003 | |
| crtime: 0x8e475440:00000003 | |
| EOF | |
| fi | |
| cmp -s $TIMESTAMPS $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 $TIMESTAMPS > $test_name.failed | |
| fi | |
| unset OUT TIMESTAMPS EXP FSCK_OPT |