aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/module/os/linux/zfs
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2024-11-24 09:04:11 +0000
committerMartin Matuska <mm@FreeBSD.org>2024-11-24 09:04:51 +0000
commit718519f4efc71096422fc71dab90b2a3369871ff (patch)
treec1332c7c8f51dcf8917a68dd537df7ab5b40fa72 /sys/contrib/openzfs/module/os/linux/zfs
parenta46c121db4a50748eae0a32bed786f68349c95f5 (diff)
parentd0a91b9f88a47316158508bf304a61baa8c99c10 (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.c13
-rw-r--r--sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c2
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 =