diff options
| author | riastradh <riastradh@NetBSD.org> | 2023-05-22 14:59:25 +0000 |
|---|---|---|
| committer | riastradh <riastradh@NetBSD.org> | 2023-05-22 14:59:25 +0000 |
| commit | f02816aceb52e8120f3a33d4328cea33f609dd84 (patch) | |
| tree | 6d0ff25d7a5ba148f8a68b9019f9770bf607770d /sys/dev | |
| parent | 114491a5a056f9a452ed6c1d44346f4a1a643c7b (diff) | |
dk(4): Split unsafe lookups into safe subroutines and unsafe wrappers.
No functional change intended.
Eventually we should adjust the callers to use the safe subroutines
instead and device_release when done.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/dkwedge/dk.c | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c index c81f65e3972..20d16630531 100644 --- a/sys/dev/dkwedge/dk.c +++ b/sys/dev/dkwedge/dk.c @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.164 2023/05/22 14:59:16 riastradh Exp $ */ +/* $NetBSD: dk.c,v 1.165 2023/05/22 14:59:25 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.164 2023/05/22 14:59:16 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.165 2023/05/22 14:59:25 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -883,8 +883,8 @@ dkwedge_list(struct disk *pdk, struct dkwedge_list *dkwl, struct lwp *l) return error; } -device_t -dkwedge_find_by_wname(const char *wname) +static device_t +dkwedge_find_by_wname_acquire(const char *wname) { device_t dv = NULL; struct dkwedge_softc *sc; @@ -902,6 +902,7 @@ dkwedge_find_by_wname(const char *wname) device_xname(sc->sc_dev)); continue; } + device_acquire(sc->sc_dev); dv = sc->sc_dev; } } @@ -909,8 +910,8 @@ dkwedge_find_by_wname(const char *wname) return dv; } -device_t -dkwedge_find_by_parent(const char *name, size_t *i) +static device_t +dkwedge_find_by_parent_acquire(const char *name, size_t *i) { rw_enter(&dkwedges_lock, RW_READER); @@ -920,6 +921,7 @@ dkwedge_find_by_parent(const char *name, size_t *i) continue; if (strcmp(sc->sc_parent->dk_name, name) != 0) continue; + device_acquire(sc->sc_dev); rw_exit(&dkwedges_lock); return sc->sc_dev; } @@ -927,6 +929,30 @@ dkwedge_find_by_parent(const char *name, size_t *i) return NULL; } +/* XXX unsafe */ +device_t +dkwedge_find_by_wname(const char *wname) +{ + device_t dv; + + if ((dv = dkwedge_find_by_wname_acquire(wname)) == NULL) + return NULL; + device_release(dv); + return dv; +} + +/* XXX unsafe */ +device_t +dkwedge_find_by_parent(const char *name, size_t *i) +{ + device_t dv; + + if ((dv = dkwedge_find_by_parent_acquire(name, i)) == NULL) + return NULL; + device_release(dv); + return dv; +} + void dkwedge_print_wnames(void) { @@ -1845,8 +1871,9 @@ dkdump(dev_t dev, daddr_t blkno, void *va, size_t size) * Find wedge corresponding to the specified parent name * and offset/length. */ -device_t -dkwedge_find_partition(device_t parent, daddr_t startblk, uint64_t nblks) +static device_t +dkwedge_find_partition_acquire(device_t parent, daddr_t startblk, + uint64_t nblks) { struct dkwedge_softc *sc; int i; @@ -1867,6 +1894,7 @@ dkwedge_find_partition(device_t parent, daddr_t startblk, uint64_t nblks) continue; } wedge = sc->sc_dev; + device_acquire(wedge); } } rw_exit(&dkwedges_lock); @@ -1874,6 +1902,20 @@ dkwedge_find_partition(device_t parent, daddr_t startblk, uint64_t nblks) return wedge; } +/* XXX unsafe */ +device_t +dkwedge_find_partition(device_t parent, daddr_t startblk, + uint64_t nblks) +{ + device_t dv; + + if ((dv = dkwedge_find_partition_acquire(parent, startblk, nblks)) + == NULL) + return NULL; + device_release(dv); + return dv; +} + const char * dkwedge_get_parent_name(dev_t dev) { |
