mirror_zfs/module/os/freebsd/zfs
Rob Norris cf80a803d5 zvol: ensure device minors are properly cleaned up
Currently, if a minor is in use when we try to remove it, we'll skip it
and never come back to it again. Since the zvol state is hung off the
minor in the kernel, this can get us into weird situations if something
tries to use it after the removal fails. It's even worse at pool export,
as there's now a vestigial zvol state with no pool under it. It's
weirder again if the pool is subsequently reimported, as the zvol code
(reasonably) assumes the zvol state has been properly setup, when it's
actually left over from the previous import of the pool.

This commit attempts to tackle that by setting a flag on the zvol if its
minor can't be removed, and then checking that flag when a request is
made and rejecting it, thus stopping new work coming in.

The flag also causes a condvar to be signaled when the last client
finishes. For the case where a single minor is being removed (eg
changing volmode), it will wait for this signal before proceeding.
Meanwhile, when removing all minors, a background task is created for
each minor that couldn't be removed on the spot, and those tasks then
wake and clean up.

Since any new tasks are queued on to the pool's spa_zvol_taskq,
spa_export_common() will continue to wait at export until all minors are
removed.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #14872
Closes #16364
2024-11-15 10:14:50 -08:00
..
abd_os.c Linux: Report reclaimable memory to kernel as such (#16385) 2024-11-14 15:20:06 -08:00
arc_os.c Unify arc_prune_async() code 2023-11-08 12:15:41 -08:00
crypto_os.c FreeBSD: Improve crypto_dispatch() handling 2022-06-17 15:38:51 -07:00
dmu_os.c dmu: Allow buffer fills to fail 2024-02-20 15:53:02 -08:00
event_os.c FreeBSD: Fix the build on FreeBSD 12 2023-11-28 15:19:07 -08:00
hkdf.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00
kmod_core.c FreeBSD: Reduce divergence from in-tree sources 2023-10-10 19:19:09 -07:00
spa_os.c Fix build on FreeBSD 2023-03-22 09:24:41 -07:00
sysctl_os.c Reduce number of metaslab preload taskq threads. 2023-10-07 09:08:20 -07:00
vdev_file.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
vdev_geom.c Replace P2ALIGN with P2ALIGN_TYPED and delete P2ALIGN. 2024-05-13 10:27:38 -05:00
vdev_label_os.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zfs_acl.c Fix an uninitialized data access (#16511) 2024-11-05 15:43:52 -08:00
zfs_ctldir.c FreeBSD: Fix ZFS so that snapshots under .zfs/snapshot are NFS visible 2023-11-29 14:08:46 -08:00
zfs_debug.c Cleanup: Replace oldstyle struct hack with C99 flexible array members 2023-01-12 16:00:03 -08:00
zfs_dir.c FreeBSD: Add zfs_link_create() error handling 2024-05-29 08:54:19 -07:00
zfs_file_os.c Fix file descriptor leak on pool import. 2024-01-26 13:38:25 -08:00
zfs_ioctl_compat.c freebsd: add ifdefs around legacy ioctl support 2022-11-07 15:55:26 -08:00
zfs_ioctl_os.c FreeBSD: make zfs_vfs_held() definition consistent with declaration 2023-04-21 10:22:52 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_vfsops.c BRT: Fix FICLONE/FICLONERANGE shortened copy 2024-02-06 10:01:15 -08:00
zfs_vnops_os.c FreeBSD: Fix RLIMIT_FSIZE handling for block cloning 2024-08-22 15:17:21 -07:00
zfs_znode.c Linux: Report reclaimable memory to kernel as such (#16385) 2024-11-14 15:20:06 -08:00
zio_crypt.c Fix gcc uninitialized warning in FreeBSD zio_crypt.c 2024-11-06 10:06:29 -08:00
zvol_os.c zvol: ensure device minors are properly cleaned up 2024-11-15 10:14:50 -08:00