From 693c1fc478cc8118dd0168c4815c0ae3be41c9c3 Mon Sep 17 00:00:00 2001 From: Paul Zuchowski <31706010+PaulZ-98@users.noreply.github.com> Date: Fri, 26 Jul 2019 20:52:13 -0400 Subject: [PATCH] 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 --- configure.ac | 2 + tests/runfiles/linux.run | 2 +- tests/zfs-tests/cmd/Makefile.am | 1 + tests/zfs-tests/cmd/online_recv/.gitignore | 1 + tests/zfs-tests/cmd/online_recv/Makefile.am | 15 ++++ tests/zfs-tests/cmd/online_recv/online_recv.c | 52 ++++++++++++ tests/zfs-tests/include/commands.cfg | 1 + .../tests/functional/xattr/Makefile.am | 5 +- .../functional/xattr/blockfiles/Makefile.am | 3 + .../xattr/blockfiles/zfs-txg-number.dat.bz2 | Bin 0 -> 23173 bytes .../functional/xattr/xattr_zfs_zreget.ksh | 78 ++++++++++++++++++ 11 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 tests/zfs-tests/cmd/online_recv/.gitignore create mode 100644 tests/zfs-tests/cmd/online_recv/Makefile.am create mode 100644 tests/zfs-tests/cmd/online_recv/online_recv.c create mode 100644 tests/zfs-tests/tests/functional/xattr/blockfiles/Makefile.am create mode 100644 tests/zfs-tests/tests/functional/xattr/blockfiles/zfs-txg-number.dat.bz2 create mode 100755 tests/zfs-tests/tests/functional/xattr/xattr_zfs_zreget.ksh 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 0000000000000000000000000000000000000000..c3891ee0379728b5e20cfd53fb7b4a080c4eb15d GIT binary patch literal 23173 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 literal 0 HcmV?d00001 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" -- 2.40.0