Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern When a device driver calls devsw_attach() it has th...



details:   https://anonhg.NetBSD.org/src/rev/5011c578b805
branches:  trunk
changeset: 373498:5011c578b805
user:      buhrow <buhrow%NetBSD.org@localhost>
date:      Mon Feb 13 19:07:14 2023 +0000

description:
When a device driver calls devsw_attach() it has the option of attaching a block device
structure and a character device structure, or, just the character device structure.
With the existing code, if a driver elects not to attach a block device structure and if it
asks for a major number to be dynamically assigned to its character interface,
that driver will not be able to detach and reattach its character driver interface.  This is a very
long standing bug which didn't come to light until we began using loadable kernel modules more
heavily.  this patch fixes this problem.  With this patch in place, drivers that implement only
a character device interface may detach and reattach that character interface as often as they
need to.

Fixes PR kern/57229

diffstat:

 sys/kern/subr_devsw.c |  6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diffs (27 lines):

diff -r 4ac0d2169d45 -r 5011c578b805 sys/kern/subr_devsw.c
--- a/sys/kern/subr_devsw.c     Mon Feb 13 14:05:26 2023 +0000
+++ b/sys/kern/subr_devsw.c     Mon Feb 13 19:07:14 2023 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: subr_devsw.c,v 1.49 2022/10/29 10:52:36 riastradh Exp $        */
+/*     $NetBSD: subr_devsw.c,v 1.50 2023/02/13 19:07:14 buhrow Exp $   */
 
 /*-
  * Copyright (c) 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.49 2022/10/29 10:52:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.50 2023/02/13 19:07:14 buhrow Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dtrace.h"
@@ -397,7 +397,7 @@
                if (conv->d_name == NULL || strcmp(devname, conv->d_name) != 0)
                        continue;
 
-               if (*bmajor < 0)
+               if ((bdev != NULL) && (*bmajor < 0)) 
                        *bmajor = conv->d_bmajor;
                if (*cmajor < 0)
                        *cmajor = conv->d_cmajor;



Home | Main Index | Thread Index | Old Index