Module Name: src
Committed By: pgoyette
Date: Thu Jul 28 23:59:15 UTC 2016
Modified Files:
src/sys/dev [pgoyette-localcount]: md.c
Log Message:
Since md(4) has a pointer from the softc back to the device_t, it is
OK for us to use device_lookup_private_acquire() rather than calling
device_lookup_acquire() followed by device_private().
So, redo earlier changes, which reduces diff to the original code at
the branch-point.
To generate a diff of this commit:
cvs rdiff -u -r1.76.2.5 -r1.76.2.6 src/sys/dev/md.c
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/md.c
diff -u src/sys/dev/md.c:1.76.2.5 src/sys/dev/md.c:1.76.2.6
--- src/sys/dev/md.c:1.76.2.5 Wed Jul 27 03:25:00 2016
+++ src/sys/dev/md.c Thu Jul 28 23:59:15 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: md.c,v 1.76.2.5 2016/07/27 03:25:00 pgoyette Exp $ */
+/* $NetBSD: md.c,v 1.76.2.6 2016/07/28 23:59:15 pgoyette Exp $ */
/*
* Copyright (c) 1995 Gordon W. Ross, Leo Weppelman.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: md.c,v 1.76.2.5 2016/07/27 03:25:00 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: md.c,v 1.76.2.6 2016/07/28 23:59:15 pgoyette Exp $");
#ifdef _KERNEL_OPT
#include "opt_md.h"
@@ -243,14 +243,12 @@ static int md_ioctl_kalloc(struct md_sof
static int
mdsize(dev_t dev)
{
- device_t self;
struct md_softc *sc;
int res;
- self = device_lookup_acquire(&md_cd, MD_UNIT(dev));
- if (self == NULL)
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(dev));
+ if (sc == NULL)
return 0;
- sc = device_private(self);
mutex_enter(&sc->sc_lock);
if (sc->sc_type == MD_UNCONFIGURED)
@@ -259,14 +257,14 @@ mdsize(dev_t dev)
res = sc->sc_size >> DEV_BSHIFT;
mutex_exit(&sc->sc_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return res;
}
static int
mdopen(dev_t dev, int flag, int fmt, struct lwp *l)
{
- device_t self;
+ device_t self, new_self;
int unit;
int part = DISKPART(dev);
int pmask = 1 << part;
@@ -279,9 +277,8 @@ mdopen(dev_t dev, int flag, int fmt, str
mutex_enter(&md_device_lock);
unit = MD_UNIT(dev);
- sc = NULL;
- self = device_lookup_acquire(&md_cd, unit);
- if (self == NULL) {
+ sc = device_lookup_private_acquire(&md_cd, unit);
+ if (sc == NULL) {
if (part != RAW_PART) {
mutex_exit(&md_device_lock);
return ENXIO;
@@ -291,19 +288,16 @@ mdopen(dev_t dev, int flag, int fmt, str
cf->cf_atname = md_cd.cd_name;
cf->cf_unit = unit;
cf->cf_fstate = FSTATE_STAR;
- self = config_attach_pseudo(cf);
- if (self != NULL) {
- device_acquire(self);
- sc = device_private(self);
- }
+ new_self = config_attach_pseudo(cf);
+ self = device_lookup_acquire(&md_cd, unit);
+ KASSERT(self == new_self);
+ sc = device_private(self);
if (sc == NULL) {
mutex_exit(&md_device_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return ENOMEM;
}
}
- else
- sc = device_private(self);
dk = &sc->sc_dkdev;
@@ -328,11 +322,11 @@ mdopen(dev_t dev, int flag, int fmt, str
*/
if (sc->sc_type == MD_UNCONFIGURED) {
mutex_exit(&md_device_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return ENXIO;
}
-ok:
+ ok:
/* XXX duplicates code in dk_open(). Call dk_open(), instead? */
mutex_enter(&dk->dk_openlock);
/* Mark our unit as open. */
@@ -349,14 +343,13 @@ ok:
mutex_exit(&dk->dk_openlock);
mutex_exit(&md_device_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return 0;
}
static int
mdclose(dev_t dev, int flag, int fmt, struct lwp *l)
{
- device_t self;
int part = DISKPART(dev);
int pmask = 1 << part;
int error;
@@ -364,10 +357,9 @@ mdclose(dev_t dev, int flag, int fmt, st
struct md_softc *sc;
struct disk *dk;
- self = device_lookup_acquire(&md_cd, MD_UNIT(dev));
- if (self == NULL)
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(dev));
+ if (sc == NULL)
return ENXIO;
- sc = device_private(self);
dk = &sc->sc_dkdev;
@@ -384,7 +376,7 @@ mdclose(dev_t dev, int flag, int fmt, st
dk->dk_openmask = dk->dk_copenmask | dk->dk_bopenmask;
if (dk->dk_openmask != 0) {
mutex_exit(&dk->dk_openlock);
- device_release(self);
+ device_release(sc->sc_dev);
return 0;
}
@@ -396,52 +388,48 @@ mdclose(dev_t dev, int flag, int fmt, st
if (! error)
free(cf, M_DEVBUF);
mutex_exit(&md_device_lock);
- device_release(self);
+ if (error)
+ device_release(sc->sc_dev);
return error;
}
static int
mdread(dev_t dev, struct uio *uio, int flags)
{
- device_t self;
struct md_softc *sc;
int error;
- self = device_lookup_acquire(&md_cd, MD_UNIT(dev));
- if (self == NULL)
- return ENXIO;
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(dev));
- sc = device_private(self);
if (sc == NULL || sc->sc_type == MD_UNCONFIGURED) {
- device_release(self);
+ if (sc != NULL)
+ device_release(sc->sc_dev);
return ENXIO;
}
error = (physio(mdstrategy, NULL, dev, B_READ, minphys, uio));
- device_release(self);
+ device_release(sc->sc_dev);
return error;
}
static int
mdwrite(dev_t dev, struct uio *uio, int flags)
{
- device_t self;
struct md_softc *sc;
int error;
- self = device_lookup_acquire(&md_cd, MD_UNIT(dev));
- if (self == NULL)
- return ENXIO;
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(dev));
- sc = device_private(self);
if (sc == NULL || sc->sc_type == MD_UNCONFIGURED) {
- device_release(self);
+ if (sc != NULL) {
+ device_release(sc->sc_dev);
+ }
return ENXIO;
}
- error = (physio(mdstrategy, NULL, dev, B_WRITE, minphys, uio));
+ error = physio(mdstrategy, NULL, dev, B_WRITE, minphys, uio);
- device_release(self);
+ device_release(sc->sc_dev);
return error;
}
@@ -452,20 +440,13 @@ mdwrite(dev_t dev, struct uio *uio, int
static void
mdstrategy(struct buf *bp)
{
- device_t self;
struct md_softc *sc;
void * addr;
size_t off, xfer;
bool is_read;
- self = device_lookup_acquire(&md_cd, MD_UNIT(bp->b_dev));
- if (self == NULL) {
- bp->b_error = ENXIO;
- goto done;
- }
-
- sc = device_private(self);
- if (sc->sc_type == MD_UNCONFIGURED) {
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(bp->b_dev));
+ if (sc == NULL || sc->sc_type == MD_UNCONFIGURED) {
bp->b_error = ENXIO;
goto done;
}
@@ -480,7 +461,7 @@ mdstrategy(struct buf *bp)
mutex_exit(&sc->sc_lock);
/* see md_server_loop() */
/* no biodone in this case */
- device_release(self);
+ device_release(sc->sc_dev);
return;
#endif /* MEMORY_DISK_SERVER */
@@ -518,29 +499,27 @@ mdstrategy(struct buf *bp)
mutex_exit(&sc->sc_lock);
done:
biodone(bp);
- if (self != NULL)
- device_release(self);
+ if (sc != NULL)
+ device_release(sc->sc_dev);
}
static int
mdioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
{
- device_t self;
struct md_softc *sc;
struct md_conf *umd;
int error;
- self = device_lookup_private(&md_cd, MD_UNIT(dev));
- if (self == NULL)
+ sc = device_lookup_private_acquire(&md_cd, MD_UNIT(dev));
+ if (sc == NULL)
return ENXIO;
- sc = device_private(self);
mutex_enter(&sc->sc_lock);
if (sc->sc_type != MD_UNCONFIGURED) {
error = disk_ioctl(&sc->sc_dkdev, dev, cmd, data, flag, l);
if (error != EPASSTHROUGH) {
mutex_exit(&sc->sc_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return 0;
}
}
@@ -548,7 +527,7 @@ mdioctl(dev_t dev, u_long cmd, void *dat
/* If this is not the raw partition, punt! */
if (DISKPART(dev) != RAW_PART) {
mutex_exit(&sc->sc_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return ENOTTY;
}
@@ -579,7 +558,7 @@ mdioctl(dev_t dev, u_long cmd, void *dat
break;
}
mutex_exit(&sc->sc_lock);
- device_release(self);
+ device_release(sc->sc_dev);
return error;
}