mirror_zfs/module/os/linux/zfs
Fabian-Gruenbichler fa2cbd4007 zvols: prevent overflow of minor device numbers
currently, the linux kernel allows 2^20 minor devices per major device
number.  ZFS reserves blocks of 2^4 minors per zvol: 1 for the zvol
itself, the other 15 for the first partitions of that zvol. as a result,
only 2^16 such blocks are available for use.

there are no checks in place to avoid overflowing into the major device
number when more than 2^16 zvols are allocated (with volmode=dev or
default). instead of ignoring this limit, which comes with all sorts of
weird knock-on effects, detect this situation and simply fail allocating
the zvol block device early on.

without this safeguard, the kernel will reject the attempt to create an
already existing block device, but ZFS doesn't handle this error and
gets confused about which zvol occupies which minor slot, potentially
resulting in kernel NULL derefs and other issues later on.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Closes #16006
2024-04-22 09:23:23 -07:00
..
abd_os.c abd_iter_page: don't use compound heads on Linux <4.5 2024-03-28 13:29:46 -07:00
arc_os.c linux 6.7 compat: rework shrinker setup for heap allocations 2023-12-21 11:03:08 -08:00
mmp_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
policy.c Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
qat_compress.c Intel QAT 1.7 compatibility 2023-09-07 16:10:52 -07:00
qat_crypt.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
qat.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spa_misc_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
trace.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
vdev_disk.c vdev_disk: fix alignment check when buffer has non-zero starting offset 2024-04-12 08:53:48 -07:00
vdev_file.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
zfs_acl.c Use list_remove_head() where possible. 2023-06-09 10:12:52 -07:00
zfs_ctldir.c linux 6.7 compat: use inode atime/mtime accessors 2023-12-21 11:03:08 -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 Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
zfs_file_os.c Cleanup: Remove branches that always evaluate the same way 2022-11-03 10:47:48 -07:00
zfs_ioctl_os.c Linux 6.3 compat: idmapped mount API changes 2023-04-10 14:15:36 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_sysfs.c Introduce kmem_scnprintf() 2022-10-29 13:05:11 -07:00
zfs_uio.c zvol: Remove broken blk-mq optimization 2023-11-06 16:47:24 -08:00
zfs_vfsops.c linux 6.7 compat: handle superblock shrinker member change 2023-12-21 11:03:08 -08:00
zfs_vnops_os.c Refactor dmu_prefetch(). 2024-04-19 10:13:38 -07:00
zfs_znode.c linux 6.7 compat: use inode atime/mtime accessors 2023-12-21 11:03:08 -08:00
zio_crypt.c ZIL: Assert record sizes in different places 2024-01-08 16:11:39 -08:00
zpl_ctldir.c Linux 6.6 compat: generic_fillattr has a new u32 request_mask added at arg2 2023-11-08 12:15:41 -08:00
zpl_export.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zpl_file_range.c Linux 6.8 compat: use splice_copy_file_range() for fallback 2024-03-21 09:35:17 -07:00
zpl_file.c Fix corruption caused by mmap flushing problems 2024-03-29 17:10:04 -07:00
zpl_inode.c linux 6.7 compat: use inode atime/mtime accessors 2023-12-21 11:03:08 -08:00
zpl_super.c Unify arc_prune_async() code 2023-11-08 12:15:41 -08:00
zpl_xattr.c Linux 6.6 compat: use inode_get/set_ctime*(...) 2023-11-08 12:15:41 -08:00
zvol_os.c zvols: prevent overflow of minor device numbers 2024-04-22 09:23:23 -07:00