diff -r 0b295f2a2ec2 sys/dev/dkwedge/dk.c
--- sys/dev/dkwedge/dk.c	Sat Apr 23 10:04:45 2022 +0200
+++ sys/dev/dkwedge/dk.c	Sat Apr 23 10:09:39 2022 +0200
@@ -1592,6 +1592,7 @@ dkdiscard(dev_t dev, off_t pos, off_t le
 	struct dkwedge_softc *sc = dkwedge_lookup(dev);
 	unsigned shift;
 	off_t offset, maxlen;
+	int error;
 
 	if (sc == NULL)
 		return (ENODEV);
@@ -1615,7 +1616,12 @@ dkdiscard(dev_t dev, off_t pos, off_t le
 		return (EINVAL);
 
 	pos += offset;
-	return VOP_FDISCARD(sc->sc_parent->dk_rawvp, pos, len);
+
+	vn_lock(sc->sc_parent->dk_rawvp, LK_EXCLUSIVE | LK_RETRY);
+	error = VOP_FDISCARD(sc->sc_parent->dk_rawvp, pos, len);
+	VOP_UNLOCK(sc->sc_parent->dk_rawvp);
+
+	return error;
 }
 
 /*
diff -r 0b295f2a2ec2 sys/ufs/ffs/ffs_alloc.c
--- sys/ufs/ffs/ffs_alloc.c	Sat Apr 23 10:04:45 2022 +0200
+++ sys/ufs/ffs/ffs_alloc.c	Sat Apr 23 10:09:39 2022 +0200
@@ -1,3 +1,4 @@
+#define TRIMDEBUG
 /*	$NetBSD: ffs_alloc.c,v 1.170 2021/09/03 21:55:01 andvar Exp $	*/
 
 /*-
@@ -1649,10 +1650,12 @@ ffs_discardcb(struct work *wk, void *arg
 
 	start = FFS_FSBTOBYTES(fs, td->bno);
 	len = td->size;
+	vn_lock(td->devvp, LK_EXCLUSIVE | LK_RETRY);
 #ifdef TRIMDEBUG
 	error =
 #endif
 		VOP_FDISCARD(td->devvp, start, len);
+	VOP_UNLOCK(td->devvp);
 #ifdef TRIMDEBUG
 	printf("trim(%" PRId64 ",%ld):%d\n", td->bno, td->size, error);
 #endif
