OpenZFS/src cf1bc78 — .github/workflows/scripts qemu-4-build-vm.sh

CI: Enable configure caching by default

Enable configure caching by default in the CI. This doesn't 
significantly speed up the build but it does ensure this
functionality is always tested.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Glenn Washburn <development at efficientek.com>
Closes #19173
DeltaFile
+16-4.github/workflows/scripts/qemu-4-build-vm.sh
+16-41 files

OpenZFS/src b7879cd — tests/zfs-tests/tests/functional/rsend send_realloc_dnode_interior.ksh

ZTS: increase send_realloc_dnode_interior attempts

The send_realloc_dnode_interior test depends on being able to
reallocate and interior slot of a freed dnode.  The test doesn't
have direct control over the object id assignment so there's a
retry loop which attempts to set this up 5 times then gives up.
Increase that threshhold to 10 times and add some diagnostic
information to log what ranges are being checked on each attempt.

Reviewed-by: George Melikov <mail at gmelikov.ru>
Signed-off-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Closes #19112
DeltaFile
+5-1tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_interior.ksh
+5-11 files

OpenZFS/src e3831a6 — include/os/linux/spl/sys trace_spl.h, scripts spdxcheck.pl

spl: remote sys/trace_spl.h

Linux kernel only, not included from anywhere since 801d9b4f96.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-21include/os/linux/spl/sys/trace_spl.h
+0-1scripts/spdxcheck.pl
+0-222 files

OpenZFS/src 8c12098 — lib/libefi rdwr_efi.c, lib/libspl/include Makefile.am

spl: remove sys/mhd.h

Only in libspl, only included from libefi, and nothing from it gets used.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-149lib/libspl/include/sys/mhd.h
+0-1lib/libspl/include/Makefile.am
+0-1lib/libefi/rdwr_efi.c
+0-1513 files

OpenZFS/src 78adacc — lib/libspl/include Makefile.am, lib/libspl/include/sys priv.h

spl: remove sys/priv.h

Empty and unused in userspace.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-20lib/libspl/include/sys/priv.h
+0-1lib/libspl/include/Makefile.am
+0-212 files

OpenZFS/src a66614a — include/os/freebsd Makefile.am, include/os/freebsd/spl/sys uuid.h

spl: remove sys/uuid.h

Only on FreeBSD, and almost identical to include/sys/uuid.h. However,
only used by sys/efi_partition.h, which is specific to libefi, which is
not used on FreeBSD, and especially not in the kernel. Remove stray
includes of sys/efi_partition.h too and there's no more to see.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-89include/os/freebsd/spl/sys/uuid.h
+0-1lib/libzutil/os/freebsd/zutil_import_os.c
+0-1lib/libzfs/libzfs_pool.c
+0-1include/os/freebsd/Makefile.am
+0-924 files

OpenZFS/src 7646bb3 — include/os/linux Makefile.am, include/os/linux/spl/sys taskq.h condvar.h

spl: remove sys/wait.h

Only on Linux, just includes a couple of platform includes that don't
appear to be needed directly anyway.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-31include/os/linux/spl/sys/wait.h
+0-1module/os/linux/spl/spl-kmem-cache.c
+0-1include/os/linux/spl/sys/taskq.h
+0-1include/os/linux/spl/sys/condvar.h
+0-1include/os/linux/Makefile.am
+0-355 files

OpenZFS/src 961739e — include/os/freebsd Makefile.am, include/os/freebsd/spl/sys mode.h

spl: remove sys/mode.h

Only on FreeBSD, empty, and never included.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-1scripts/spdxcheck.pl
+0-1include/os/freebsd/spl/sys/mode.h
+0-1include/os/freebsd/Makefile.am
+0-33 files

OpenZFS/src 0ab3757 — cmd ztest.c, lib/libspl/include Makefile.am

spl: remove sys/poll.h

Only in userspace, as a workaround to get poll.h correctly. However,
there's only one place we include it, in ztest, so its more sensible to
just include poll.h directly there, which is what we want anyway.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-31lib/libspl/include/sys/poll.h
+1-1cmd/ztest.c
+0-1lib/libspl/include/Makefile.am
+1-333 files

OpenZFS/src 8dbb6e3 — lib/libspl/include Makefile.am, lib/libspl/include/sys stack.h

spl: remove sys/stack.h

Only for userspace, and never included.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-65lib/libspl/include/sys/stack.h
+0-1lib/libspl/include/Makefile.am
+0-662 files

