Add a flags argument to the ld(4) flush handlers, and call these with a

"poll" flag when called from ld_shutdown().

This is the infrastructure part of kern/38655 - in itself it doesn't
fix the panic referenced in that PR.

XXX: At least ld_twa.c and perhaps ld_iop.c and ld_icp.c need to
check for this new poll flag and do something useful.
This commit is contained in:
simonb 2008-08-11 06:43:37 +00:00
parent ecd6bc7086
commit 82bb1c2ff8
5 changed files with 24 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ld_iop.c,v 1.29 2008/05/10 14:52:55 simonb Exp $ */
/* $NetBSD: ld_iop.c,v 1.30 2008/08/11 06:43:37 simonb Exp $ */
/*-
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ld_iop.c,v 1.29 2008/05/10 14:52:55 simonb Exp $");
__KERNEL_RCSID(0, "$NetBSD: ld_iop.c,v 1.30 2008/08/11 06:43:37 simonb Exp $");
#include "rnd.h"
@ -78,7 +78,7 @@ static void ld_iop_adjqparam(struct device *, int);
static void ld_iop_attach(struct device *, struct device *, void *);
static int ld_iop_detach(struct device *, int);
static int ld_iop_dump(struct ld_softc *, void *, int, int);
static int ld_iop_flush(struct ld_softc *);
static int ld_iop_flush(struct ld_softc *, int);
static void ld_iop_intr(struct device *, struct iop_msg *, void *);
static void ld_iop_intr_event(struct device *, struct iop_msg *, void *);
static int ld_iop_match(struct device *, struct cfdata *, void *);
@ -446,7 +446,7 @@ ld_iop_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
}
static int
ld_iop_flush(struct ld_softc *ld)
ld_iop_flush(struct ld_softc *ld, int flags)
{
struct iop_msg *im;
struct iop_softc *iop;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ld_icp.c,v 1.20 2008/04/28 20:23:50 martin Exp $ */
/* $NetBSD: ld_icp.c,v 1.21 2008/08/11 06:43:38 simonb Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ld_icp.c,v 1.20 2008/04/28 20:23:50 martin Exp $");
__KERNEL_RCSID(0, "$NetBSD: ld_icp.c,v 1.21 2008/08/11 06:43:38 simonb Exp $");
#include "rnd.h"
@ -70,7 +70,7 @@ int ld_icp_detach(struct device *, int);
int ld_icp_dobio(struct ld_icp_softc *, void *, int, int, int,
struct buf *);
int ld_icp_dump(struct ld_softc *, void *, int, int);
int ld_icp_flush(struct ld_softc *);
int ld_icp_flush(struct ld_softc *, int);
void ld_icp_intr(struct icp_ccb *);
int ld_icp_match(struct device *, struct cfdata *, void *);
int ld_icp_start(struct ld_softc *, struct buf *);
@ -265,7 +265,7 @@ ld_icp_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
}
int
ld_icp_flush(struct ld_softc *ld)
ld_icp_flush(struct ld_softc *ld, int flags)
{
struct ld_icp_softc *sc;
struct icp_softc *icp;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ld.c,v 1.61 2008/08/01 16:09:45 ws Exp $ */
/* $NetBSD: ld.c,v 1.62 2008/08/11 06:43:37 simonb Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.61 2008/08/01 16:09:45 ws Exp $");
__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.62 2008/08/11 06:43:37 simonb Exp $");
#include "rnd.h"
@ -253,7 +253,7 @@ ldenddetach(struct ld_softc *sc)
#if 0
/* Flush the device's cache. */
if (sc->sc_flush != NULL)
if ((*sc->sc_flush)(sc) != 0)
if ((*sc->sc_flush)(sc, 0) != 0)
aprint_error_dev(&sc->sc_dv, "unable to flush cache\n");
#endif
mutex_destroy(&sc->sc_mutex);
@ -265,7 +265,7 @@ ld_shutdown(device_t dev, int flags)
{
struct ld_softc *sc = device_private(dev);
if (sc->sc_flush != NULL && (*sc->sc_flush)(sc) != 0) {
if (sc->sc_flush != NULL && (*sc->sc_flush)(sc, LDFL_POLL) != 0) {
printf("%s: unable to flush cache\n", device_xname(dev));
return false;
}
@ -345,7 +345,7 @@ ldclose(dev_t dev, int flags, int fmt, struct lwp *l)
sc->sc_dk.dk_copenmask | sc->sc_dk.dk_bopenmask;
if (sc->sc_dk.dk_openmask == 0) {
if (sc->sc_flush != NULL && (*sc->sc_flush)(sc) != 0)
if (sc->sc_flush != NULL && (*sc->sc_flush)(sc, 0) != 0)
aprint_error_dev(&sc->sc_dv, "unable to flush cache\n");
if ((sc->sc_flags & LDF_KLABEL) == 0)
sc->sc_flags &= ~LDF_VLABEL;
@ -487,7 +487,7 @@ ldioctl(dev_t dev, u_long cmd, void *addr, int32_t flag, struct lwp *l)
if ((flag & FWRITE) == 0)
error = EBADF;
else if (sc->sc_flush)
error = (*sc->sc_flush)(sc);
error = (*sc->sc_flush)(sc, 0);
else
error = 0; /* XXX Error out instead? */
break;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ldvar.h,v 1.13 2008/04/28 20:23:46 martin Exp $ */
/* $NetBSD: ldvar.h,v 1.14 2008/08/11 06:43:37 simonb Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -57,10 +57,11 @@ struct ld_softc {
int sc_maxqueuecnt; /* maximum h/w queue depth */
int (*sc_dump)(struct ld_softc *, void *, int, int);
int (*sc_flush)(struct ld_softc *);
int (*sc_flush)(struct ld_softc *, int);
int (*sc_start)(struct ld_softc *, struct buf *);
};
/* sc_flags */
#define LDF_ENABLED 0x001 /* device enabled */
#define LDF_WLABEL 0x008 /* label is writable */
#define LDF_LABELLING 0x010 /* writing label */
@ -69,6 +70,9 @@ struct ld_softc {
#define LDF_KLABEL 0x080 /* keep label on close */
#define LDF_VLABEL 0x100 /* label is valid */
/* sc_flush() flags */
#define LDFL_POLL 0x001 /* poll for completion */
int ldadjqparam(struct ld_softc *, int);
void ldattach(struct ld_softc *);
int ldbegindetach(struct ld_softc *, int);

View File

@ -1,5 +1,5 @@
/* $wasabi: ld_twa.c,v 1.9 2006/02/14 18:44:37 jordanr Exp $ */
/* $NetBSD: ld_twa.c,v 1.11 2008/05/07 17:47:20 joerg Exp $ */
/* $NetBSD: ld_twa.c,v 1.12 2008/08/11 06:43:38 simonb Exp $ */
/*-
* Copyright (c) 2000, 2001, 2002, 2003, 2004 The NetBSD Foundation, Inc.
@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ld_twa.c,v 1.11 2008/05/07 17:47:20 joerg Exp $");
__KERNEL_RCSID(0, "$NetBSD: ld_twa.c,v 1.12 2008/08/11 06:43:38 simonb Exp $");
#include "rnd.h"
@ -81,7 +81,7 @@ static int ld_twa_detach(struct device *, int);
static int ld_twa_dobio(struct ld_twa_softc *, void *, size_t, daddr_t,
struct buf *);
static int ld_twa_dump(struct ld_softc *, void *, int, int);
static int ld_twa_flush(struct ld_softc *);
static int ld_twa_flush(struct ld_softc *, int);
static void ld_twa_handler(struct twa_request *);
static int ld_twa_match(struct device *, struct cfdata *, void *);
static int ld_twa_start(struct ld_softc *, struct buf *);
@ -243,7 +243,7 @@ ld_twa_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
static int
ld_twa_flush(struct ld_softc *ld)
ld_twa_flush(struct ld_softc *ld, int flags)
{
int s, rv = 0;
struct twa_request *tr;