mirror_zfs/module/os/linux/zfs
Brian Behlendorf a4831fa023 Fix zvol_open() lock inversion
When restructuring the zvol_open() logic for the Linux 5.13 kernel
a lock inversion was accidentally introduced.  In the updated code
the spa_namespace_lock is now taken before the zv_suspend_lock
allowing the following scenario to occur:

    down_read <=== waiting for zv_suspend_lock
    zvol_open <=== holds spa_namespace_lock
    __blkdev_get
    blkdev_get_by_dev
    blkdev_open
    ...

     mutex_lock <== waiting for spa_namespace_lock
     spa_open_common
     spa_open
     dsl_pool_hold
     dmu_objset_hold_flags
     dmu_objset_hold
     dsl_prop_get
     dsl_prop_get_integer
     zvol_create_minor
     dmu_recv_end
     zfs_ioc_recv_impl <=== holds zv_suspend_lock via zvol_suspend()
     zfs_ioc_recv
     ...

This commit resolves the issue by moving the acquisition of the
spa_namespace_lock back to after the zv_suspend_lock which restores
the original ordering.

Additionally, as part of this change the error exit paths were
simplified where possible.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Rich Ercolani <rincebrain@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #12863
2021-12-22 09:31:58 -08:00
..
abd_os.c Include scatter_chunk_waste in arc_size 2020-08-17 20:04:04 -07:00
arc_os.c Linux 5.9 compat: NR_SLAB_RECLAIMABLE 2020-08-30 14:18:50 -07:00
Makefile.in Restore FreeBSD resource usage accounting 2021-03-05 12:50:32 -08:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Linux 5.12 compat: idmapped mounts 2021-06-23 13:22:15 -07:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c Linux 5.16: The blk-cgroup.h header is where struct blkcg_gq is defined 2021-12-07 13:15:12 -08:00
vdev_file.c vdev_ashift should only be set once 2020-09-18 12:40:20 -07:00
zfs_acl.c Use fallthrough macro 2021-11-12 15:24:36 -08:00
zfs_ctldir.c Linux: always check or verify return of igrab() 2021-06-23 13:22:15 -07:00
zfs_debug.c FreeBSD: Add support for procfs_list 2020-10-01 12:18:56 -07:00
zfs_dir.c Throw const on some strings 2020-10-16 12:55:56 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-09-22 15:19:08 -07:00
zfs_ioctl_os.c Simple change to fix building in recent environments 2021-06-23 13:22:15 -07:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-03-05 12:50:32 -08:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_uio.c Extending FreeBSD UIO Struct 2021-11-12 16:31:55 -08:00
zfs_vfsops.c Linux: always check or verify return of igrab() 2021-06-23 13:22:15 -07:00
zfs_vnops_os.c Linux 5.16: wait_on_page_bit() no longer available to modules 2021-12-06 13:40:43 -08:00
zfs_znode.c Use fallthrough macro 2021-11-12 15:24:36 -08:00
zio_crypt.c Extending FreeBSD UIO Struct 2021-11-12 16:31:55 -08:00
zpl_ctldir.c Linux 5.12 compat: idmapped mounts 2021-06-23 13:22:15 -07:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Linux 5.16: type member of iov_iter renamed iter_type 2021-12-07 13:15:11 -08:00
zpl_inode.c Extending FreeBSD UIO Struct 2021-11-12 16:31:55 -08:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:51:27 -08:00
zpl_xattr.c Extending FreeBSD UIO Struct 2021-11-12 16:31:55 -08:00
zvol_os.c Fix zvol_open() lock inversion 2021-12-22 09:31:58 -08:00