OpenZFS/src 6597fd0 — include/os/linux Makefile.am, include/os/linux/spl/sys condvar.h callo.h

spl: remove sys/callo.h

Only on Linux. CALLOUT_FLAG_ABSOLUTE is the only thing we need from
here, for cv_timedwait_idle_hires(). FreeBSD and userspace have it in
condvar.h, move it there for Linux.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-52include/os/linux/spl/sys/callo.h
+2-2include/os/linux/spl/sys/condvar.h
+0-1include/os/linux/Makefile.am
+2-553 files

OpenZFS/src 1ceb518 — include/os/freebsd Makefile.am, include/os/linux/spl/sys inttypes.h

spl: remove sys/inttypes.h

Empty on Linux & FreeBSD. In userspace, only included inttypes.h to get
the "core" types, and then unconditionally defined _INT64_TYPE, which
only gates the 64-bit atomics.

So, remove all versions, and the _INT64_TYPE gate. Finally, move the
inttypes.h include up in sys/types.h, since it is now the only source of
the "core" types, and wasn't included early enough to get them.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+2-31lib/libspl/include/atomic.h
+0-28include/os/linux/spl/sys/inttypes.h
+0-24lib/libspl/include/sys/inttypes.h
+4-4lib/libspl/include/sys/types.h
+0-2lib/libspl/include/sys/types32.h
+0-1include/os/freebsd/Makefile.am
+6-9013 files not shown
+6-10319 files

OpenZFS/src 5259714 — include/os/linux Makefile.am, include/os/linux/spl/sys vnode.h user.h

spl: remove sys/user.h

Only on Linux. Left over from before zfs_file_*, should have been
removed in da92d5cbb3.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-42include/os/linux/spl/sys/user.h
+0-1include/os/linux/spl/sys/vnode.h
+0-1include/os/linux/Makefile.am
+0-443 files

OpenZFS/src 95b1942 — include/os/freebsd Makefile.am, include/os/freebsd/spl/sys lock.h

spl: remove sys/lock.h

Only for FreeBSD, shadowing a system header. The two additional defines
are not used anywhere in OpenZFS.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19206
DeltaFile
+0-41include/os/freebsd/spl/sys/lock.h
+0-1include/os/freebsd/Makefile.am
+0-422 files

OpenZFS/src 6d5d3f6 — module/zfs spa.c

Wait for the txg-time database write before setting spa_final_txg

spa_export_common() writes the TXG timestamp database into the MOS via
spa_unload_sync_time_logger(), which assigns the write to whatever txg
is open at the time and returns without waiting for it to sync.  The
shutdown fence is then computed as spa_last_synced_txg() +
TXG_DEFER_SIZE + 1, so spa_final_dirty_txg() is spa_last_synced_txg + 1,
on the assumption that nothing is dirty beyond that point.

That assumption only holds while the sync pipeline is idle.  With
spa_last_synced_txg at L, txg L+1 syncing and L+2 open, the write lands
in L+2 while the fence permits only L+1.  When L+2 syncs, the MOS write
allocates space, the metaslab is dirty for L+2, and metaslab_sync()
trips its own check by exactly one txg:

  VERIFY3U(txg, <=, spa_final_dirty_txg(spa)) failed (2751 <= 2750)

That VERIFY3U is compiled into production builds, so a real
'zpool export' can panic the same way ztest does.

    [19 lines not shown]
DeltaFile
+6-0module/zfs/spa.c
+6-01 files

OpenZFS/src 5f1957a — include/sys spa_impl.h, module/zfs vdev_label.c spa.c

spa: number new txgs above every uberblock on disk

After a successful import of an explicitly requested txg the new txgs
were numbered from that txg onwards, while the uberblocks of the
timeline the import discarded were still in the label ring with higher
txg numbers.  If the pool was exported before the new timeline overtook
them, the next plain import selected one of theirs, quietly returning to
the discarded state, or failed with an I/O error once the new timeline
had reused its blocks.

The rewind path does not have this problem: a load that follows a failed
one sets spa_last_ubsync_txg to the txg of the newest uberblock, and
spa_first_txg is taken from it.  A load of an explicitly requested txg
succeeds on the first attempt, so that value is zero and the first new
txg comes from spa_last_synced_txg() instead.

Record the newest uberblock seen while loading, whatever txg was asked
for, and start the new timeline above it.


    [9 lines not shown]
