mirror_zfs/module/os/linux/zfs
Brian Behlendorf 8a02d01e85
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-17 09:52:13 -08:00
..
abd_os.c Avoid small buffer copying on write 2021-07-27 16:05:47 -07:00
arc_os.c Remove b_pabd/b_rabd allocation from arc_hdr_alloc() 2021-08-17 10:15:54 -06:00
Makefile.in Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -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-03-19 21:00:59 -07:00
qat_compress.c Modify checksum obtain method of QAT 2021-08-03 11:46:33 -06: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 12:28:12 -08:00
vdev_file.c Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
zfs_acl.c Use fallthrough macro 2021-09-14 10:17:54 -06:00
zfs_ctldir.c Workaround issue cleaning up automounted snapshots on Linux 2021-11-03 09:00:08 -06:00
zfs_debug.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zfs_dir.c Clean up use of zfs_log_create in zfs_dir 2021-05-07 15:13:10 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-07-10 19:00:37 -06:00
zfs_ioctl_os.c libzfs: On FreeBSD, use MNT_NOWAIT with getfsstat 2021-06-08 07:36:43 -06:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
zfs_sysfs.c Vdev Properties Feature 2021-11-30 07:46:25 -07:00
zfs_uio.c Removing old code for k(un)map_atomic 2021-03-19 22:38:44 -07:00
zfs_vfsops.c Remove unimplemented virus scanning hooks 2021-05-10 22:02:25 -07:00
zfs_vnops_os.c Linux 5.16: wait_on_page_bit() no longer available to modules 2021-11-29 10:48:52 -08:00
zfs_znode.c Use fallthrough macro 2021-09-14 10:17:54 -06:00
zio_crypt.c gcc 11 cleanup 2021-06-23 17:57:06 -06:00
zpl_ctldir.c Linux 5.12 compat: idmapped mounts 2021-03-19 21:00:59 -07:00
zpl_export.c Return required size when encode_fh size too small 2021-05-07 15:08:16 -07:00
zpl_file.c Linux 5.16: type member of iov_iter renamed iter_type 2021-12-07 12:27:49 -08:00
zpl_inode.c Linux 4.11 compat: statx support 2021-08-17 10:25:58 -07:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_xattr.c Linux 5.15 compat: get_acl() 2021-09-09 09:38:35 -07:00
zvol_os.c Fix zvol_open() lock inversion 2021-12-17 09:52:13 -08:00