zfs/include/os/freebsd/spl/sys
Mariusz Zaborski 40a9efd0e8 zfs: support force exporting pools
This is primarily of use when a pool has lost its disk, while the user
doesn't care about any pending (or otherwise) transactions.

Implement various control methods to make this feasible:
- txg_wait can now take a NOSUSPEND flag, in which case the caller will
  be alerted if their txg can't be committed.  This is primarily of
  interest for callers that would normally pass TXG_WAIT, but don't want
  to wait if the pool becomes suspended, which allows unwinding in some
  cases, specifically when one is attempting a non-forced export.
  Without this, the non-forced export would preclude a forced export
  by virtue of holding the namespace lock indefinitely.
- txg_wait also returns failure for TXG_WAIT users if a pool is actually
  being force exported.  Adjust most callers to tolerate this.
- spa_config_enter_flags now takes a NOSUSPEND flag to the same effect.
- DMU objset initiator which may be set on an objset being forcibly
  exported / unmounted.
- SPA export initiator may be set on a pool being forcibly exported.
- DMU send/recv now use an interruption mechanism which relies on the
  SPA export initiator being able to enumerate datasets and closing any
  send/recv streams, causing their EINTR paths to be invoked.
- ZIO now has a cancel entry point, which tells all suspended zios to
  fail, and which suppresses the failures for non-CANFAIL users.
- metaslab, etc. cleanup, which consists of simply throwing away any
  changes that were not able to be synced out.
- Linux specific: introduce a new tunable,
  zfs_forced_export_unmount_enabled, which allows the filesystem to
  remain in a modified 'unmounted' state upon exiting zpl_umount_begin,
  to achieve parity with FreeBSD and illumos,
  which have VFS-level support for yanking filesystems out from under
  users.  However, this only helps when the user is actively performing
  I/O, while not sitting on the filesystem.  In particular, this allows
  test #3 below to pass on Linux.
- Add basic logic to zpool to indicate a force-exporting pool, instead
  of crashing due to lack of config, etc.

Add tests which cover the basic use cases:
- Force export while a send is in progress
- Force export while a recv is in progress
- Force export while POSIX I/O is in progress

This change modifies the libzfs ABI:
- New ZPOOL_STATUS_FORCE_EXPORTING zpool_status_t enum value.
- New field libzfs_force_export for libzfs_handle.

Signed-off-by: Will Andrews <will@firepipe.net>
Signed-off-by: Allan Jude <allan@klarasystems.com>
Signed-off-by: Mariusz Zaborski <mariusz.zaborski@klarasystems.com>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Sponsored-by:  Klara, Inc.
Sponsored-by:  Catalogics, Inc.
Sponsored-by:  Wasabi Technology, Inc.
Closes #3461
(cherry picked from commit 852e633772217d779a63e8c46fe3c5f81dd8960e)
2023-07-05 13:27:30 +00:00
..
Makefile.am Fix ACL checks for NFS kernel server 2022-03-20 21:21:18 -07:00
acl.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
acl_impl.h Remove pragma ident lines 2020-08-26 10:35:50 -07:00
atomic.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
byteorder.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
callb.h Fix typos 2020-06-09 21:24:09 -07:00
ccompat.h FreeBSD: Add support for lockless lookup 2020-08-05 10:19:51 -07:00
ccompile.h FreeBSD: fix HEAD build, conditionally remove FDSYNC defines 2021-01-23 15:39:55 -08:00
cmn_err.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
condvar.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
cred.h Fix ACL checks for NFS kernel server 2022-03-20 21:21:18 -07:00
ctype.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
debug.h Microoptimizations for VERIFY() and friends 2021-03-11 17:16:09 -08:00
dirent.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
disp.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
dkio.h Remove unnecessary references to slavery 2020-06-10 17:07:59 -07:00
extdirent.h Remove pragma ident lines 2020-08-26 10:35:50 -07:00
fcntl.h FreeBSD: fix HEAD build, conditionally remove FDSYNC defines 2021-01-23 15:39:55 -08:00
file.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
freebsd_rwlock.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
idmap.h FreeBSD: Fix UNIX permissions checking 2020-08-18 09:57:07 -07:00
inttypes.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
isa_defs.h Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
kmem.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
kmem_cache.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
kstat.h Remove pool io kstats 2021-06-10 10:50:16 -07:00
list.h Remove pragma ident lines 2020-08-26 10:35:50 -07:00
list_impl.h Remove pragma ident lines 2020-08-26 10:35:50 -07:00
lock.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
misc.h Consolidate zfs_holey and zfs_access 2020-10-31 09:40:08 -07:00
mod_os.h Restore FreeBSD sysctl processing for arc.min and arc.max 2021-09-14 14:31:01 -07:00
mode.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
mount.h freebsd: changes necessary to coexist with dtrace in tree 2020-07-01 09:10:08 -07:00
mutex.h FreeBSD: Don't require zeroing new locks before init 2020-06-13 10:58:10 -07:00
param.h Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
policy.h Share zfs_fsync, zfs_read, zfs_write, et al between Linux and FreeBSD 2020-10-21 14:08:06 -07:00
proc.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
processor.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
procfs_list.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
random.h FreeBSD: fix compilation of FreeBSD world after 29274c9f6 2021-11-02 13:35:47 -07:00
rwlock.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
sdt.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
sid.h Fix ACL checks for NFS kernel server 2022-03-20 21:21:18 -07:00
sig.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
simd.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
simd_x86.h FreeBSD: Sort out kernel FPU headers for 12.1-REL 2020-10-02 17:48:45 -07:00
spl_condvar.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
string.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
strings.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
sunddi.h Replace ZFS on Linux references with OpenZFS 2020-10-08 20:10:13 -07:00
sysmacros.h Introduce CPU_SEQID_UNSTABLE 2020-11-02 11:51:12 -08:00
systeminfo.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
systm.h Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
taskq.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
thread.h zfs: support force exporting pools 2023-07-05 13:27:30 +00:00
time.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
timer.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
trace.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
trace_zfs.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
types.h FreeBSD: minor_t needs to be signed so that -1 is recognized as such 2021-01-07 10:41:27 -08:00
types32.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
uio.h Cleaning up uio headers 2021-02-20 20:16:50 -08:00
uuid.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
vfs.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
vm.h Use new FreeBSD API to largely eliminate object locking 2020-04-17 09:30:26 -07:00
vmsystm.h Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
vnode.h FreeBSD: Provide correct file generation number 2022-02-03 15:28:01 -08:00
vnode_impl.h Fix various typos 2021-04-07 13:27:11 -07:00
wmsum.h Introduce write-mostly sums 2021-06-09 13:05:34 -07:00
zmod.h Remove pragma ident lines 2020-08-26 10:35:50 -07:00
zone.h FreeBSD: Simplify INGLOBALZONE 2020-08-31 19:43:08 -07:00