DeltaFile
+10-0module/zfs/spa.c
+8-0module/zfs/vdev_label.c
+1-0include/sys/spa_impl.h
+19-03 files

OpenZFS/src 81b19c6 — config rpm.am

rpm: Generate initial rpm configure cache file from existing cache

The rpmbuild can not use the existing configure cache generated by the
initial configure run because the build/host/target is likely different.
More generally configure's "precious" variables have different values
or states. However, the rest of the initial cache file can be reused.
This is the bulk of the processing in configure anyway. Also, for the
same reason, caches can not be shared between rpmbuilds either.

Generate the initial rpm configure cache file by taking the initial
configure cache and excluding the precious variables. If the rpm
configure already exists, reuse it but remove the undesired variables.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Glenn Washburn <development at efficientek.com>
Closes #19168
DeltaFile
+15-1config/rpm.am
+15-11 files

OpenZFS/src 9d5af5e — config zfs-build.m4

rpm: Rename CONFCACHE_FILE to RPM_CONFCACHE

This configure cache file is specific to rpm builds and should be
labeled appropriately.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Glenn Washburn <development at efficientek.com>
Closes #19168
DeltaFile
+4-4config/zfs-build.m4
+4-41 files

OpenZFS/src 497e077 — rpm/generic zfs.spec.in, rpm/redhat zfs-kmod.spec.in

rpm: Enable configure caching for redhat kmod and zfs user packages

These were missed in 0eff7a30b82e (rpm: Add configure caching if used
in main configure run).

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Glenn Washburn <development at efficientek.com>
Closes #19168
DeltaFile
+1-0rpm/redhat/zfs-kmod.spec.in
+1-0rpm/generic/zfs.spec.in
+2-02 files

OpenZFS/src 495d09b — include libzfs.h, lib/libzfs libzfs_pool.c libzfs.abi

Export zpool_valid_proplist from libzfs

zpool_create checks pool properties with zpool_valid_proplist before it
asks the kernel to create the pool. The function is static, so a caller
that wants to check pool properties ahead of time, such as a dry run of
pool creation, has to copy its rules and keep them in step by hand.

Make the function public and move prop_flags_t, the flags it takes, to
libzfs.h. The function itself is unchanged. Update libzfs.abi to match.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Ameer Hamza <ahamza at ixsystems.com>
Signed-off-by: Caleb St. John <30729806+yocalebo at users.noreply.github.com>
Closes #19190
DeltaFile
+22-0lib/libzfs/libzfs.abi
+1-7lib/libzfs/libzfs_pool.c
+8-0include/libzfs.h
+31-73 files

OpenZFS/src 47906ec — lib/libzfs_core libzfs_core.c

libzfs_core: block delivery of SIGUSR1 in send_worker thread

This fixes a Linux-specific bug.

3a909fe33 (libzfs, libzfs_core: send: always write to pipe, 2022-02-21)
introduced a subtle bug where zfs send -RPv would not print status
information periodically anymore when the stdout is redirected to
something that isn't a pipe (e.g. >/dev/null).

This is because the send_worker thread introduced by this commit
is created with an unmodified signal mask from libzfs. When
zfs_send_space is called it creates this thread.  When we request
verbose status information another thread is created which, in
theory, should periodically receive a SIGUSR1 via a POSIX timer.

The main thread blocks USR1 delivery *after* the creation of the
progress thread, leaving the send_worker thread's signal mask
unmodified. The delivery of SIGUSR1 is now random and for at least
Debian Trixie with kernel 6.12.107+deb13-amd64 this causes the

    [12 lines not shown]
DeltaFile
+25-2lib/libzfs_core/libzfs_core.c
+25-21 files

OpenZFS/src a8ea852 — cmd/zinject translate.c, config user.m4 user-makedev.m4

userspace: remove makedev detection and cleanup headers

makedev() is defined in sys/sysmacros.h on Linux, and sys/types.h on
FreeBSD. However, nothing in any of our userspace code actually uses it,
so all the supporting edifice isn't actually used.

Worse though, the SPL sys/sysmacros.h defines a lot more in userspace
than in kernel, and since sys/types.h would pull it in directly to keep
up the appearance that makedev() is in sys/types.h, it's not always
clear where some of those things in sysmacros.h are coming from, or
_should_ come from.

