Module Name: src Committed By: riastradh Date: Tue May 9 12:04:04 UTC 2023
Modified Files: src/sys/dev/dkwedge: dk.c src/sys/kern: subr_disk.c src/sys/sys: disk.h Log Message: ioctl(DIOCRMWEDGES): Delete only idle wedges. Don't forcibly delete busy wedges. Reported-by: syzbot+e46f31fe56e04f567...@syzkaller.appspotmail.com https://syzkaller.appspot.com/bug?id=8a00fd7f2e7459748d7a274098180a4708ff0f61 Fixes accidental destruction of the busy wedge that the root file system is mounted on, triggered by syzbot's ioctl(DIOCRMWEDGES). To generate a diff of this commit: cvs rdiff -u -r1.153 -r1.154 src/sys/dev/dkwedge/dk.c cvs rdiff -u -r1.136 -r1.137 src/sys/kern/subr_disk.c cvs rdiff -u -r1.77 -r1.78 src/sys/sys/disk.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/dkwedge/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.153 src/sys/dev/dkwedge/dk.c:1.154 --- src/sys/dev/dkwedge/dk.c:1.153 Tue May 9 12:03:55 2023 +++ src/sys/dev/dkwedge/dk.c Tue May 9 12:04:04 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.153 2023/05/09 12:03:55 riastradh Exp $ */ +/* $NetBSD: dk.c,v 1.154 2023/05/09 12:04:04 riastradh Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.153 2023/05/09 12:03:55 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.154 2023/05/09 12:04:04 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -774,14 +774,27 @@ dkwedge_detach(device_t self, int flags) /* * dkwedge_delall: [exported function] * - * Delete all of the wedges on the specified disk. Used when - * a disk is being detached. + * Forcibly delete all of the wedges on the specified disk. Used + * when a disk is being detached. */ void dkwedge_delall(struct disk *pdk) { - dkwedge_delall1(pdk, false); + dkwedge_delall1(pdk, /*idleonly*/false); +} + +/* + * dkwedge_delidle: [exported function] + * + * Delete all of the wedges on the specified disk if idle. Used + * by ioctl(DIOCRMWEDGES). + */ +void +dkwedge_delidle(struct disk *pdk) +{ + + dkwedge_delall1(pdk, /*idleonly*/true); } static void @@ -1065,7 +1078,7 @@ dkwedge_discover(struct disk *pdk) /* * Remove unused wedges */ - dkwedge_delall1(pdk, true); + dkwedge_delidle(pdk); /* * For each supported partition map type, look to see if Index: src/sys/kern/subr_disk.c diff -u src/sys/kern/subr_disk.c:1.136 src/sys/kern/subr_disk.c:1.137 --- src/sys/kern/subr_disk.c:1.136 Sat Apr 22 11:58:01 2023 +++ src/sys/kern/subr_disk.c Tue May 9 12:04:04 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_disk.c,v 1.136 2023/04/22 11:58:01 riastradh Exp $ */ +/* $NetBSD: subr_disk.c,v 1.137 2023/05/09 12:04:04 riastradh Exp $ */ /*- * Copyright (c) 1996, 1997, 1999, 2000, 2009 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.136 2023/04/22 11:58:01 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.137 2023/05/09 12:04:04 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -655,7 +655,7 @@ disk_ioctl(struct disk *dk, dev_t dev, u if ((flag & FWRITE) == 0) return EBADF; - dkwedge_delall(dk); + dkwedge_delidle(dk); return 0; default: Index: src/sys/sys/disk.h diff -u src/sys/sys/disk.h:1.77 src/sys/sys/disk.h:1.78 --- src/sys/sys/disk.h:1.77 Sat Jul 24 21:31:39 2021 +++ src/sys/sys/disk.h Tue May 9 12:04:04 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: disk.h,v 1.77 2021/07/24 21:31:39 andvar Exp $ */ +/* $NetBSD: disk.h,v 1.78 2023/05/09 12:04:04 riastradh Exp $ */ /*- * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc. @@ -552,6 +552,7 @@ void dkwedge_init(void); int dkwedge_add(struct dkwedge_info *); int dkwedge_del(struct dkwedge_info *); void dkwedge_delall(struct disk *); +void dkwedge_delidle(struct disk *); int dkwedge_list(struct disk *, struct dkwedge_list *, struct lwp *); void dkwedge_discover(struct disk *); int dkwedge_read(struct disk *, struct vnode *, daddr_t, void *, size_t);