Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/prg-localcount2]: src/sys/dev/mscp Adapt to device_lookup_acquire
details: https://anonhg.NetBSD.org/src/rev/97bda937d024
branches: prg-localcount2
changeset: 823553:97bda937d024
user: pgoyette <pgoyette%NetBSD.org@localhost>
date: Wed May 17 04:26:14 2017 +0000
description:
Adapt to device_lookup_acquire
diffstat:
sys/dev/mscp/mscp_disk.c | 72 ++++++++++++++++++++++++++++++++----------------
1 files changed, 48 insertions(+), 24 deletions(-)
diffs (191 lines):
diff -r f9a1fc010c5f -r 97bda937d024 sys/dev/mscp/mscp_disk.c
--- a/sys/dev/mscp/mscp_disk.c Wed May 17 04:08:36 2017 +0000
+++ b/sys/dev/mscp/mscp_disk.c Wed May 17 04:26:14 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mscp_disk.c,v 1.89.8.2 2017/05/14 13:02:35 pgoyette Exp $ */
+/* $NetBSD: mscp_disk.c,v 1.89.8.3 2017/05/17 04:26:14 pgoyette Exp $ */
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
@@ -82,7 +82,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mscp_disk.c,v 1.89.8.2 2017/05/14 13:02:35 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mscp_disk.c,v 1.89.8.3 2017/05/17 04:26:14 pgoyette Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@@ -271,7 +271,7 @@
if ((error = tsleep((void *)ra, (PZERO + 1) | PCATCH,
devopn, 0))) {
splx(s);
- return (error);
+ goto bad2;
}
#endif
@@ -289,6 +289,8 @@
error = 0;
bad1:
mutex_exit(&ra->ra_disk.dk_openlock);
+ bad2:
+ device_release(ra->ra_dev);
return (error);
}
@@ -328,6 +330,7 @@
}
#endif
mutex_exit(&ra->ra_disk.dk_openlock);
+ device_release(ra->ra_dev);
return (0);
}
@@ -345,7 +348,7 @@
*/
if (ra == NULL) {
bp->b_error = ENXIO;
- goto done;
+ goto done1;
}
/*
* If drive is open `raw' or reading label, let it at it.
@@ -356,6 +359,7 @@
disk_busy(&ra->ra_disk);
splx(b);
mscp_strategy(bp, device_parent(ra->ra_dev));
+ device_release(ra->ra_dev);
return;
}
@@ -378,9 +382,12 @@
disk_busy(&ra->ra_disk);
splx(b);
mscp_strategy(bp, device_parent(ra->ra_dev));
+ device_release(ra->ra_dev);
return;
-done:
+ done:
+ device_release(ra->ra_dev);
+ done1:
biodone(bp);
}
@@ -414,9 +421,10 @@
lp = ra->ra_disk.dk_label;
error = disk_ioctl(&ra->ra_disk, dev, cmd, data, flag, l);
- if (error != EPASSTHROUGH)
+ if (error != EPASSTHROUGH) {
+ device_release(ra->ra_dev);
return error;
- else
+ } else
error = 0;
switch (cmd) {
@@ -489,6 +497,7 @@
error = ENOTTY;
break;
}
+ device_release(ra->ra_dev);
return (error);
}
@@ -504,17 +513,22 @@
int
rasize(dev_t dev)
{
+ int rv;
struct ra_softc *ra = mscp_device_lookup(dev);
if (!ra)
return -1;
if (ra->ra_state == DK_CLOSED)
- if (ra_putonline(dev, ra) == MSCP_FAILED)
+ if (ra_putonline(dev, ra) == MSCP_FAILED) {
+ device_release(ra->ra_dev);
return -1;
+ }
- return ra->ra_disk.dk_label->d_partitions[DISKPART(dev)].p_size *
+ rv = ra->ra_disk.dk_label->d_partitions[DISKPART(dev)].p_size *
(ra->ra_disk.dk_label->d_secsize / DEV_BSIZE);
+ device_release(ra->ra_dev);
+ return rv;
}
#endif /* NRA || NRACD || NRX */
@@ -1107,6 +1121,7 @@
mp->mscp_seq.seq_lbn = lp->d_partitions[part].p_offset + bp->b_blkno;
mp->mscp_unit = ra->ra_hwunit;
mp->mscp_seq.seq_bytecount = bp->b_bcount;
+ device_release(ra->ra_dev);
}
/*
@@ -1166,37 +1181,46 @@
return MSCP_DONE;
}
-/* XXX
- * This code needs to be restructured to deal with the localcount(9)
- * referencing counting on {b,c}devsw. Since we're returning the
- * softc address here, we need to use cdevsw_lookup_acquire() to
- * keep a reference to the device. So all callers need to be able
- * to determine which device's cdevsw needs to be released later on.
- * XXX
- */
static inline struct ra_softc *
mscp_device_lookup(dev_t dev)
{
+ const struct dev_cdevsw;
struct ra_softc *ra;
int unit;
unit = DISKUNIT(dev);
+ ra = NULL;
#if NRA
- if (cdevsw_lookup(dev) == &ra_cdevsw)
+ if (( dev_cdevsw = cdevsw_lookup_acquire(dev)) == &ra_cdevsw) {
ra = device_lookup_private(&ra_cd, unit);
- else
+ cdevsw_release(dev_cdevsw);
+ return ra;
+ } else
+ cdevsw_release(dev_cdevsw);
#endif
#if NRACD
- if (cdevsw_lookup(dev) == &racd_cdevsw)
+ if ((dev_cdevsw = cdevsw_lookup(dev)) == &racd_cdevsw) {
ra = device_lookup_private(&racd_cd, unit);
- else
+ cdevsw_release(dev_cdevsw);
+ return ra;
+ } else
+ cdevsw_release(dev_cdevsw);
#endif
#if NRX
if (cdevsw_lookup(dev) == &rx_cdevsw)
ra = device_lookup_private(&rx_cd, unit);
+ cdevsw_release(dev_cdevsw);
+ return ra;
else
+ cdevsw_release(dev_cdevsw);
#endif
- panic("mscp_device_lookup: unexpected major %"PRIu32" unit %u",
- major(dev), unit);
- return ra;
+ panic("mscp_device_lookup: unexpected major %"PRIu32" unit %u",
+ major(dev), unit);
}
+
+static void
+mscp_devsw_release(struct ra_softc *sc)
+{
+
+ device_release(sc->ra_dev);
+}
Home |
Main Index |
Thread Index |
Old Index