So clean this up. Remove the the makedev config tests, the empty mkdev.h
header, and the inclusion of sysmacros.h from types.h. For those things
that actually needed some of those definitions, include sysmacros.h
directly.

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Rob Norris <rob.norris at truenas.com>
Closes #19204
DeltaFile
+0-38config/user-makedev.m4
+0-20lib/libspl/include/sys/mkdev.h
+0-11lib/libspl/include/sys/sysmacros.h
+0-6lib/libspl/include/sys/types.h
+0-2config/user.m4
+0-2cmd/zinject/translate.c
+0-7913 files not shown
+11-8119 files

OpenZFS/src ed07ad7 — cmd/zdb zdb.c, include/sys arc_impl.h

zdb: Lower eviction timeouts on prefetched data

The ARC will not evict prefetched data that is too new.  When zdb
is doing a lot of reads in a short amount of time, it can lead to
the ARC ballooning past zfs_arc_max, since arc_evict() cannot find
anything to evict (due to the ARC containing mostly prefetched
data).  For example, zdb was observed consuming ~1.4GB mem in the
pool_checkpoint tests, even though zfs_arc_max was set to 256MB.

To get around this, allow the prefetched data to be evicted after
only 50ms instead of the normal 1 to 6 seconds.  This both
reduces zfs maximum memory usage and allows the zpool_checkpoint
tests to run to completion faster.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
Closes #19191
DeltaFile
+14-0cmd/zdb/zdb.c
+5-2module/zfs/arc.c
+3-0include/sys/arc_impl.h
+22-23 files

OpenZFS/src e056f4d — module/zfs dmu_recv.c dmu_send.c, tests/zfs-tests/tests Makefile.am

don't send spill or oversized blocks as WRITE_EMBEDDED

send_do_embed() treated every embedded BP as a DRR_WRITE_EMBEDDED
candidate. Spill blocks (DMU_OT_SA) have to go as DRR_SPILL, and an
embedded block larger than SPA_OLD_MAXBLOCKSIZE cannot be represented
on the receiver unless the stream carries large_blocks: dump_dnode()
clamps the object's block size to 128K in the DRR_OBJECT record, so
the receive then rejects the DRR_WRITE_EMBEDDED.

Skip those cases in send_do_embed() so do_dump() emits a spill record
or splits the block into SPA_OLD_MAXBLOCKSIZE chunks instead.
On receive, accept only BP_EMBEDDED_TYPE_DATA for DRR_WRITE_EMBEDDED.

Add ZTS send_embedded_spill_block (canned pool with an embedded
spill) and send_embedded_large_block (1M zstd block, send with and
without -L).

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Kamil Monicz <kamil at monicz.dev>

    [2 lines not shown]
DeltaFile
+102-0tests/zfs-tests/tests/functional/rsend/send_embedded_large_block.ksh
+84-0tests/zfs-tests/tests/functional/rsend/send_embedded_spill_block.ksh
+18-0module/zfs/dmu_send.c
+13-4tests/zfs-tests/tests/functional/rsend/rsend.kshlib
+2-2module/zfs/dmu_recv.c
+3-0tests/zfs-tests/tests/Makefile.am
+222-62 files not shown
+223-68 files

OpenZFS/src 1f380a4 — contrib/debian changelog.in

deb: Use release number generated by ZFS for native builds

This allows for a dynamic release part of the version string as is done
for rpm and non-native deb package builds. Importantly, for git builds
this allows having the git commit in the package version string.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Glenn Washburn <development at efficientek.com>
Closes #19186
DeltaFile
+1-1contrib/debian/changelog.in
+1-11 files

OpenZFS/src a5b1f32 — man/man8 zpool-prefetch.8

zpool-prefetch: Fix document description typo

Verb should be imperative mood matching rest of manual.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by:  Alexander Ziaee <ziaee at FreeBSD.org>
Closes #19184
DeltaFile
+1-1man/man8/zpool-prefetch.8
+1-11 files

OpenZFS/src 638abd2 — module/os/linux/zfs zfs_vfsops.c

zfs_domount: fix vfs_t double-free on root setup failure

When zfs_root() or d_make_root() fails, zfs_domount() calls
zfs_umount(), which frees zfsvfs->z_vfs via zfsvfs_free(). After
the vfs_t lifetime was matched to fs_context, that vfs_t is still
owned by the caller in fc->fs_private. zpl_get_tree() then returns
without clearing fs_private, and put_fs_context() frees it again.

Detach z_vfs before zfs_umount() so the caller retains ownership,
matching the other zfs_domount() error paths.

This is a follow-up to the vfs_t lifetime change in #18377.

