Fix volume WR_INDIRECT log replay (#6620)

The portion of the zvol_replay_write() handler responsible for
replaying indirect log records for some reason never existed.
As a result indirect log records were not being correctly replayed.

This went largely unnoticed since the majority of zvol log records
were of the type WR_COPIED or WR_NEED_COPY prior to OpenZFS 7578.

This patch updates zvol_replay_write() to correctly handle these
log records and adds a new test case which verifies volume replay
to prevent any regression.  The existing test case which verified
replay on filesystem was renamed slog_replay_fs.ksh for clarity.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6603
This commit is contained in:
Brian Behlendorf
2017-09-13 16:04:16 -07:00
committed by Tony Hutter
parent 45d1abc74d
commit a2a0440918
13 changed files with 223 additions and 43 deletions
@@ -33,7 +33,7 @@
. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.cfg
#
# umount the ufs|ext2 fs if there is timedout in the ufs|ext2 test
# umount the ufs|ext fs if there is timedout in the ufs|ext test
#
if ismounted $FS_MNTPOINT $NEWFS_DEFAULT_FS ; then
@@ -73,7 +73,7 @@ function setup_snap_env
[[ $type == 'volume' ]]; then
#
# At the first time, Make a UFS file system in volume and
# mount it. Otherwise, only check if this ufs|ext2 file system
# mount it. Otherwise, only check if this ufs|ext file system
# was mounted.
#
log_must eval "echo "y" | \
@@ -81,8 +81,8 @@ function setup_snap_env
[[ ! -d $TESTDIR1 ]] && log_must mkdir $TESTDIR1
# Make sure the ufs|ext2 filesystem hasn't been mounted,
# then mount the new ufs|ext2 filesystem.
# Make sure the ufs|ext filesystem hasn't been mounted,
# then mount the new ufs|ext filesystem.
if ! ismounted $TESTDIR1 $NEWFS_DEFAULT_FS; then
log_must mount \
$ZVOL_DEVDIR/$TESTPOOL/$TESTVOL $TESTDIR1
@@ -53,11 +53,11 @@ function create_pool_test
}
#
# Create a ufs|ext2 file system and make a file within the file
# Create a ufs|ext file system and make a file within the file
# system for storage pool vdev
# $1, file size
# $2, file name
# $3, disk name to create ufs|ext2 file system
# $3, disk name to create ufs|ext file system
#
function create_blockfile
{
@@ -83,7 +83,7 @@ function create_blockfile
}
#
# Umount the ext2|ufs filesystem and remove the mountpoint
# Umount the ufs|ext filesystem and remove the mountpoint
# $1, the mount point
#
function clean_blockfile