diff options
author | Martin Matuska <mm@FreeBSD.org> | 2024-11-24 09:04:11 +0000 |
---|---|---|
committer | Martin Matuska <mm@FreeBSD.org> | 2024-11-24 09:04:51 +0000 |
commit | 718519f4efc71096422fc71dab90b2a3369871ff (patch) | |
tree | c1332c7c8f51dcf8917a68dd537df7ab5b40fa72 /sys/contrib/openzfs/module/os/linux/zfs | |
parent | a46c121db4a50748eae0a32bed786f68349c95f5 (diff) | |
parent | d0a91b9f88a47316158508bf304a61baa8c99c10 (diff) |
zfs: merge openzfs/zfs@d0a91b9f8
Notable upstream pull request merges:
#16643 -multiple Change rangelock handling in FreeBSD's zfs_getpages()
#16697 46c4f2ce0 dsl_dataset: put IO-inducing frees on the pool deadlist
#16740 -multiple BRT: Rework structures and locks to be per-vdev
#16743 a60ed3822 L2ARC: Move different stats updates earlier
#16758 8dc452d90 Fix some nits in zfs_getpages()
#16759 534688948 Remove hash_elements_max accounting from DBUF and ARC
#16766 9a81484e3 ZAP: Reduce leaf array and free chunks fragmentation
#16773 457f8b76e BRT: More optimizations after per-vdev splitting
#16782 0ca82c568 L2ARC: Stop rebuild before setting spa_final_txg
#16785 d76d79fd2 zio: Avoid sleeping in the I/O path
#16791 ae1d11882 BRT: Clear bv_entcount_dirty on destroy
#16796 b3b0ce64d FreeBSD: Lock vnode in zfs_ioctl()
#16797 d0a91b9f8 FreeBSD: Reduce copy_file_range() source lock to shared
Obtained from: OpenZFS
OpenZFS commit: d0a91b9f88a47316158508bf304a61baa8c99c10
Diffstat (limited to 'sys/contrib/openzfs/module/os/linux/zfs')
-rw-r--r-- | sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c | 13 | ||||
-rw-r--r-- | sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c b/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c index 287f5f36f9dd..b97b701b7460 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c @@ -375,7 +375,18 @@ zpl_prune_sb(uint64_t nr_to_scan, void *arg) struct super_block *sb = (struct super_block *)arg; int objects = 0; - (void) -zfs_prune(sb, nr_to_scan, &objects); + /* + * deactivate_locked_super calls shrinker_free and only then + * sops->kill_sb cb, resulting in UAF on umount when trying to reach + * for the shrinker functions in zpl_prune_sb of in-umount dataset. + * Increment if s_active is not zero, but don't prune if it is - + * umount could be underway. + */ + if (atomic_inc_not_zero(&sb->s_active)) { + (void) -zfs_prune(sb, nr_to_scan, &objects); + atomic_dec(&sb->s_active); + } + } const struct super_operations zpl_super_operations = { diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c b/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c index 2396690b40fd..47aa6417068d 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c @@ -1176,7 +1176,7 @@ zvol_queue_limits_init(zvol_queue_limits_t *limits, zvol_state_t *zv, limits->zql_max_segment_size = UINT_MAX; } - limits->zql_io_opt = zv->zv_volblocksize; + limits->zql_io_opt = DMU_MAX_ACCESS / 2; limits->zql_physical_block_size = zv->zv_volblocksize; limits->zql_max_discard_sectors = |