Reviewed-by: Rob Norris <rob.norris at truenas.com>
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Wale Zhang <wale.zhang.ftd at gmail.com>
Closes #19167
DeltaFile
+4-0module/os/linux/zfs/zfs_vfsops.c
+4-01 files

OpenZFS/src db57b84 — module/os/linux/zfs zfs_ctldir.c

Linux: read the snapshot creation time from its bonus buffer

When a '.zfs/snapshot/<name>' entry is looked up by name (stat, open, or
a path walk through it; listing the directory does not do this),
zfsctl_inode_lookup() reads the snapshot's creation time for the
entry's btime through dsl_dataset_hold_obj().  That instantiates the
whole in-core dataset (dsl_dir hold, deadlists, neighbour references,
fsid uniqueness) and tears it down again on release, and it accounts
for most of a dentry-cold lookup.  The value is a field of the
snapshot's dsl_dataset_phys_t, so read it from the bonus buffer the way
the fsid is read, through a helper both callers share.

Same value, same locking, same fallback on error.  A warm lookup is
unchanged; a cold one loses the dataset instantiation, roughly an order
of magnitude on the systems it was measured on.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Rob Norris <rob.norris at truenas.com>
Signed-off-by: Ameer Hamza <ameer.hamza at truenas.com>
Closes #19174
DeltaFile
+34-27module/os/linux/zfs/zfs_ctldir.c
+34-271 files

OpenZFS/src 565e4c6 — man/man7 zfsconcepts.7, module/os/linux/zfs zfs_vfsops.c zfs_ctldir.c

Linux: report a snapshot's fsid from its .zfs/snapshot entry

statfs() on a control directory inode ('.zfs', '.zfs/snapshot', or an
unmounted snapshot entry reached without the automount) fails with EIO
because zfs_statvfs() verifies the znode's SA handle, which these inodes
lack.  Handle them explicitly: '.zfs' and '.zfs/snapshot' report the
containing filesystem, and a '.zfs/snapshot/<name>' entry reports the
fsid of its snapshot, read from the dataset's bonus buffer (the objset id
is encoded in the entry's inode number) without instantiating the
dataset, so a probe costs a few microseconds.

This identifies a snapshot without mounting it: open the entry with
O_PATH, which does not trigger the automount, and fstatfs() it.  The
value is what the snapshot's superblock reports once mounted, and path
based statfs() still automounts as before.  An NFS server resolving a
file handle for an unmounted snapshot (expired, or imported on another
node) can probe entries instead of mounting every snapshot until one
matches.  Add the statfs_nomount helper, the snapdir_statfs_fsid test
and a zfsconcepts(7) note.

    [5 lines not shown]
DeltaFile
+78-0tests/zfs-tests/tests/functional/snapdir/snapdir_statfs_fsid.ksh
+51-0tests/zfs-tests/cmd/statfs_nomount.c
+40-0module/os/linux/zfs/zfs_ctldir.c
+24-4module/os/linux/zfs/zfs_vfsops.c
+11-0man/man7/zfsconcepts.7
+1-1tests/runfiles/linux.run
+205-55 files not shown
+211-511 files

OpenZFS/src 1d9c32c — cmd/zpool zpool_vdev.c, man/man7 zpoolconcepts.7

zpool: accept more redundant special and dedup vdevs

The replication check required a special or dedup vdev to tolerate
exactly as many device failures as the normal vdevs in the pool.  A
3-way mirror special vdev on a raidz1 pool, or on a 2-way mirror pool,
was rejected as a mismatch, and the only way past it was -f, which
also overrides unrelated checks.

Accept a special or dedup vdev which tolerates at least as many
failures as the normal vdevs of a redundant pool.  Special and dedup
vdevs are now compared with the normal vdevs rather than with whichever
vdev happens to precede them, so normal vdevs are still required to
match each other.  Less redundant special or dedup vdevs, and redundant
ones added to a non-redundant pool, are still rejected.

As a side effect, a pool that already has a more redundant special
vdev is now considered consistent, so later additions to it are
checked instead of being skipped.


    [4 lines not shown]
DeltaFile
+144-107cmd/zpool/zpool_vdev.c
+74-0tests/zfs-tests/tests/functional/alloc_class/alloc_class_017_pos.ksh
+5-5man/man7/zpoolconcepts.7
+2-2tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos.ksh
+1-1tests/runfiles/common.run
+1-0tests/zfs-tests/tests/Makefile.am
+227-1156 files