From: Paul Zuchowski <31706010+PaulZ-98@users.noreply.github.com> Date: Sat, 27 Jul 2019 00:52:13 +0000 (-0400) Subject: Develop tests for issues #5866 and #8858 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=693c1fc478cc8118dd0168c4815c0ae3be41c9c3;p=zfs Develop tests for issues #5866 and #8858 Provide zfstest coverage for these two issues which were a panic accessing extended attributes and a problem comparing 64 bit and 32 bit generation numbers. Reviewed-by: Brian Behlendorf Signed-off-by: Paul Zuchowski Issue #5866 Issue #8858 Closes #8978 --- diff --git a/configure.ac b/configure.ac index 0522185e4..da25b521e 100644 --- a/configure.ac +++ b/configure.ac @@ -184,6 +184,7 @@ AC_CONFIG_FILES([ tests/zfs-tests/cmd/mmap_libaio/Makefile tests/zfs-tests/cmd/mmapwrite/Makefile tests/zfs-tests/cmd/nvlist_to_lua/Makefile + tests/zfs-tests/cmd/online_recv/Makefile tests/zfs-tests/cmd/randfree_file/Makefile tests/zfs-tests/cmd/randwritecomp/Makefile tests/zfs-tests/cmd/readmmap/Makefile @@ -344,6 +345,7 @@ AC_CONFIG_FILES([ tests/zfs-tests/tests/functional/vdev_zaps/Makefile tests/zfs-tests/tests/functional/write_dirs/Makefile tests/zfs-tests/tests/functional/xattr/Makefile + tests/zfs-tests/tests/functional/xattr/blockfiles/Makefile tests/zfs-tests/tests/functional/zvol/Makefile tests/zfs-tests/tests/functional/zvol/zvol_cli/Makefile tests/zfs-tests/tests/functional/zvol/zvol_ENOSPC/Makefile diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run index c554e578d..6202aacaa 100644 --- a/tests/runfiles/linux.run +++ b/tests/runfiles/linux.run @@ -912,7 +912,7 @@ tags = ['functional', 'write_dirs'] tests = ['xattr_001_pos', 'xattr_002_neg', 'xattr_003_neg', 'xattr_004_pos', 'xattr_005_pos', 'xattr_006_pos', 'xattr_007_neg', 'xattr_008_pos', 'xattr_009_neg', 'xattr_010_neg', 'xattr_011_pos', 'xattr_012_pos', - 'xattr_013_pos'] + 'xattr_013_pos', 'xattr_zfs_zreget'] tags = ['functional', 'xattr'] [tests/functional/zvol/zvol_ENOSPC] diff --git a/tests/zfs-tests/cmd/Makefile.am b/tests/zfs-tests/cmd/Makefile.am index 09c59f591..6161f632a 100644 --- a/tests/zfs-tests/cmd/Makefile.am +++ b/tests/zfs-tests/cmd/Makefile.am @@ -19,6 +19,7 @@ SUBDIRS = \ mmap_libaio \ mmapwrite \ nvlist_to_lua \ + online_recv \ randfree_file \ randwritecomp \ readmmap \ diff --git a/tests/zfs-tests/cmd/online_recv/.gitignore b/tests/zfs-tests/cmd/online_recv/.gitignore new file mode 100644 index 000000000..2528e5e46 --- /dev/null +++ b/tests/zfs-tests/cmd/online_recv/.gitignore @@ -0,0 +1 @@ +/online_recv diff --git a/tests/zfs-tests/cmd/online_recv/Makefile.am b/tests/zfs-tests/cmd/online_recv/Makefile.am new file mode 100644 index 000000000..8f89006d6 --- /dev/null +++ b/tests/zfs-tests/cmd/online_recv/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/config/Rules.am + +pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/bin + +DEFAULT_INCLUDES += \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/lib/libspl/include + +pkgexec_PROGRAMS = online_recv + +online_recv_SOURCES = online_recv.c +online_recv_LDADD = \ + $(top_builddir)/lib/libspl/libspl.la \ + $(top_builddir)/lib/libnvpair/libnvpair.la \ + $(top_builddir)/lib/libzfs_core/libzfs_core.la diff --git a/tests/zfs-tests/cmd/online_recv/online_recv.c b/tests/zfs-tests/cmd/online_recv/online_recv.c new file mode 100644 index 000000000..97080dd1d --- /dev/null +++ b/tests/zfs-tests/cmd/online_recv/online_recv.c @@ -0,0 +1,52 @@ +/* + * CDDL HEADER START + * + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2019 by Datto, Inc. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include + +int zfs_fd; + +/* + * Use libzfs_core to do a "zfs receive". This allows us to + * bypass certain checks in the zfs command utility and + * perform an online receive into an existing filesystem for + * testing purposes. + */ +int +main(int argc, const char *argv[]) +{ + int err = 0; + + if (argc < 2) { + fprintf(stderr, "usage: online_recv \n"); + exit(2); + } + + (void) libzfs_core_init(); + + err = lzc_receive(argv[1], NULL, NULL, B_TRUE, B_FALSE, 0); + + libzfs_core_fini(); + + return (err); +} diff --git a/tests/zfs-tests/include/commands.cfg b/tests/zfs-tests/include/commands.cfg index f8ad02246..d61253c30 100644 --- a/tests/zfs-tests/include/commands.cfg +++ b/tests/zfs-tests/include/commands.cfg @@ -175,6 +175,7 @@ export ZFSTEST_FILES='chg_usr_exec mmap_libaio mmapwrite nvlist_to_lua + online_recv randfree_file randwritecomp readmmap diff --git a/tests/zfs-tests/tests/functional/xattr/Makefile.am b/tests/zfs-tests/tests/functional/xattr/Makefile.am index 17001885f..9e8db6f1f 100644 --- a/tests/zfs-tests/tests/functional/xattr/Makefile.am +++ b/tests/zfs-tests/tests/functional/xattr/Makefile.am @@ -1,3 +1,5 @@ +SUBDIRS = blockfiles + pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/xattr dist_pkgdata_SCRIPTS = \ setup.ksh \ @@ -14,7 +16,8 @@ dist_pkgdata_SCRIPTS = \ xattr_010_neg.ksh \ xattr_011_pos.ksh \ xattr_012_pos.ksh \ - xattr_013_pos.ksh + xattr_013_pos.ksh \ + xattr_zfs_zreget.ksh dist_pkgdata_DATA = \ xattr_common.kshlib \ diff --git a/tests/zfs-tests/tests/functional/xattr/blockfiles/Makefile.am b/tests/zfs-tests/tests/functional/xattr/blockfiles/Makefile.am new file mode 100644 index 000000000..dbdeb04cc --- /dev/null +++ b/tests/zfs-tests/tests/functional/xattr/blockfiles/Makefile.am @@ -0,0 +1,3 @@ +pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/xattr/blockfiles +dist_pkgdata_DATA = \ + zfs-txg-number.dat.bz2 diff --git a/tests/zfs-tests/tests/functional/xattr/blockfiles/zfs-txg-number.dat.bz2 b/tests/zfs-tests/tests/functional/xattr/blockfiles/zfs-txg-number.dat.bz2 new file mode 100644 index 000000000..c3891ee03 Binary files /dev/null and b/tests/zfs-tests/tests/functional/xattr/blockfiles/zfs-txg-number.dat.bz2 differ diff --git a/tests/zfs-tests/tests/functional/xattr/xattr_zfs_zreget.ksh b/tests/zfs-tests/tests/functional/xattr/xattr_zfs_zreget.ksh new file mode 100755 index 000000000..a93c6c492 --- /dev/null +++ b/tests/zfs-tests/tests/functional/xattr/xattr_zfs_zreget.ksh @@ -0,0 +1,78 @@ +#!/bin/ksh -p +# +# CDDL HEADER START +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2019 Datto, Inc. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# See ZoL issues #5866 and #8858. This test will ensure the fixes for +# these specific issues have no regression. +# +# Exercise the functions zfs_suspend_fs / zfs_resume_fs / zfs_rezget. +# The test will ensure that we reach zfs code that compares file +# generation numbers and fetches extended attributes. +# +# STRATEGY: +# 1. Import a pool that has txg number > 2^32. +# 2. Take snapshot and do send with an online receive. +# 3. EIO is expected when accessing the received file-system. +# 4. Access extended attribute. (previously this would panic) +# 5. Take second snapshot, write some data. +# 6. Rollback. +# 7. Access the resulting file-system. (previously every accesss would give EIO) +# + +verify_runnable "global" + +function cleanup +{ + log_must zpool destroy -f txg-number-pool + log_must rm $TEST_BASE_DIR/zfs-txg-number.dat +} + + +log_assert "zfs can handle suspend/resume with large generation number" + +log_onexit cleanup + +log_must bzcat \ + $STF_SUITE/tests/functional/xattr/blockfiles/zfs-txg-number.dat.bz2 \ + >$TEST_BASE_DIR/zfs-txg-number.dat + +log_must zpool import txg-number-pool -d $TEST_BASE_DIR + +log_must zfs create txg-number-pool/fs1 +log_must zfs snapshot txg-number-pool/fs1@snap1 +log_must zfs create txg-number-pool/fs2 + +log_must eval "zfs send txg-number-pool/fs1@snap1 | + online_recv txg-number-pool/fs2@snap1" + +log_mustnot stat /txg-number-pool/fs2 +log_mustnot attr -l /txg-number-pool/fs2 + +log_must zfs snapshot txg-number-pool/fs1@snap2 +log_must fill_fs /txg-number-pool/fs1 2 2 1024 1 R +log_must sync +log_must zfs rollback txg-number-pool/fs1@snap2 + +log_must stat /txg-number-pool/fs1 + +log_pass "suspend/resume works with large generation number"