| test_description="e2undo and mke2fs with offset option" |
| OUT="$test_name.log" |
| TDB_FILE="$TMPFILE.e2undo" |
| |
| E2UNDO_FEATURE_COMPAT_OFFSET=1 |
| |
| trap "rm -f $TDB_FILE" EXIT INT QUIT |
| |
| test_e2undo_mke2fs_off() { |
| OFF=$1 |
| |
| rm -f "$TDB_FILE" |
| echo "testing e2undo and mke2fs with the -E offset=$OFF option" >> "$OUT" |
| # prepare $TMPFILE |
| yes a | dd of="$TMPFILE" bs="$OFF" count=1 iflag=fullblock \ |
| > /dev/null 2>>"$OUT" |
| yes b | dd bs=1k count=1024 iflag=fullblock >> "$TMPFILE" 2>>"$OUT" |
| yes c | dd bs=1k count=3 iflag=fullblock >> "$TMPFILE" 2>>"$OUT" |
| |
| crc_exp=`$CRCSUM "$TMPFILE"` |
| $MKE2FS -F -z "$TDB_FILE" -b 1024 -E offset="$OFF" "$TMPFILE" 1024 \ |
| >> "$OUT" 2>&1 |
| |
| # supplement test with offset specific data |
| supplement_test_$OFF |
| |
| # dump undo header (just to ease debugging in case of a failure) |
| echo "undo header:" >> "$OUT" |
| $E2UNDO -h "$TDB_FILE" "$TMPFILE" >> "$OUT" 2>&1 |
| |
| # offset is stored in the undo header |
| $E2UNDO "$TDB_FILE" "$TMPFILE" >> "$OUT" 2>&1 |
| crc_act=`$CRCSUM "$TMPFILE"` |
| |
| # also test the key extension code path: the key for the fs block 960 |
| # (tdb block 30) is extended by the fs block 992 (tdb block 31) |
| # => we have exactly 3 key blocks instead of 4 |
| num_keys_exp=3 |
| num_keys_act=`$E2UNDO -h "$TDB_FILE" "$TMPFILE" | grep "^nr keys:" \ |
| | cut -f2` |
| |
| offset_exp=$OFF |
| offset_act=`$E2UNDO -h "$TDB_FILE" "$TMPFILE" | grep "^fs offset:" \ |
| | cut -f2` |
| compat_exp=$E2UNDO_FEATURE_COMPAT_OFFSET |
| compat_act=`$E2UNDO -h "$TDB_FILE" "$TMPFILE" | grep "^compat:" | cut -f3` |
| |
| if [ "$crc_exp" != "$crc_act" -o \ |
| "$num_keys_exp" != "$num_keys_act" -o \ |
| "$offset_exp" != "$offset_act" -o \ |
| $(($compat_act & $E2UNDO_FEATURE_COMPAT_OFFSET)) -ne $compat_exp ] |
| then |
| echo "mke2fs called with offset: $OFF" >> "$test_name.failed" |
| echo "crc_exp: $crc_exp" >> "$test_name.failed" |
| echo "crc_act: $crc_act" >> "$test_name.failed" |
| echo "num_keys_exp: $num_keys_exp" >> "$test_name.failed" |
| echo "num_keys_act: $num_keys_act" >> "$test_name.failed" |
| echo "offset_exp: $offset_exp" >> "$test_name.failed" |
| echo "offset_act: $offset_act" >> "$test_name.failed" |
| echo "compat_exp: $compat_exp" >> "$test_name.failed" |
| echo "compat_act: $compat_act" >> "$test_name.failed" |
| echo >> "$test_name.failed" |
| fi |
| } |
| |
| supplement_test_2048() { |
| # modify the two subsequent 1k blocks (1026 and 1027) after the fs end: |
| # e2undo will overwrite these modified blocks with the old |
| # data again (this might be considered as a bug (for now, |
| # this testcase just documents this behavior)) |
| SEEK_BLOCKS=$(((2048 + 1024 * 1024) / 1024)) |
| yes d | dd of="$TMPFILE" bs=1k count=2 seek="$SEEK_BLOCKS" \ |
| iflag=fullblock > /dev/null 2>>"$OUT" |
| } |
| |
| supplement_test_96255() { |
| # nothing to supplement |
| : |
| } |
| |
| # test even offset < tdb_data_size |
| # with an offset of 2048 the old code wrote an incorrect undo file, |
| # for example, the computations for fs block 0 were wrong: |
| # * backing_blk_num was set to ULLONG_MAX - 1 instead of 0 |
| # * data was read from the beginning of the file instead of offset 2048 |
| # * data_ptr was set to read_ptr - 2048 |
| # for details, see the old undo_write_tdb code in undo_io.c |
| test_e2undo_mke2fs_off 2048 |
| |
| # test odd offset > tdb_data_size: 32768 * 3 - 2 * 1024 - 1 |
| # a somewhat arbitrary value, for example, during the backup of |
| # fs block 0 such an offset resulted in: |
| # * the largest "in fs block offset" (96255 % 1024 == 1023) |
| # * a wrong value for data_size (actual bytes read: 31745) |
| # * an invalid address for data_ptr |
| # for details, see the old undo_write_tdb code in undo_io.c |
| test_e2undo_mke2fs_off 96255 |
| |
| if [ -e "$test_name.failed" ]; then |
| echo "$test_name: $test_description: failed" |
| else |
| echo "$test_name: $test_description: ok" |
| touch "$test_name.ok" |
| fi |