summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe/rf_netbsdkintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/raidframe/rf_netbsdkintf.c')
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c1487
1 files changed, 638 insertions, 849 deletions
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index ad6673541cc..e0ca8caa0f1 100644
--- a/sys/dev/raidframe/rf_netbsdkintf.c
+++ b/sys/dev/raidframe/rf_netbsdkintf.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: rf_netbsdkintf.c,v 1.1 1999/01/11 14:29:30 niklas Exp $ */
-/* $NetBSD: rf_netbsdkintf.c,v 1.5 1998/12/22 20:03:14 oster Exp $ */
+/* $OpenBSD: rf_netbsdkintf.c,v 1.2 1999/02/16 00:02:59 niklas Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.10 1999/02/11 01:23:32 oster Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -113,189 +113,8 @@
* rf_kintf.c -- the kernel interface routines for RAIDframe
*
***********************************************************/
-/*
- * :
- * Log: rf_kintf.c,v
- * Revision 1.57 1996/07/19 16:12:20 jimz
- * remove addition of protectedSectors in InitBP- it's already
- * done in the diskqueue code
- *
- * Revision 1.56 1996/07/17 21:00:58 jimz
- * clean up timer interface, tracing
- *
- * Revision 1.55 1996/06/17 03:00:54 jimz
- * Change RAIDFRAME_GET_INFO interface to do its own copyout()
- * (because size of device config structure now exceeds 8k)
- *
- * Revision 1.54 1996/06/09 02:36:46 jimz
- * lots of little crufty cleanup- fixup whitespace
- * issues, comment #ifdefs, improve typing in some
- * places (esp size-related)
- *
- * Revision 1.53 1996/06/07 21:33:04 jimz
- * begin using consistent types for sector numbers,
- * stripe numbers, row+col numbers, recon unit numbers
- *
- * Revision 1.52 1996/06/06 17:28:08 jimz
- * track sector number of last I/O dequeued
- *
- * Revision 1.51 1996/06/05 18:06:02 jimz
- * Major code cleanup. The Great Renaming is now done.
- * Better modularity. Better typing. Fixed a bunch of
- * synchronization bugs. Made a lot of global stuff
- * per-desc or per-array. Removed dead code.
- *
- * Revision 1.50 1996/06/03 23:28:26 jimz
- * more bugfixes
- * check in tree to sync for IPDS runs with current bugfixes
- * there still may be a problem with threads in the script test
- * getting I/Os stuck- not trivially reproducible (runs ~50 times
- * in a row without getting stuck)
- *
- * Revision 1.49 1996/06/02 17:31:48 jimz
- * Moved a lot of global stuff into array structure, where it belongs.
- * Fixed up paritylogging, pss modules in this manner. Some general
- * code cleanup. Removed lots of dead code, some dead files.
- *
- * Revision 1.48 1996/05/31 22:26:54 jimz
- * fix a lot of mapping problems, memory allocation problems
- * found some weird lock issues, fixed 'em
- * more code cleanup
- *
- * Revision 1.47 1996/05/30 12:59:18 jimz
- * make etimer happier, more portable
- *
- * Revision 1.46 1996/05/30 11:29:41 jimz
- * Numerous bug fixes. Stripe lock release code disagreed with the taking code
- * about when stripes should be locked (I made it consistent: no parity, no lock)
- * There was a lot of extra serialization of I/Os which I've removed- a lot of
- * it was to calculate values for the cache code, which is no longer with us.
- * More types, function, macro cleanup. Added code to properly quiesce the array
- * on shutdown. Made a lot of stuff array-specific which was (bogusly) general
- * before. Fixed memory allocation, freeing bugs.
- *
- * Revision 1.45 1996/05/27 18:56:37 jimz
- * more code cleanup
- * better typing
- * compiles in all 3 environments
- *
- * Revision 1.44 1996/05/24 22:17:04 jimz
- * continue code + namespace cleanup
- * typed a bunch of flags
- *
- * Revision 1.43 1996/05/24 01:59:45 jimz
- * another checkpoint in code cleanup for release
- * time to sync kernel tree
- *
- * Revision 1.42 1996/05/23 22:17:54 jimz
- * fix sector size hardcoding problems
- *
- * Revision 1.41 1996/05/23 21:46:35 jimz
- * checkpoint in code cleanup (release prep)
- * lots of types, function names have been fixed
- *
- * Revision 1.40 1996/05/23 13:18:07 jimz
- * tracing_mutex -> rf_tracing_mutex
- *
- * Revision 1.39 1996/05/23 00:33:23 jimz
- * code cleanup: move all debug decls to rf_options.c, all extern
- * debug decls to rf_options.h, all debug vars preceded by rf_
- *
- * Revision 1.38 1996/05/20 16:15:32 jimz
- * switch to rf_{mutex,cond}_{init,destroy}
- *
- * Revision 1.37 1996/05/10 16:23:47 jimz
- * RF_offset -> RF_Offset
- *
- * Revision 1.36 1996/05/08 21:01:24 jimz
- * fixed up enum type names that were conflicting with other
- * enums and function names (ie, "panic")
- * future naming trends will be towards RF_ and rf_ for
- * everything raidframe-related
- *
- * Revision 1.35 1996/05/03 19:10:48 jimz
- * change sanity checking for bogus I/Os to return more appropriate
- * values (to make some user-level utilities happer with RAIDframe)
- *
- * Revision 1.34 1996/05/02 22:17:00 jimz
- * When using DKUSAGE, send a bogus IO after configuring to let DKUSAGE know
- * that we exist. This will let user-level programs doing group stats on the
- * RF device function without error before RF gets its first IO
- *
- * Changed rf_device_config devs and spares fields to RF_RaidDisk_t
- *
- * Inc numOutstanding for the disk queue in rf_DispatchKernelIO if
- * type is IO_TYPE_NOP. I'm not sure this is right, but it seems to be,
- * because the disk IO completion routine wants to dec it, and doesn't
- * care if there was no such IO.
- *
- * Revision 1.33 1996/05/02 15:05:44 jimz
- * for now, rf_DoAccessKernel will reject non-sector-sized I/Os
- * eventually, it should do something more clever...
- * (and do it in DoAccess(), not just DoAccessKernel())
- *
- * Revision 1.32 1996/05/01 16:28:39 jimz
- * get rid of uses of ccmn_ functions
- *
- * Revision 1.31 1996/05/01 15:42:17 jimz
- * ccmn_* memory management is on the way out. This is an archival checkpoint-
- * both the old and new code are in place (all the ccmn_ calls are #if 0). After
- * this, the ccmn_ code will no longer appear.
- *
- * Revision 1.30 1996/04/22 15:53:13 jimz
- * MAX_RAIDS -> NRAIDFRAME
- *
- * Revision 1.29 1995/12/12 18:10:06 jimz
- * MIN -> RF_MIN, MAX -> RF_MAX, ASSERT -> RF_ASSERT
- * fix 80-column brain damage in comments
- *
- * Revision 1.28 1995/12/01 19:11:01 root
- * added copyright info
- *
- * Revision 1.27 1995/11/28 18:56:40 wvcii
- * disabled buffer copy in rf_write
- *
- * Revision 1.26 1995/10/06 16:37:08 jimz
- * get struct bufs from ubc, not cam
- * copy all write data, and operate on copy
- * (temporary hack to get around dags in PQ that want
- * to Xor into user write buffers)
- *
- * Revision 1.25 1995/09/30 22:23:08 jimz
- * do not require raid to be active to perform ACCTOTAL ioctl
- *
- * Revision 1.24 1995/09/30 20:39:08 jimz
- * added new ioctls:
- * RAIDFRAME_RESET_ACCTOTALS
- * RAIDFRAME_GET_ACCTOTALS
- * RAIDFRAME_KEEP_ACCTOTALS
- *
- * Revision 1.23 1995/09/20 21:11:59 jimz
- * include dfstrace.h in KERNEL block
- * (even though it's a kernel-only file, this makes the depend process
- * at user-level happy. Why the user-level Makefile wants to depend
- * kintf.c is less clear, but this is a workaround).
- *
- * Revision 1.22 1995/09/19 23:19:03 jimz
- * added DKUSAGE support
- *
- */
-
-
-
-
-#ifdef _KERNEL
-#define KERNEL
-#endif
-
-
-
-#ifdef KERNEL
#include <sys/errno.h>
-
-#ifdef __NetBSD__
-#include "raid.h"
#include <sys/param.h>
#include <sys/pool.h>
#include <sys/queue.h>
@@ -307,25 +126,16 @@
#include <sys/systm.h>
#include <sys/namei.h>
#include <sys/vnode.h>
-#endif
-
#include <sys/param.h>
#include <sys/types.h>
-
#include <machine/types.h>
-
#include <sys/disklabel.h>
-
#include <sys/conf.h>
-
-
-#ifdef __NetBSD__
#include <sys/lock.h>
-#endif /* __NetBSD__ */
-
-
#include <sys/buf.h>
#include <sys/user.h>
+
+#include "raid.h"
#include "rf_raid.h"
#include "rf_raidframe.h"
#include "rf_dag.h"
@@ -342,7 +152,7 @@
#include "rf_debugprint.h"
#include "rf_threadstuff.h"
-int rf_kdebug_level = 0;
+int rf_kdebug_level = 0;
#define RFK_BOOT_NONE 0
#define RFK_BOOT_GOOD 1
@@ -357,40 +167,43 @@ static int rf_kbooted = RFK_BOOT_NONE;
#define db3_printf(a) if (rf_kdebug_level > 2) printf a
#define db4_printf(a) if (rf_kdebug_level > 3) printf a
#define db5_printf(a) if (rf_kdebug_level > 4) printf a
-#else /* DEBUG */
+#else /* DEBUG */
#define db0_printf(a) printf a
#define db1_printf(a) { }
#define db2_printf(a) { }
#define db3_printf(a) { }
#define db4_printf(a) { }
#define db5_printf(a) { }
-#endif /* DEBUG */
+#endif /* DEBUG */
-static RF_Raid_t **raidPtrs; /* global raid device descriptors */
+static RF_Raid_t **raidPtrs; /* global raid device descriptors */
static int rf_pending_testaccs;
RF_DECLARE_STATIC_MUTEX(rf_sparet_wait_mutex)
RF_DECLARE_STATIC_MUTEX(rf_async_done_q_mutex)
-static RF_SparetWait_t *rf_sparet_wait_queue; /* requests to install a spare table */
-static RF_SparetWait_t *rf_sparet_resp_queue; /* responses from installation process */
-static struct rf_test_acc *rf_async_done_qh, *rf_async_done_qt;
-
-static struct rf_recon_req *recon_queue = NULL; /* used to communicate reconstruction requests */
-
+static RF_SparetWait_t *rf_sparet_wait_queue; /* requests to install a
+ * spare table */
+static RF_SparetWait_t *rf_sparet_resp_queue; /* responses from
+ * installation process */
+static struct rf_test_acc *rf_async_done_qh, *rf_async_done_qt;
-decl_simple_lock_data(,recon_queue_mutex)
+static struct rf_recon_req *recon_queue = NULL; /* used to communicate
+ * reconstruction
+ * requests */
+decl_simple_lock_data(, recon_queue_mutex)
#define LOCK_RECON_Q_MUTEX() simple_lock(&recon_queue_mutex)
#define UNLOCK_RECON_Q_MUTEX() simple_unlock(&recon_queue_mutex)
/* prototypes */
-static void KernelWakeupFunc(struct buf *bp);
-static void InitBP(struct buf *bp, struct vnode *, unsigned rw_flag, dev_t dev,
- RF_SectorNum_t startSect, RF_SectorCount_t numSect, caddr_t buf,
- void (*cbFunc)(struct buf *), void *cbArg, int logBytesPerSector,
- struct proc *b_proc);
+static void KernelWakeupFunc(struct buf * bp);
+static void InitBP(struct buf * bp, struct vnode *, unsigned rw_flag,
+ dev_t dev, RF_SectorNum_t startSect,
+ RF_SectorCount_t numSect, caddr_t buf,
+ void (*cbFunc) (struct buf *), void *cbArg,
+ int logBytesPerSector, struct proc * b_proc);
#define Dprintf0(s) if (rf_queueDebug) rf_debug_printf(s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
#define Dprintf1(s,a) if (rf_queueDebug) rf_debug_printf(s,a,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
@@ -401,52 +214,52 @@ static void InitBP(struct buf *bp, struct vnode *, unsigned rw_flag, dev_t dev,
/* this is so that we can compile under 2.0 as well as 3.2 */
#ifndef proc_to_task
#define proc_to_task(x) ((x)->task)
-#endif /* !proc_to_task */
+#endif /* !proc_to_task */
-void raidattach __P((int));
-int raidsize __P((dev_t));
+void raidattach __P((int));
+int raidsize __P((dev_t));
-void rf_DiskIOComplete(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
-void rf_CopybackReconstructedData(RF_Raid_t *raidPtr);
-static int raidinit __P((dev_t,RF_Raid_t *,int));
+void rf_DiskIOComplete(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
+void rf_CopybackReconstructedData(RF_Raid_t * raidPtr);
+static int raidinit __P((dev_t, RF_Raid_t *, int));
-int raidopen __P((dev_t, int, int, struct proc *));
-int raidclose __P((dev_t, int, int, struct proc *));
-int raidioctl __P((dev_t, u_long, caddr_t, int, struct proc *));
-int raidwrite __P((dev_t, struct uio *, int));
-int raidread __P((dev_t, struct uio *, int));
-void raidstrategy __P((struct buf *));
-int raiddump __P((dev_t, daddr_t, caddr_t, size_t));
+int raidopen __P((dev_t, int, int, struct proc *));
+int raidclose __P((dev_t, int, int, struct proc *));
+int raidioctl __P((dev_t, u_long, caddr_t, int, struct proc *));
+int raidwrite __P((dev_t, struct uio *, int));
+int raidread __P((dev_t, struct uio *, int));
+void raidstrategy __P((struct buf *));
+int raiddump __P((dev_t, daddr_t, caddr_t, size_t));
/*
* Pilfered from ccd.c
*/
struct raidbuf {
- struct buf rf_buf; /* new I/O buf. MUST BE FIRST!!! */
- struct buf *rf_obp; /* ptr. to original I/O buf */
- int rf_flags; /* misc. flags */
- RF_DiskQueueData_t *req; /* the request that this was part of.. */
+ struct buf rf_buf; /* new I/O buf. MUST BE FIRST!!! */
+ struct buf *rf_obp; /* ptr. to original I/O buf */
+ int rf_flags; /* misc. flags */
+ RF_DiskQueueData_t *req; /* the request that this was
+ * part of.. */
};
#define RAIDGETBUF(rs) pool_get(&(rs)->sc_cbufpool, PR_NOWAIT)
#define RAIDPUTBUF(rs, cbp) pool_put(&(rs)->sc_cbufpool, cbp)
-/* XXX Not sure if the following should be replacing the raidPtrs above,
-or if it should be used in conjunction with that... */
+/* XXX Not sure if the following should be replacing the raidPtrs above,
+ or if it should be used in conjunction with that... */
struct raid_softc {
- int sc_unit; /* logical unit number */
- int sc_flags; /* flags */
- int sc_cflags; /* configuration flags */
- size_t sc_size; /* size of the raid device */
- dev_t sc_dev; /* our device..*/
- char sc_xname[20]; /* XXX external name */
- struct disk sc_dkdev; /* generic disk device info */
- struct pool sc_cbufpool; /* component buffer pool */
+ int sc_unit;/* logical unit number */
+ int sc_flags; /* flags */
+ int sc_cflags; /* configuration flags */
+ size_t sc_size;/* size of the raid device */
+ dev_t sc_dev; /* our device.. */
+ char sc_xname[20]; /* XXX external name */
+ struct disk sc_dkdev; /* generic disk device info */
+ struct pool sc_cbufpool; /* component buffer pool */
};
-
/* sc_flags */
#define RAIDF_INITED 0x01 /* unit has been initialized */
#define RAIDF_WLABEL 0x02 /* label area is writable */
@@ -455,7 +268,7 @@ struct raid_softc {
#define RAIDF_LOCKED 0x80 /* unit is locked */
#define raidunit(x) DISKUNIT(x)
-static int numraid=0;
+static int numraid = 0;
#define RAIDLABELDEV(dev) \
(MAKEDISKDEV(major((dev)), raidunit((dev)), RAW_PART))
@@ -463,23 +276,24 @@ static int numraid=0;
/* declared here, and made public, for the benefit of KVM stuff.. */
struct raid_softc *raid_softc;
-static void raidgetdefaultlabel __P((RF_Raid_t *, struct raid_softc *, struct disklabel *));
-static void raidgetdisklabel __P((dev_t));
-static void raidmakedisklabel __P((struct raid_softc *));
+static void raidgetdefaultlabel __P((RF_Raid_t *, struct raid_softc *,
+ struct disklabel *));
+static void raidgetdisklabel __P((dev_t));
+static void raidmakedisklabel __P((struct raid_softc *));
-static int raidlock __P((struct raid_softc *));
-static void raidunlock __P((struct raid_softc *));
-int raidlookup __P((char *, struct proc *p, struct vnode **));
+static int raidlock __P((struct raid_softc *));
+static void raidunlock __P((struct raid_softc *));
+int raidlookup __P((char *, struct proc * p, struct vnode **));
void
raidattach(num)
- int num;
+ int num;
{
- int raidID;
+ int raidID;
#ifdef DEBUG
- printf("raidattach: Asked for %d units\n",num);
+ printf("raidattach: Asked for %d units\n", num);
#endif
if (num <= 0) {
@@ -488,9 +302,7 @@ raidattach(num)
#endif
return;
}
- /*
- This is where all the initialization stuff gets done.
- */
+ /* This is where all the initialization stuff gets done. */
/* Make some space for requested number of units... */
@@ -498,24 +310,18 @@ raidattach(num)
if (raidPtrs == NULL) {
panic("raidPtrs is NULL!!\n");
}
-
-
-
rf_kbooted = rf_boot();
if (rf_kbooted) {
panic("Serious error booting RAID!!\n");
}
-
- rf_kbooted = RFK_BOOT_GOOD;
-
- /*
- put together some datastructures like the CCD device does..
- This lets us lock the device and what-not when it gets opened.
- */
-
+ rf_kbooted = RFK_BOOT_GOOD;
+
+ /* put together some datastructures like the CCD device does.. This
+ * lets us lock the device and what-not when it gets opened. */
+
raid_softc = (struct raid_softc *)
- malloc(num * sizeof(struct raid_softc),
- M_DEVBUF, M_NOWAIT);
+ malloc(num * sizeof(struct raid_softc),
+ M_RAIDFRAME, M_NOWAIT);
if (raid_softc == NULL) {
printf("WARNING: no memory for RAIDframe driver\n");
return;
@@ -523,11 +329,11 @@ raidattach(num)
numraid = num;
bzero(raid_softc, num * sizeof(struct raid_softc));
- for(raidID=0;raidID < num;raidID++) {
- RF_Calloc(raidPtrs[raidID], 1, sizeof(RF_Raid_t),
- (RF_Raid_t *));
- if (raidPtrs[raidID]==NULL) {
- printf("raidPtrs[%d] is NULL\n",raidID);
+ for (raidID = 0; raidID < num; raidID++) {
+ RF_Calloc(raidPtrs[raidID], 1, sizeof(RF_Raid_t),
+ (RF_Raid_t *));
+ if (raidPtrs[raidID] == NULL) {
+ printf("raidPtrs[%d] is NULL\n", raidID);
}
}
}
@@ -535,11 +341,11 @@ raidattach(num)
int
raidsize(dev)
- dev_t dev;
+ dev_t dev;
{
struct raid_softc *rs;
struct disklabel *lp;
- int part, unit, omask, size;
+ int part, unit, omask, size;
unit = raidunit(dev);
if (unit >= numraid)
@@ -571,50 +377,48 @@ raidsize(dev)
int
raiddump(dev, blkno, va, size)
- dev_t dev;
+ dev_t dev;
daddr_t blkno;
caddr_t va;
- size_t size;
+ size_t size;
{
/* Not implemented. */
return ENXIO;
}
-
/* ARGSUSED */
int
raidopen(dev, flags, fmt, p)
- dev_t dev;
- int flags, fmt;
+ dev_t dev;
+ int flags, fmt;
struct proc *p;
{
- int unit = raidunit(dev);
+ int unit = raidunit(dev);
struct raid_softc *rs;
struct disklabel *lp;
- int part,pmask;
+ int part, pmask;
unsigned int raidID;
- int rc;
- int error = 0;
-
- /* This whole next chunk of code is somewhat suspect... Not sure
- it's needed here at all... XXX */
+ int rc;
+ int error = 0;
+
+ /* This whole next chunk of code is somewhat suspect... Not sure it's
+ * needed here at all... XXX */
- if (rf_kbooted == RFK_BOOT_NONE) {
+ if (rf_kbooted == RFK_BOOT_NONE) {
printf("Doing restart on raidopen.\n");
rf_kbooted = RFK_BOOT_GOOD;
rc = rf_boot();
if (rc) {
rf_kbooted = RFK_BOOT_BAD;
printf("Someone is unhappy...\n");
- return(rc);
+ return (rc);
}
}
-
if (unit >= numraid)
return (ENXIO);
rs = &raid_softc[unit];
if ((error = raidlock(rs)) != 0)
- return(error);
+ return (error);
lp = rs->sc_dkdev.dk_label;
raidID = raidunit(dev);
@@ -623,12 +427,12 @@ raidopen(dev, flags, fmt, p)
pmask = (1 << part);
db1_printf(("Opening raid device number: %d partition: %d\n",
- raidID,part));
+ raidID, part));
if ((rs->sc_flags & RAIDF_INITED) &&
(rs->sc_dkdev.dk_openmask == 0))
- raidgetdisklabel(dev);
+ raidgetdisklabel(dev);
/* make sure that this partition exists */
@@ -636,14 +440,13 @@ raidopen(dev, flags, fmt, p)
db1_printf(("Not a raw partition..\n"));
if (((rs->sc_flags & RAIDF_INITED) == 0) ||
((part >= lp->d_npartitions) ||
- (lp->d_partitions[part].p_fstype == FS_UNUSED))) {
+ (lp->d_partitions[part].p_fstype == FS_UNUSED))) {
error = ENXIO;
raidunlock(rs);
db1_printf(("Bailing out...\n"));
- return(error);
+ return (error);
}
}
-
/* Prevent this unit from being unconfigured while open. */
switch (fmt) {
case S_IFCHR:
@@ -659,22 +462,21 @@ raidopen(dev, flags, fmt, p)
raidunlock(rs);
- return(error);
+ return (error);
}
-
/* ARGSUSED */
int
raidclose(dev, flags, fmt, p)
- dev_t dev;
- int flags, fmt;
+ dev_t dev;
+ int flags, fmt;
struct proc *p;
{
- int unit = raidunit(dev);
+ int unit = raidunit(dev);
struct raid_softc *rs;
- int error = 0;
- int part;
+ int error = 0;
+ int part;
if (unit >= numraid)
return (ENXIO);
@@ -713,16 +515,16 @@ raidstrategy(bp)
RF_Raid_t *raidPtr;
struct raid_softc *rs = &raid_softc[raidID];
struct disklabel *lp;
- int wlabel;
+ int wlabel;
#if 0
- db1_printf(("Strategy: 0x%x 0x%x\n",bp,bp->b_data));
- db1_printf(("Strategy(2): bp->b_bufsize%d\n", (int)bp->b_bufsize));
- db1_printf(("bp->b_count=%d\n",(int)bp->b_bcount));
- db1_printf(("bp->b_resid=%d\n",(int)bp->b_resid));
- db1_printf(("bp->b_blkno=%d\n",(int)bp->b_blkno));
+ db1_printf(("Strategy: 0x%x 0x%x\n", bp, bp->b_data));
+ db1_printf(("Strategy(2): bp->b_bufsize%d\n", (int) bp->b_bufsize));
+ db1_printf(("bp->b_count=%d\n", (int) bp->b_bcount));
+ db1_printf(("bp->b_resid=%d\n", (int) bp->b_resid));
+ db1_printf(("bp->b_blkno=%d\n", (int) bp->b_blkno));
- if (bp->b_flags&B_READ)
+ if (bp->b_flags & B_READ)
db1_printf(("READ\n"));
else
db1_printf(("WRITE\n"));
@@ -756,45 +558,43 @@ raidstrategy(bp)
* error, the bounds check will flag that for us.
*/
- wlabel = rs->sc_flags & (RAIDF_WLABEL|RAIDF_LABELLING);
+ wlabel = rs->sc_flags & (RAIDF_WLABEL | RAIDF_LABELLING);
if (DISKPART(bp->b_dev) != RAW_PART)
if (bounds_check_with_label(bp, lp, wlabel) <= 0) {
db1_printf(("Bounds check failed!!:%d %d\n",
- (int)bp->b_blkno,(int)wlabel));
+ (int) bp->b_blkno, (int) wlabel));
biodone(bp);
return;
}
-
- s = splbio(); /* XXX Needed? */
+ s = splbio(); /* XXX Needed? */
db1_printf(("Beginning strategy...\n"));
-
+
bp->b_resid = 0;
- bp->b_error = rf_DoAccessKernel(raidPtrs[raidID], bp,
- NULL, NULL, NULL);
+ bp->b_error = rf_DoAccessKernel(raidPtrs[raidID], bp,
+ NULL, NULL, NULL);
if (bp->b_error) {
bp->b_flags |= B_ERROR;
db1_printf(("bp->b_flags HAS B_ERROR SET!!!: %d\n",
- bp->b_error));
+ bp->b_error));
}
splx(s);
#if 0
db1_printf(("Strategy exiting: 0x%x 0x%x %d %d\n",
- bp,bp->b_data,
- (int)bp->b_bcount,(int)bp->b_resid));
+ bp, bp->b_data,
+ (int) bp->b_bcount, (int) bp->b_resid));
#endif
}
-
/* ARGSUSED */
int
raidread(dev, uio, flags)
- dev_t dev;
+ dev_t dev;
struct uio *uio;
- int flags;
+ int flags;
{
- int unit = raidunit(dev);
+ int unit = raidunit(dev);
struct raid_softc *rs;
- int result;
- int part;
+ int result;
+ int part;
if (unit >= numraid)
return (ENXIO);
@@ -804,26 +604,25 @@ raidread(dev, uio, flags)
return (ENXIO);
part = DISKPART(dev);
- db1_printf(("raidread: unit: %d partition: %d\n",unit,part));
+ db1_printf(("raidread: unit: %d partition: %d\n", unit, part));
#if 0
return (physio(raidstrategy, NULL, dev, B_READ, minphys, uio));
#endif
- result=physio(raidstrategy, NULL, dev, B_READ, minphys, uio);
+ result = physio(raidstrategy, NULL, dev, B_READ, minphys, uio);
db1_printf(("raidread done. Result is %d %d\n",
- result,uio->uio_resid));
- return(result);
+ result, uio->uio_resid));
+ return (result);
}
-
/* ARGSUSED */
int
raidwrite(dev, uio, flags)
- dev_t dev;
+ dev_t dev;
struct uio *uio;
- int flags;
+ int flags;
{
- int unit = raidunit(dev);
+ int unit = raidunit(dev);
struct raid_softc *rs;
if (unit >= numraid)
@@ -840,31 +639,31 @@ raidwrite(dev, uio, flags)
int
raidioctl(dev, cmd, data, flag, p)
- dev_t dev;
- u_long cmd;
+ dev_t dev;
+ u_long cmd;
caddr_t data;
- int flag;
+ int flag;
struct proc *p;
{
- int unit = raidunit(dev);
- int error = 0;
- int part, pmask;
+ int unit = raidunit(dev);
+ int error = 0;
+ int part, pmask;
struct raid_softc *rs;
#if 0
- int r,c;
+ int r, c;
#endif
- /* struct raid_ioctl *ccio = (struct ccd_ioctl *)data; */
+ /* struct raid_ioctl *ccio = (struct ccd_ioctl *)data; */
- /* struct ccdbuf *cbp; */
- /* struct raidbuf *raidbp; */
+ /* struct ccdbuf *cbp; */
+ /* struct raidbuf *raidbp; */
RF_Config_t *k_cfg, *u_cfg;
u_char *specific_buf;
- int retcode = 0;
+ int retcode = 0;
- int row;
+ int row;
struct rf_recon_req *rrcopy, *rr;
#if 0
- int nbytes, spl, rw, row;
+ int nbytes, spl, rw, row;
struct rf_test_acc *ta;
struct buf *bp;
RF_SparetWait_t *waitreq;
@@ -875,8 +674,8 @@ raidioctl(dev, cmd, data, flag, p)
return (ENXIO);
rs = &raid_softc[unit];
- db1_printf(("raidioctl: %d %d %d %d\n",(int)dev,
- (int)DISKPART(dev),(int)unit,(int)cmd));
+ db1_printf(("raidioctl: %d %d %d %d\n", (int) dev,
+ (int) DISKPART(dev), (int) unit, (int) cmd));
/* Must be open for writes for these commands... */
switch (cmd) {
@@ -908,7 +707,7 @@ raidioctl(dev, cmd, data, flag, p)
if ((rs->sc_flags & RAIDF_INITED) == 0)
return (ENXIO);
}
-
+
switch (cmd) {
@@ -918,57 +717,56 @@ raidioctl(dev, cmd, data, flag, p)
db3_printf(("rf_ioctl: RAIDFRAME_CONFIGURE\n"));
/* copy-in the configuration information */
/* data points to a pointer to the configuration structure */
- u_cfg = *((RF_Config_t **) data);
- RF_Malloc(k_cfg,sizeof(RF_Config_t),(RF_Config_t *));
+ u_cfg = *((RF_Config_t **) data);
+ RF_Malloc(k_cfg, sizeof(RF_Config_t), (RF_Config_t *));
if (k_cfg == NULL) {
db3_printf(("rf_ioctl: ENOMEM for config. Code is %d\n", retcode));
- return(ENOMEM);
+ return (ENOMEM);
}
- retcode = copyin((caddr_t) u_cfg, (caddr_t) k_cfg,
- sizeof(RF_Config_t));
+ retcode = copyin((caddr_t) u_cfg, (caddr_t) k_cfg,
+ sizeof(RF_Config_t));
if (retcode) {
- db3_printf(("rf_ioctl: retcode=%d copyin.1\n",
- retcode));
- return(retcode);
+ db3_printf(("rf_ioctl: retcode=%d copyin.1\n",
+ retcode));
+ return (retcode);
}
-
- /* allocate a buffer for the layout-specific data,
- and copy it in */
+ /* allocate a buffer for the layout-specific data, and copy it
+ * in */
if (k_cfg->layoutSpecificSize) {
- if (k_cfg->layoutSpecificSize > 10000) {
+ if (k_cfg->layoutSpecificSize > 10000) {
/* sanity check */
db3_printf(("rf_ioctl: EINVAL %d\n", retcode));
- return(EINVAL);
+ return (EINVAL);
}
- RF_Malloc(specific_buf,k_cfg->layoutSpecificSize,
- (u_char *));
+ RF_Malloc(specific_buf, k_cfg->layoutSpecificSize,
+ (u_char *));
if (specific_buf == NULL) {
- RF_Free(k_cfg,sizeof(RF_Config_t));
+ RF_Free(k_cfg, sizeof(RF_Config_t));
db3_printf(("rf_ioctl: ENOMEM %d\n", retcode));
- return(ENOMEM);
+ return (ENOMEM);
}
- retcode = copyin(k_cfg->layoutSpecific,
- (caddr_t) specific_buf,
- k_cfg->layoutSpecificSize);
+ retcode = copyin(k_cfg->layoutSpecific,
+ (caddr_t) specific_buf,
+ k_cfg->layoutSpecificSize);
if (retcode) {
db3_printf(("rf_ioctl: retcode=%d copyin.2\n",
- retcode));
- return(retcode);
+ retcode));
+ return (retcode);
}
- } else specific_buf = NULL;
+ } else
+ specific_buf = NULL;
k_cfg->layoutSpecific = specific_buf;
-
- /* should do some kind of sanity check on the configuration.
- Store the sum of all the bytes in the last byte?
- */
+
+ /* should do some kind of sanity check on the configuration.
+ * Store the sum of all the bytes in the last byte? */
#if 0
db1_printf(("Considering configuring the system.:%d 0x%x\n",
- unit,p));
+ unit, p));
#endif
- /* We need the pointer to this a little deeper, so
- stash it here... */
+ /* We need the pointer to this a little deeper, so stash it
+ * here... */
raidPtrs[unit]->proc = p;
@@ -979,26 +777,25 @@ raidioctl(dev, cmd, data, flag, p)
raidPtrs[unit]->raidid = unit;
retcode = rf_Configure(raidPtrs[unit], k_cfg);
-
- if (retcode == 0) {
- retcode = raidinit(dev, raidPtrs[unit],unit);
- }
+ if (retcode == 0) {
+ retcode = raidinit(dev, raidPtrs[unit], unit);
+ }
/* free the buffers. No return code here. */
if (k_cfg->layoutSpecificSize) {
- RF_Free(specific_buf,k_cfg->layoutSpecificSize);
+ RF_Free(specific_buf, k_cfg->layoutSpecificSize);
}
- RF_Free(k_cfg,sizeof(RF_Config_t));
-
- db3_printf(("rf_ioctl: retcode=%d RAIDFRAME_CONFIGURE\n",
- retcode));
- return(retcode);
-
- /* shutdown the system */
+ RF_Free(k_cfg, sizeof(RF_Config_t));
+
+ db3_printf(("rf_ioctl: retcode=%d RAIDFRAME_CONFIGURE\n",
+ retcode));
+ return (retcode);
+
+ /* shutdown the system */
case RAIDFRAME_SHUTDOWN:
-
- if ((error = raidlock(rs)) != 0)
- return(error);
+
+ if ((error = raidlock(rs)) != 0)
+ return (error);
/*
* If somebody has a partition mounted, we shouldn't
@@ -1007,26 +804,24 @@ raidioctl(dev, cmd, data, flag, p)
part = DISKPART(dev);
pmask = (1 << part);
- if ((rs->sc_dkdev.dk_openmask & ~pmask) ||
- ((rs->sc_dkdev.dk_bopenmask & pmask) &&
- (rs->sc_dkdev.dk_copenmask & pmask))) {
- raidunlock(rs);
- return (EBUSY);
- }
-
+ if ((rs->sc_dkdev.dk_openmask & ~pmask) ||
+ ((rs->sc_dkdev.dk_bopenmask & pmask) &&
+ (rs->sc_dkdev.dk_copenmask & pmask))) {
+ raidunlock(rs);
+ return (EBUSY);
+ }
/* the intention here was to disallow shutdowns while
- raidframe is mounted, but it doesn't work because the
- shutdown ioctl calls rf_open
- */
+ * raidframe is mounted, but it doesn't work because the
+ * shutdown ioctl calls rf_open */
if (rf_pending_testaccs > 0) {
printf("RAIDFRAME: Can't shutdown because there are %d pending test accs\n",
- rf_pending_testaccs);
- return(EINVAL);
+ rf_pending_testaccs);
+ return (EINVAL);
}
if (rf_debugKernelAccess) {
printf("call shutdown\n");
}
- raidPtrs[unit]->proc = p; /* XXX necessary evil */
+ raidPtrs[unit]->proc = p; /* XXX necessary evil */
retcode = rf_Shutdown(raidPtrs[unit]);
db1_printf(("Done main shutdown\n"));
@@ -1037,112 +832,112 @@ raidioctl(dev, cmd, data, flag, p)
/* It's no longer initialized... */
rs->sc_flags &= ~RAIDF_INITED;
- /* Detach the disk. */
- disk_detach(&rs->sc_dkdev);
+ /* Detach the disk. */
+ disk_detach(&rs->sc_dkdev);
raidunlock(rs);
- return(retcode);
-
+ return (retcode);
+
/* initialize all parity */
case RAIDFRAME_REWRITEPARITY:
- if (raidPtrs[unit]->Layout.map->faultsTolerated == 0)
- return(EINVAL);
+ if (raidPtrs[unit]->Layout.map->faultsTolerated == 0)
+ return (EINVAL);
/* borrow the thread of the requesting process */
- raidPtrs[unit]->proc = p; /* Blah... :-p GO */
+ raidPtrs[unit]->proc = p; /* Blah... :-p GO */
retcode = rf_RewriteParity(raidPtrs[unit]);
- /* return I/O Error if the parity rewrite fails */
+ /* return I/O Error if the parity rewrite fails */
- if (retcode)
- retcode = EIO;
- return(retcode);
+ if (retcode)
+ retcode = EIO;
+ return (retcode);
- /* issue a test-unit-ready through raidframe to the
- indicated device */
-#if 0 /* XXX not supported yet (ever?) */
+ /* issue a test-unit-ready through raidframe to the indicated
+ * device */
+#if 0 /* XXX not supported yet (ever?) */
case RAIDFRAME_TUR:
/* debug only */
- retcode = rf_SCSI_DoTUR(0, 0, 0, 0, *(dev_t *) data);
- return(retcode);
+ retcode = rf_SCSI_DoTUR(0, 0, 0, 0, *(dev_t *) data);
+ return (retcode);
#endif
case RAIDFRAME_GET_INFO:
{
RF_Raid_t *raid = raidPtrs[unit];
RF_DeviceConfig_t *cfg, **ucfgp;
- int i, j, d;
-
+ int i, j, d;
+
if (!raid->valid)
- return(ENODEV);
- ucfgp = (RF_DeviceConfig_t **)data;
- RF_Malloc(cfg,sizeof(RF_DeviceConfig_t),
- (RF_DeviceConfig_t *));
+ return (ENODEV);
+ ucfgp = (RF_DeviceConfig_t **) data;
+ RF_Malloc(cfg, sizeof(RF_DeviceConfig_t),
+ (RF_DeviceConfig_t *));
if (cfg == NULL)
- return(ENOMEM);
- bzero((char *)cfg, sizeof(RF_DeviceConfig_t));
+ return (ENOMEM);
+ bzero((char *) cfg, sizeof(RF_DeviceConfig_t));
cfg->rows = raid->numRow;
cfg->cols = raid->numCol;
cfg->ndevs = raid->numRow * raid->numCol;
if (cfg->ndevs >= RF_MAX_DISKS) {
cfg->ndevs = 0;
- return(ENOMEM);
+ return (ENOMEM);
}
cfg->nspares = raid->numSpare;
if (cfg->nspares >= RF_MAX_DISKS) {
cfg->nspares = 0;
- return(ENOMEM);
+ return (ENOMEM);
}
cfg->maxqdepth = raid->maxQueueDepth;
d = 0;
- for(i=0;i<cfg->rows;i++) {
- for(j=0;j<cfg->cols;j++) {
+ for (i = 0; i < cfg->rows; i++) {
+ for (j = 0; j < cfg->cols; j++) {
cfg->devs[d] = raid->Disks[i][j];
d++;
}
}
- for(j=cfg->cols,i=0;i<cfg->nspares;i++,j++) {
+ for (j = cfg->cols, i = 0; i < cfg->nspares; i++, j++) {
cfg->spares[i] = raid->Disks[0][j];
}
- retcode = copyout((caddr_t)cfg, (caddr_t)*ucfgp,
- sizeof(RF_DeviceConfig_t));
- RF_Free(cfg,sizeof(RF_DeviceConfig_t));
-
- return(retcode);
+ retcode = copyout((caddr_t) cfg, (caddr_t) * ucfgp,
+ sizeof(RF_DeviceConfig_t));
+ RF_Free(cfg, sizeof(RF_DeviceConfig_t));
+
+ return (retcode);
}
- break;
-
+ break;
+
case RAIDFRAME_RESET_ACCTOTALS:
{
RF_Raid_t *raid = raidPtrs[unit];
-
+
bzero(&raid->acc_totals, sizeof(raid->acc_totals));
- return(0);
+ return (0);
}
- break;
-
+ break;
+
case RAIDFRAME_GET_ACCTOTALS:
{
- RF_AccTotals_t *totals = (RF_AccTotals_t *)data;
+ RF_AccTotals_t *totals = (RF_AccTotals_t *) data;
RF_Raid_t *raid = raidPtrs[unit];
-
+
*totals = raid->acc_totals;
- return(0);
+ return (0);
}
- break;
-
+ break;
+
case RAIDFRAME_KEEP_ACCTOTALS:
{
RF_Raid_t *raid = raidPtrs[unit];
- int *keep = (int *)data;
-
+ int *keep = (int *) data;
+
raid->keep_acc_totals = *keep;
- return(0);
+ return (0);
}
- break;
-
+ break;
+
case RAIDFRAME_GET_SIZE:
*(int *) data = raidPtrs[unit]->totalSectors;
- return(0);
+ return (0);
#define RAIDFRAME_RECON 1
/* XXX The above should probably be set somewhere else!! GO */
@@ -1151,15 +946,15 @@ raidioctl(dev, cmd, data, flag, p)
/* fail a disk & optionally start reconstruction */
case RAIDFRAME_FAIL_DISK:
rr = (struct rf_recon_req *) data;
-
- if (rr->row < 0 || rr->row >= raidPtrs[unit]->numRow
+
+ if (rr->row < 0 || rr->row >= raidPtrs[unit]->numRow
|| rr->col < 0 || rr->col >= raidPtrs[unit]->numCol)
- return(EINVAL);
+ return (EINVAL);
+
+ printf("Failing the disk: row: %d col: %d\n", rr->row, rr->col);
- printf("Failing the disk: row: %d col: %d\n",rr->row,rr->col);
-
- /* make a copy of the recon request so that we don't
- rely on the user's buffer */
+ /* make a copy of the recon request so that we don't rely on
+ * the user's buffer */
RF_Malloc(rrcopy, sizeof(*rrcopy), (struct rf_recon_req *));
bcopy(rr, rrcopy, sizeof(*rr));
rrcopy->raidPtr = (void *) raidPtrs[unit];
@@ -1169,54 +964,52 @@ raidioctl(dev, cmd, data, flag, p)
recon_queue = rrcopy;
wakeup(&recon_queue);
UNLOCK_RECON_Q_MUTEX();
-
- return(0);
-
- /* invoke a copyback operation after recon on whatever
- disk needs it, if any */
- case RAIDFRAME_COPYBACK:
+
+ return (0);
+
+ /* invoke a copyback operation after recon on whatever disk
+ * needs it, if any */
+ case RAIDFRAME_COPYBACK:
/* borrow the current thread to get this done */
- raidPtrs[unit]->proc = p; /* ICK.. but needed :-p GO */
+ raidPtrs[unit]->proc = p; /* ICK.. but needed :-p GO */
rf_CopybackReconstructedData(raidPtrs[unit]);
- return(0);
-
+ return (0);
+
/* return the percentage completion of reconstruction */
case RAIDFRAME_CHECKRECON:
row = *(int *) data;
if (row < 0 || row >= raidPtrs[unit]->numRow)
- return(EINVAL);
- if (raidPtrs[unit]->status[row] != rf_rs_reconstructing)
+ return (EINVAL);
+ if (raidPtrs[unit]->status[row] != rf_rs_reconstructing)
*(int *) data = 100;
- else
+ else
*(int *) data = raidPtrs[unit]->reconControl[row]->percentComplete;
- return(0);
-
- /* the sparetable daemon calls this to wait for the
- kernel to need a spare table.
- * this ioctl does not return until a spare table is needed.
- * XXX -- calling mpsleep here in the ioctl code is almost
- certainly wrong and evil. -- XXX
- * XXX -- I should either compute the spare table in the
- kernel, or have a different -- XXX
- * XXX -- interface (a different character device) for
- delivering the table -- XXX
- */
+ return (0);
+
+ /* the sparetable daemon calls this to wait for the kernel to
+ * need a spare table. this ioctl does not return until a
+ * spare table is needed. XXX -- calling mpsleep here in the
+ * ioctl code is almost certainly wrong and evil. -- XXX XXX
+ * -- I should either compute the spare table in the kernel,
+ * or have a different -- XXX XXX -- interface (a different
+ * character device) for delivering the table -- XXX */
#if 0
case RAIDFRAME_SPARET_WAIT:
RF_LOCK_MUTEX(rf_sparet_wait_mutex);
- while (!rf_sparet_wait_queue) mpsleep(&rf_sparet_wait_queue, (PZERO+1)|PCATCH, "sparet wait", 0, (void *) simple_lock_addr(rf_sparet_wait_mutex), MS_LOCK_SIMPLE);
+ while (!rf_sparet_wait_queue)
+ mpsleep(&rf_sparet_wait_queue, (PZERO + 1) | PCATCH, "sparet wait", 0, (void *) simple_lock_addr(rf_sparet_wait_mutex), MS_LOCK_SIMPLE);
waitreq = rf_sparet_wait_queue;
rf_sparet_wait_queue = rf_sparet_wait_queue->next;
RF_UNLOCK_MUTEX(rf_sparet_wait_mutex);
-
- *((RF_SparetWait_t *) data) = *waitreq; /* structure assignment */
-
+
+ *((RF_SparetWait_t *) data) = *waitreq; /* structure assignment */
+
RF_Free(waitreq, sizeof(*waitreq));
- return(0);
-
-
- /* wakes up a process waiting on SPARET_WAIT and puts an
- error code in it that will cause the dameon to exit */
+ return (0);
+
+
+ /* wakes up a process waiting on SPARET_WAIT and puts an error
+ * code in it that will cause the dameon to exit */
case RAIDFRAME_ABORT_SPARET_WAIT:
RF_Malloc(waitreq, sizeof(*waitreq), (RF_SparetWait_t *));
waitreq->fcol = -1;
@@ -1225,17 +1018,17 @@ raidioctl(dev, cmd, data, flag, p)
rf_sparet_wait_queue = waitreq;
RF_UNLOCK_MUTEX(rf_sparet_wait_mutex);
wakeup(&rf_sparet_wait_queue);
- return(0);
+ return (0);
- /* used by the spare table daemon to deliver a spare table
- into the kernel */
+ /* used by the spare table daemon to deliver a spare table
+ * into the kernel */
case RAIDFRAME_SEND_SPARET:
-
+
/* install the spare table */
- retcode = rf_SetSpareTable(raidPtrs[unit],*(void **) data);
-
- /* respond to the requestor. the return status of the
- spare table installation is passed in the "fcol" field */
+ retcode = rf_SetSpareTable(raidPtrs[unit], *(void **) data);
+
+ /* respond to the requestor. the return status of the spare
+ * table installation is passed in the "fcol" field */
RF_Malloc(waitreq, sizeof(*waitreq), (RF_SparetWait_t *));
waitreq->fcol = retcode;
RF_LOCK_MUTEX(rf_sparet_wait_mutex);
@@ -1243,34 +1036,35 @@ raidioctl(dev, cmd, data, flag, p)
rf_sparet_resp_queue = waitreq;
wakeup(&rf_sparet_resp_queue);
RF_UNLOCK_MUTEX(rf_sparet_wait_mutex);
-
- return(retcode);
+
+ return (retcode);
#endif
-#endif /* RAIDFRAME_RECON > 0 */
+#endif /* RAIDFRAME_RECON > 0 */
+
+ default:
+ break; /* fall through to the os-specific code below */
- default: break; /* fall through to the os-specific code below */
-
}
-
+
if (!raidPtrs[unit]->valid)
- return(EINVAL);
-
+ return (EINVAL);
+
/*
* Add support for "regular" device ioctls here.
*/
-
+
switch (cmd) {
case DIOCGDINFO:
- db1_printf(("DIOCGDINFO %d %d\n",(int)dev,(int)DISKPART(dev)));
- *(struct disklabel *)data = *(rs->sc_dkdev.dk_label);
+ db1_printf(("DIOCGDINFO %d %d\n", (int) dev, (int) DISKPART(dev)));
+ *(struct disklabel *) data = *(rs->sc_dkdev.dk_label);
break;
case DIOCGPART:
- db1_printf(("DIOCGPART: %d %d\n",(int)dev,(int)DISKPART(dev)));
- ((struct partinfo *)data)->disklab = rs->sc_dkdev.dk_label;
- ((struct partinfo *)data)->part =
+ db1_printf(("DIOCGPART: %d %d\n", (int) dev, (int) DISKPART(dev)));
+ ((struct partinfo *) data)->disklab = rs->sc_dkdev.dk_label;
+ ((struct partinfo *) data)->part =
&rs->sc_dkdev.dk_label->d_partitions[DISKPART(dev)];
break;
@@ -1284,14 +1078,13 @@ raidioctl(dev, cmd, data, flag, p)
rs->sc_flags |= RAIDF_LABELLING;
error = setdisklabel(rs->sc_dkdev.dk_label,
- (struct disklabel *)data, 0, rs->sc_dkdev.dk_cpulabel);
+ (struct disklabel *) data, 0, rs->sc_dkdev.dk_cpulabel);
if (error == 0) {
if (cmd == DIOCWDINFO)
error = writedisklabel(RAIDLABELDEV(dev),
raidstrategy, rs->sc_dkdev.dk_label,
rs->sc_dkdev.dk_cpulabel);
}
-
rs->sc_flags &= ~RAIDF_LABELLING;
raidunlock(rs);
@@ -1302,7 +1095,7 @@ raidioctl(dev, cmd, data, flag, p)
case DIOCWLABEL:
db1_printf(("DIOCWLABEL\n"));
- if (*(int *)data != 0)
+ if (*(int *) data != 0)
rs->sc_flags |= RAIDF_WLABEL;
else
rs->sc_flags &= ~RAIDF_WLABEL;
@@ -1311,55 +1104,55 @@ raidioctl(dev, cmd, data, flag, p)
case DIOCGDEFLABEL:
db1_printf(("DIOCGDEFLABEL\n"));
raidgetdefaultlabel(raidPtrs[unit], rs,
- (struct disklabel *)data);
+ (struct disklabel *) data);
break;
default:
- retcode = ENOTTY; /* XXXX ?? OR EINVAL ? */
+ retcode = ENOTTY; /* XXXX ?? OR EINVAL ? */
}
- return(retcode);
+ return (retcode);
}
-/* raidinit -- complete the rest of the initialization for the
+/* raidinit -- complete the rest of the initialization for the
RAIDframe device. */
static int
-raidinit(dev, raidPtr,unit)
- dev_t dev;
+raidinit(dev, raidPtr, unit)
+ dev_t dev;
RF_Raid_t *raidPtr;
- int unit;
+ int unit;
{
- int retcode;
- /* int ix; */
- /* struct raidbuf *raidbp; */
+ int retcode;
+ /* int ix; */
+ /* struct raidbuf *raidbp; */
struct raid_softc *rs;
retcode = 0;
rs = &raid_softc[unit];
pool_init(&rs->sc_cbufpool, sizeof(struct raidbuf), 0,
- 0, 0, "raidpl", 0, NULL, NULL, M_DEVBUF);
+ 0, 0, "raidpl", 0, NULL, NULL, M_RAIDFRAME);
+
-
/* XXX should check return code first... */
rs->sc_flags |= RAIDF_INITED;
- sprintf(rs->sc_xname, "raid%d", unit); /* XXX doesn't check bounds.*/
+ sprintf(rs->sc_xname, "raid%d", unit); /* XXX doesn't check bounds. */
- rs->sc_dkdev.dk_name = rs->sc_xname;
+ rs->sc_dkdev.dk_name = rs->sc_xname;
/* disk_attach actually creates space for the CPU disklabel, among
- other things, so it's critical to call this *BEFORE* we
- try putzing with disklabels. */
+ * other things, so it's critical to call this *BEFORE* we try putzing
+ * with disklabels. */
disk_attach(&rs->sc_dkdev);
/* XXX There may be a weird interaction here between this, and
- protectedSectors, as used in RAIDframe. */
- rs->sc_size = raidPtr->totalSectors;
+ * protectedSectors, as used in RAIDframe. */
+ rs->sc_size = raidPtr->totalSectors;
rs->sc_dev = dev;
- return(retcode);
+ return (retcode);
}
@@ -1368,118 +1161,123 @@ raidinit(dev, raidPtr,unit)
* initialization code called at boot time (startup.c)
*
********************************************************/
-int rf_boot()
+int
+rf_boot()
{
- int i, rc;
-
- rc = rf_mutex_init(&rf_sparet_wait_mutex);
- if (rc) {
- RF_PANIC();
- }
- rc = rf_mutex_init(&rf_async_done_q_mutex);
- if (rc) {
- RF_PANIC();
- }
- rf_sparet_wait_queue = rf_sparet_resp_queue = NULL;
- recon_queue = NULL;
- rf_async_done_qh = rf_async_done_qt = NULL;
- for (i=0; i<numraid; i++)
- raidPtrs[i] = NULL;
- rc = rf_BootRaidframe();
- if (rc == 0)
- printf("Kernelized RAIDframe activated\n");
- else
- rf_kbooted = RFK_BOOT_BAD;
- return(rc);
-}
+ int i, rc;
+ rc = rf_mutex_init(&rf_sparet_wait_mutex);
+ if (rc) {
+ RF_PANIC();
+ }
+ rc = rf_mutex_init(&rf_async_done_q_mutex);
+ if (rc) {
+ RF_PANIC();
+ }
+ rf_sparet_wait_queue = rf_sparet_resp_queue = NULL;
+ recon_queue = NULL;
+ rf_async_done_qh = rf_async_done_qt = NULL;
+ for (i = 0; i < numraid; i++)
+ raidPtrs[i] = NULL;
+ rc = rf_BootRaidframe();
+ if (rc == 0)
+ printf("Kernelized RAIDframe activated\n");
+ else
+ rf_kbooted = RFK_BOOT_BAD;
+ return (rc);
+}
/*
* This kernel thread never exits. It is created once, and persists
* until the system reboots.
*/
-void rf_ReconKernelThread()
+void
+rf_ReconKernelThread()
{
- struct rf_recon_req *req;
- int s;
-
- /* XXX not sure what spl() level we should be at here... probably splbio() */
- s=splbio();
-
- while (1) {
- /* grab the next reconstruction request from the queue */
- LOCK_RECON_Q_MUTEX();
- while (!recon_queue) {
- UNLOCK_RECON_Q_MUTEX();
- tsleep(&recon_queue, PRIBIO | PCATCH, "raidframe recon", 0);
- LOCK_RECON_Q_MUTEX();
- }
- req = recon_queue;
- recon_queue = recon_queue->next;
- UNLOCK_RECON_Q_MUTEX();
-
- /*
- * If flags specifies that we should start recon, this call
- * will not return until reconstruction completes, fails, or is aborted.
- */
- rf_FailDisk((RF_Raid_t *) req->raidPtr, req->row, req->col,
- ((req->flags&RF_FDFLAGS_RECON) ? 1 : 0));
-
- RF_Free(req, sizeof(*req));
- }
+ struct rf_recon_req *req;
+ int s;
+
+ /* XXX not sure what spl() level we should be at here... probably
+ * splbio() */
+ s = splbio();
+
+ while (1) {
+ /* grab the next reconstruction request from the queue */
+ LOCK_RECON_Q_MUTEX();
+ while (!recon_queue) {
+ UNLOCK_RECON_Q_MUTEX();
+ tsleep(&recon_queue, PRIBIO | PCATCH, "raidframe recon", 0);
+ LOCK_RECON_Q_MUTEX();
+ }
+ req = recon_queue;
+ recon_queue = recon_queue->next;
+ UNLOCK_RECON_Q_MUTEX();
+
+ /*
+ * If flags specifies that we should start recon, this call
+ * will not return until reconstruction completes, fails, or is aborted.
+ */
+ rf_FailDisk((RF_Raid_t *) req->raidPtr, req->row, req->col,
+ ((req->flags & RF_FDFLAGS_RECON) ? 1 : 0));
+
+ RF_Free(req, sizeof(*req));
+ }
}
/* wake up the daemon & tell it to get us a spare table
* XXX
- * the entries in the queues should be tagged with the raidPtr
+ * the entries in the queues should be tagged with the raidPtr
* so that in the extremely rare case that two recons happen at once, we know for
* which device were requesting a spare table
* XXX
*/
-int rf_GetSpareTableFromDaemon(req)
- RF_SparetWait_t *req;
+int
+rf_GetSpareTableFromDaemon(req)
+ RF_SparetWait_t *req;
{
- int retcode;
+ int retcode;
- RF_LOCK_MUTEX(rf_sparet_wait_mutex);
- req->next = rf_sparet_wait_queue;
- rf_sparet_wait_queue = req;
- wakeup(&rf_sparet_wait_queue);
+ RF_LOCK_MUTEX(rf_sparet_wait_mutex);
+ req->next = rf_sparet_wait_queue;
+ rf_sparet_wait_queue = req;
+ wakeup(&rf_sparet_wait_queue);
- /* mpsleep unlocks the mutex */
- while (!rf_sparet_resp_queue) {
- tsleep(&rf_sparet_resp_queue, PRIBIO | PCATCH,
- "raidframe getsparetable", 0);
+ /* mpsleep unlocks the mutex */
+ while (!rf_sparet_resp_queue) {
+ tsleep(&rf_sparet_resp_queue, PRIBIO | PCATCH,
+ "raidframe getsparetable", 0);
#if 0
- mpsleep(&rf_sparet_resp_queue, PZERO, "sparet resp", 0, (void *) simple_lock_addr(rf_sparet_wait_mutex), MS_LOCK_SIMPLE);
+ mpsleep(&rf_sparet_resp_queue, PZERO, "sparet resp", 0, (void *) simple_lock_addr(rf_sparet_wait_mutex), MS_LOCK_SIMPLE);
#endif
- }
- req = rf_sparet_resp_queue;
- rf_sparet_resp_queue = req->next;
- RF_UNLOCK_MUTEX(rf_sparet_wait_mutex);
-
- retcode = req->fcol;
- RF_Free(req, sizeof(*req)); /* this is not the same req as we alloc'd */
- return(retcode);
+ }
+ req = rf_sparet_resp_queue;
+ rf_sparet_resp_queue = req->next;
+ RF_UNLOCK_MUTEX(rf_sparet_wait_mutex);
+
+ retcode = req->fcol;
+ RF_Free(req, sizeof(*req)); /* this is not the same req as we
+ * alloc'd */
+ return (retcode);
}
-
/* a wrapper around rf_DoAccess that extracts appropriate info from the bp & passes it down.
* any calls originating in the kernel must use non-blocking I/O
* do some extra sanity checking to return "appropriate" error values for
* certain conditions (to make some standard utilities work)
*/
-int rf_DoAccessKernel(raidPtr, bp, flags, cbFunc, cbArg)
- RF_Raid_t *raidPtr;
- struct buf *bp;
- RF_RaidAccessFlags_t flags;
- void (*cbFunc)(struct buf *);
- void *cbArg;
+int
+rf_DoAccessKernel(raidPtr, bp, flags, cbFunc, cbArg)
+ RF_Raid_t *raidPtr;
+ struct buf *bp;
+ RF_RaidAccessFlags_t flags;
+ void (*cbFunc) (struct buf *);
+ void *cbArg;
{
RF_SectorCount_t num_blocks, pb, sum;
RF_RaidAddr_t raid_addr;
- int retcode;
+ int retcode;
struct partition *pp;
- daddr_t blocknum;
- int unit;
+ daddr_t blocknum;
+ int unit;
struct raid_softc *rs;
+ int do_async;
/* XXX The dev_t used here should be for /dev/[r]raid* !!! */
@@ -1487,47 +1285,42 @@ int rf_DoAccessKernel(raidPtr, bp, flags, cbFunc, cbArg)
rs = &raid_softc[unit];
/* Ok, for the bp we have here, bp->b_blkno is relative to the
- partition.. Need to make it absolute to the underlying
- device.. */
+ * partition.. Need to make it absolute to the underlying device.. */
blocknum = bp->b_blkno;
if (DISKPART(bp->b_dev) != RAW_PART) {
pp = &rs->sc_dkdev.dk_label->d_partitions[DISKPART(bp->b_dev)];
blocknum += pp->p_offset;
- db1_printf(("updated: %d %d\n",DISKPART(bp->b_dev),
- pp->p_offset));
+ db1_printf(("updated: %d %d\n", DISKPART(bp->b_dev),
+ pp->p_offset));
} else {
db1_printf(("Is raw..\n"));
}
db1_printf(("Blocks: %d, %d\n", (int) bp->b_blkno, (int) blocknum));
- db1_printf(("bp->b_bcount = %d\n",(int)bp->b_bcount));
- db1_printf(("bp->b_resid = %d\n",(int)bp->b_resid));
+ db1_printf(("bp->b_bcount = %d\n", (int) bp->b_bcount));
+ db1_printf(("bp->b_resid = %d\n", (int) bp->b_resid));
- /* *THIS* is where we adjust what block we're going to... but
- DO NOT TOUCH bp->b_blkno!!! */
+ /* *THIS* is where we adjust what block we're going to... but DO NOT
+ * TOUCH bp->b_blkno!!! */
raid_addr = blocknum;
-
+
num_blocks = bp->b_bcount >> raidPtr->logBytesPerSector;
- pb = (bp->b_bcount&raidPtr->sectorMask) ? 1 : 0;
+ pb = (bp->b_bcount & raidPtr->sectorMask) ? 1 : 0;
sum = raid_addr + num_blocks + pb;
if (1 || rf_debugKernelAccess) {
- db1_printf(("raid_addr=%d sum=%d num_blocks=%d(+%d) (%d)\n",
- (int)raid_addr, (int)sum,(int)num_blocks,
- (int)pb,(int)bp->b_resid));
+ db1_printf(("raid_addr=%d sum=%d num_blocks=%d(+%d) (%d)\n",
+ (int) raid_addr, (int) sum, (int) num_blocks,
+ (int) pb, (int) bp->b_resid));
}
-
-
if ((sum > raidPtr->totalSectors) || (sum < raid_addr)
- || (sum < num_blocks) || (sum < pb))
- {
+ || (sum < num_blocks) || (sum < pb)) {
bp->b_error = ENOSPC;
bp->b_flags |= B_ERROR;
bp->b_resid = bp->b_bcount;
biodone(bp);
- return(bp->b_error);
+ return (bp->b_error);
}
-
/*
* XXX rf_DoAccess() should do this, not just DoAccessKernel()
*/
@@ -1537,75 +1330,85 @@ int rf_DoAccessKernel(raidPtr, bp, flags, cbFunc, cbArg)
bp->b_flags |= B_ERROR;
bp->b_resid = bp->b_bcount;
biodone(bp);
- return(bp->b_error);
+ return (bp->b_error);
}
db1_printf(("Calling DoAccess..\n"));
- /* don't ever condition on bp->b_flags & B_WRITE.
- always condition on B_READ instead */
- retcode = rf_DoAccess(raidPtr, (bp->b_flags & B_READ) ?
- RF_IO_TYPE_READ : RF_IO_TYPE_WRITE,
- 0, raid_addr, num_blocks, bp->b_un.b_addr,
- bp, NULL, NULL, RF_DAG_NONBLOCKING_IO|flags,
- NULL, cbFunc, cbArg);
+ /*
+ * XXX For now, all writes are sync
+ */
+ do_async = 1;
+ if ((bp->b_flags & B_READ) == 0)
+ do_async = 0;
+
+ /* don't ever condition on bp->b_flags & B_WRITE. always condition on
+ * B_READ instead */
+ retcode = rf_DoAccess(raidPtr, (bp->b_flags & B_READ) ?
+ RF_IO_TYPE_READ : RF_IO_TYPE_WRITE,
+ do_async, raid_addr, num_blocks,
+ bp->b_un.b_addr,
+ bp, NULL, NULL, RF_DAG_NONBLOCKING_IO | flags,
+ NULL, cbFunc, cbArg);
#if 0
- db1_printf(("After call to DoAccess: 0x%x 0x%x %d\n",bp,
- bp->b_data,(int)bp->b_resid));
+ db1_printf(("After call to DoAccess: 0x%x 0x%x %d\n", bp,
+ bp->b_data, (int) bp->b_resid));
#endif
- return(retcode);
-}
+ /*
+ * If we requested sync I/O, sleep here.
+ */
+ if ((retcode == 0) && (do_async == 0))
+ tsleep(bp, PRIBIO, "raidsyncio", 0);
+
+ return (retcode);
+}
/* invoke an I/O from kernel mode. Disk queue should be locked upon entry */
-int rf_DispatchKernelIO(queue, req)
- RF_DiskQueue_t *queue;
- RF_DiskQueueData_t *req;
+int
+rf_DispatchKernelIO(queue, req)
+ RF_DiskQueue_t *queue;
+ RF_DiskQueueData_t *req;
{
- int op = (req->type == RF_IO_TYPE_READ) ? B_READ : B_WRITE;
+ int op = (req->type == RF_IO_TYPE_READ) ? B_READ : B_WRITE;
struct buf *bp;
- struct raidbuf *raidbp=NULL;
+ struct raidbuf *raidbp = NULL;
struct raid_softc *rs;
- int unit;
-
+ int unit;
+
/* XXX along with the vnode, we also need the softc associated with
- this device.. */
-
+ * this device.. */
+
req->queue = queue;
-
+
unit = queue->raidPtr->raidid;
- db1_printf(("DispatchKernelIO unit: %d\n",unit));
+ db1_printf(("DispatchKernelIO unit: %d\n", unit));
- if (unit >= numraid) {
- printf("Invalid unit number: %d %d\n",unit,numraid);
+ if (unit >= numraid) {
+ printf("Invalid unit number: %d %d\n", unit, numraid);
panic("Invalid Unit number in rf_DispatchKernelIO\n");
}
-
rs = &raid_softc[unit];
/* XXX is this the right place? */
- disk_busy(&rs->sc_dkdev);
+ disk_busy(&rs->sc_dkdev);
bp = req->bp;
- /*
- XXX when there is a physical disk failure, someone is passing
- us a buffer that contains old stuff!! Attempt to deal with
- this problem without taking a performance hit...
- (not sure where the real bug is. It's buried in RAIDframe
- somewhere) :-( GO )
- */
+ /* XXX when there is a physical disk failure, someone is passing us a
+ * buffer that contains old stuff!! Attempt to deal with this problem
+ * without taking a performance hit... (not sure where the real bug
+ * is. It's buried in RAIDframe somewhere) :-( GO ) */
if (bp->b_flags & B_ERROR) {
bp->b_flags &= ~B_ERROR;
}
- if (bp->b_error!=0) {
+ if (bp->b_error != 0) {
bp->b_error = 0;
}
-
raidbp = RAIDGETBUF(rs);
- raidbp->rf_flags = 0; /* XXX not really used anywhere... */
+ raidbp->rf_flags = 0; /* XXX not really used anywhere... */
/*
* context for raidiodone
@@ -1614,14 +1417,12 @@ int rf_DispatchKernelIO(queue, req)
raidbp->req = req;
switch (req->type) {
- case RF_IO_TYPE_NOP: /* used primarily to unlock a locked queue */
- /*
- Dprintf2("rf_DispatchKernelIO: NOP to r %d c %d\n",
- queue->row, queue->col);
- */
+ case RF_IO_TYPE_NOP: /* used primarily to unlock a locked queue */
+ /* Dprintf2("rf_DispatchKernelIO: NOP to r %d c %d\n",
+ * queue->row, queue->col); */
/* XXX need to do something extra here.. */
- /* I'm leaving this in, as I've never actually seen it
- used, and I'd like folks to report it... GO */
+ /* I'm leaving this in, as I've never actually seen it used,
+ * and I'd like folks to report it... GO */
printf(("WAKEUP CALLED\n"));
queue->numOutstanding++;
@@ -1629,157 +1430,150 @@ int rf_DispatchKernelIO(queue, req)
KernelWakeupFunc(&raidbp->rf_buf);
break;
-
+
case RF_IO_TYPE_READ:
case RF_IO_TYPE_WRITE:
-
+
if (req->tracerec) {
RF_ETIMER_START(req->tracerec->timer);
}
-
-
- InitBP(&raidbp->rf_buf, queue->rf_cinfo->ci_vp,
- op | bp->b_flags, queue->rf_cinfo->ci_dev,
- req->sectorOffset, req->numSector,
- req->buf, KernelWakeupFunc, (void *) req,
- queue->raidPtr->logBytesPerSector, req->b_proc);
+ InitBP(&raidbp->rf_buf, queue->rf_cinfo->ci_vp,
+ op | bp->b_flags, queue->rf_cinfo->ci_dev,
+ req->sectorOffset, req->numSector,
+ req->buf, KernelWakeupFunc, (void *) req,
+ queue->raidPtr->logBytesPerSector, req->b_proc);
if (rf_debugKernelAccess) {
- db1_printf(("dispatch: bp->b_blkno = %ld\n",
- (long) bp->b_blkno));
+ db1_printf(("dispatch: bp->b_blkno = %ld\n",
+ (long) bp->b_blkno));
}
queue->numOutstanding++;
queue->last_deq_sector = req->sectorOffset;
- /* acc wouldn't have been let in if there were any
- pending reqs at any other priority */
+ /* acc wouldn't have been let in if there were any pending
+ * reqs at any other priority */
queue->curPriority = req->priority;
- /*
- Dprintf3("rf_DispatchKernelIO: %c to row %d col %d\n",
- req->type, queue->row, queue->col);
- */
+ /* Dprintf3("rf_DispatchKernelIO: %c to row %d col %d\n",
+ * req->type, queue->row, queue->col); */
db1_printf(("Going for %c to unit %d row %d col %d\n",
- req->type, unit, queue->row, queue->col));
+ req->type, unit, queue->row, queue->col));
db1_printf(("sector %d count %d (%d bytes) %d\n",
- (int) req->sectorOffset, (int) req->numSector,
- (int) (req->numSector <<
- queue->raidPtr->logBytesPerSector),
- (int) queue->raidPtr->logBytesPerSector));
+ (int) req->sectorOffset, (int) req->numSector,
+ (int) (req->numSector <<
+ queue->raidPtr->logBytesPerSector),
+ (int) queue->raidPtr->logBytesPerSector));
if ((raidbp->rf_buf.b_flags & B_READ) == 0) {
raidbp->rf_buf.b_vp->v_numoutput++;
}
-
VOP_STRATEGY(&raidbp->rf_buf);
-
+
break;
-
+
default:
panic("bad req->type in rf_DispatchKernelIO");
}
db1_printf(("Exiting from DispatchKernelIO\n"));
- return(0);
+ return (0);
}
-
-/* this is the callback function associated with a I/O invoked from
+/* this is the callback function associated with a I/O invoked from
kernel code.
*/
-static void KernelWakeupFunc(vbp)
- struct buf *vbp;
+static void
+KernelWakeupFunc(vbp)
+ struct buf *vbp;
{
- RF_DiskQueueData_t *req = NULL;
- RF_DiskQueue_t *queue;
- struct raidbuf *raidbp = (struct raidbuf *)vbp;
- struct buf *bp;
- struct raid_softc *rs;
- int unit;
- register int s;
-
- s=splbio(); /* XXX */
- db1_printf(("recovering the request queue:\n"));
- req = raidbp->req;
-
- bp = raidbp->rf_obp;
+ RF_DiskQueueData_t *req = NULL;
+ RF_DiskQueue_t *queue;
+ struct raidbuf *raidbp = (struct raidbuf *) vbp;
+ struct buf *bp;
+ struct raid_softc *rs;
+ int unit;
+ register int s;
+
+ s = splbio(); /* XXX */
+ db1_printf(("recovering the request queue:\n"));
+ req = raidbp->req;
+
+ bp = raidbp->rf_obp;
#if 0
- db1_printf(("bp=0x%x\n",bp));
+ db1_printf(("bp=0x%x\n", bp));
#endif
- queue = (RF_DiskQueue_t *) req->queue;
+ queue = (RF_DiskQueue_t *) req->queue;
- if (raidbp->rf_buf.b_flags & B_ERROR) {
+ if (raidbp->rf_buf.b_flags & B_ERROR) {
#if 0
- printf("Setting bp->b_flags!!! %d\n",raidbp->rf_buf.b_error);
+ printf("Setting bp->b_flags!!! %d\n", raidbp->rf_buf.b_error);
#endif
- bp->b_flags |= B_ERROR;
- bp->b_error = raidbp->rf_buf.b_error ?
- raidbp->rf_buf.b_error : EIO;
- }
-
+ bp->b_flags |= B_ERROR;
+ bp->b_error = raidbp->rf_buf.b_error ?
+ raidbp->rf_buf.b_error : EIO;
+ }
#if 0
- db1_printf(("raidbp->rf_buf.b_bcount=%d\n",(int)raidbp->rf_buf.b_bcount));
- db1_printf(("raidbp->rf_buf.b_bufsize=%d\n",(int)raidbp->rf_buf.b_bufsize));
- db1_printf(("raidbp->rf_buf.b_resid=%d\n",(int)raidbp->rf_buf.b_resid));
- db1_printf(("raidbp->rf_buf.b_data=0x%x\n",raidbp->rf_buf.b_data));
+ db1_printf(("raidbp->rf_buf.b_bcount=%d\n", (int) raidbp->rf_buf.b_bcount));
+ db1_printf(("raidbp->rf_buf.b_bufsize=%d\n", (int) raidbp->rf_buf.b_bufsize));
+ db1_printf(("raidbp->rf_buf.b_resid=%d\n", (int) raidbp->rf_buf.b_resid));
+ db1_printf(("raidbp->rf_buf.b_data=0x%x\n", raidbp->rf_buf.b_data));
#endif
- /* XXX methinks this could be wrong... */
+ /* XXX methinks this could be wrong... */
#if 1
- bp->b_resid = raidbp->rf_buf.b_resid;
+ bp->b_resid = raidbp->rf_buf.b_resid;
#endif
- if (req->tracerec) {
- RF_ETIMER_STOP(req->tracerec->timer);
- RF_ETIMER_EVAL(req->tracerec->timer);
- RF_LOCK_MUTEX(rf_tracing_mutex);
- req->tracerec->diskwait_us += RF_ETIMER_VAL_US(req->tracerec->timer);
- req->tracerec->phys_io_us += RF_ETIMER_VAL_US(req->tracerec->timer);
- req->tracerec->num_phys_ios++;
- RF_UNLOCK_MUTEX(rf_tracing_mutex);
- }
-
- bp->b_bcount = raidbp->rf_buf.b_bcount;/* XXXX ?? */
+ if (req->tracerec) {
+ RF_ETIMER_STOP(req->tracerec->timer);
+ RF_ETIMER_EVAL(req->tracerec->timer);
+ RF_LOCK_MUTEX(rf_tracing_mutex);
+ req->tracerec->diskwait_us += RF_ETIMER_VAL_US(req->tracerec->timer);
+ req->tracerec->phys_io_us += RF_ETIMER_VAL_US(req->tracerec->timer);
+ req->tracerec->num_phys_ios++;
+ RF_UNLOCK_MUTEX(rf_tracing_mutex);
+ }
+ bp->b_bcount = raidbp->rf_buf.b_bcount; /* XXXX ?? */
- unit = queue->raidPtr->raidid; /* *Much* simpler :-> */
+ unit = queue->raidPtr->raidid; /* *Much* simpler :-> */
- /* XXX Ok, let's get aggressive... If B_ERROR is set, let's go ballistic,
- and mark the component as hosed... */
+ /* XXX Ok, let's get aggressive... If B_ERROR is set, let's go
+ * ballistic, and mark the component as hosed... */
#if 1
- if (bp->b_flags&B_ERROR) {
- /* Mark the disk as dead */
- /* but only mark it once... */
- if (queue->raidPtr->Disks[queue->row][queue->col].status ==
- rf_ds_optimal) {
- printf("raid%d: IO Error. Marking %s as failed.\n",
- unit, queue->raidPtr->Disks[queue->row][queue->col].devname );
- queue->raidPtr->Disks[queue->row][queue->col].status =
- rf_ds_failed;
- queue->raidPtr->status[queue->row] = rf_rs_degraded;
- queue->raidPtr->numFailures++;
- } else { /* Disk is already dead... */
- /* printf("Disk already marked as dead!\n"); */
- }
-
- }
+ if (bp->b_flags & B_ERROR) {
+ /* Mark the disk as dead */
+ /* but only mark it once... */
+ if (queue->raidPtr->Disks[queue->row][queue->col].status ==
+ rf_ds_optimal) {
+ printf("raid%d: IO Error. Marking %s as failed.\n",
+ unit, queue->raidPtr->Disks[queue->row][queue->col].devname);
+ queue->raidPtr->Disks[queue->row][queue->col].status =
+ rf_ds_failed;
+ queue->raidPtr->status[queue->row] = rf_rs_degraded;
+ queue->raidPtr->numFailures++;
+ } else { /* Disk is already dead... */
+ /* printf("Disk already marked as dead!\n"); */
+ }
+
+ }
#endif
- rs = &raid_softc[unit];
- RAIDPUTBUF(rs,raidbp);
+ rs = &raid_softc[unit];
+ RAIDPUTBUF(rs, raidbp);
- if (bp->b_resid==0) {
- db1_printf(("Disk is no longer busy for this buffer... %d %ld %ld\n",
- unit, bp->b_resid, bp->b_bcount));
- /* XXX is this the right place for a disk_unbusy()??!??!?!? */
- disk_unbusy(&rs->sc_dkdev, (bp->b_bcount - bp->b_resid));
- } else {
- db1_printf(("b_resid is still %ld\n",bp->b_resid));
- }
+ if (bp->b_resid == 0) {
+ db1_printf(("Disk is no longer busy for this buffer... %d %ld %ld\n",
+ unit, bp->b_resid, bp->b_bcount));
+ /* XXX is this the right place for a disk_unbusy()??!??!?!? */
+ disk_unbusy(&rs->sc_dkdev, (bp->b_bcount - bp->b_resid));
+ } else {
+ db1_printf(("b_resid is still %ld\n", bp->b_resid));
+ }
- rf_DiskIOComplete(queue, req, (bp->b_flags & B_ERROR) ? 1 : 0);
- (req->CompleteFunc)(req->argument, (bp->b_flags & B_ERROR) ? 1 : 0);
- /* printf("Exiting KernelWakeupFunc\n"); */
+ rf_DiskIOComplete(queue, req, (bp->b_flags & B_ERROR) ? 1 : 0);
+ (req->CompleteFunc) (req->argument, (bp->b_flags & B_ERROR) ? 1 : 0);
+ /* printf("Exiting KernelWakeupFunc\n"); */
- splx(s); /* XXX */
+ splx(s); /* XXX */
}
@@ -1787,62 +1581,62 @@ static void KernelWakeupFunc(vbp)
/*
* initialize a buf structure for doing an I/O in the kernel.
*/
-static void InitBP(
- struct buf *bp,
- struct vnode *b_vp,
- unsigned rw_flag,
- dev_t dev,
- RF_SectorNum_t startSect,
- RF_SectorCount_t numSect,
- caddr_t buf,
- void (*cbFunc)(struct buf *),
- void *cbArg,
- int logBytesPerSector,
- struct proc *b_proc)
+static void
+InitBP(
+ struct buf * bp,
+ struct vnode * b_vp,
+ unsigned rw_flag,
+ dev_t dev,
+ RF_SectorNum_t startSect,
+ RF_SectorCount_t numSect,
+ caddr_t buf,
+ void (*cbFunc) (struct buf *),
+ void *cbArg,
+ int logBytesPerSector,
+ struct proc * b_proc)
{
- /* bp->b_flags = B_PHYS | rw_flag; */
- bp->b_flags = B_CALL | rw_flag; /* XXX need B_PHYS here too??? */
- bp->b_bcount = numSect << logBytesPerSector;
- bp->b_bufsize = bp->b_bcount;
- bp->b_error = 0;
- bp->b_dev = dev;
+ /* bp->b_flags = B_PHYS | rw_flag; */
+ bp->b_flags = B_CALL | rw_flag; /* XXX need B_PHYS here too??? */
+ bp->b_bcount = numSect << logBytesPerSector;
+ bp->b_bufsize = bp->b_bcount;
+ bp->b_error = 0;
+ bp->b_dev = dev;
db1_printf(("bp->b_dev is %d\n", dev));
- bp->b_un.b_addr = buf;
+ bp->b_un.b_addr = buf;
#if 0
- db1_printf(("bp->b_data=0x%x\n",bp->b_data));
+ db1_printf(("bp->b_data=0x%x\n", bp->b_data));
#endif
- bp->b_blkno = startSect;
- bp->b_resid = bp->b_bcount; /* XXX is this right!??!?!! */
- db1_printf(("b_bcount is: %d\n",(int)bp->b_bcount));
+ bp->b_blkno = startSect;
+ bp->b_resid = bp->b_bcount; /* XXX is this right!??!?!! */
+ db1_printf(("b_bcount is: %d\n", (int) bp->b_bcount));
if (bp->b_bcount == 0) {
panic("bp->b_bcount is zero in InitBP!!\n");
}
- bp->b_proc = b_proc;
- bp->b_iodone = cbFunc;
- bp->b_vp = b_vp;
-
-}
-#endif /* KERNEL */
+ bp->b_proc = b_proc;
+ bp->b_iodone = cbFunc;
+ bp->b_vp = b_vp;
+}
/* Extras... */
-unsigned int rpcc()
+unsigned int
+rpcc()
{
- /* XXX no clue what this is supposed to do.. my guess is
- that it's supposed to read the CPU cycle counter... */
- /* db1_printf("this is supposed to do something useful too!??\n"); */
- return(0);
+ /* XXX no clue what this is supposed to do.. my guess is that it's
+ * supposed to read the CPU cycle counter... */
+ /* db1_printf("this is supposed to do something useful too!??\n"); */
+ return (0);
}
-
#if 0
-int rf_GetSpareTableFromDaemon(req)
- RF_SparetWait_t *req;
+int
+rf_GetSpareTableFromDaemon(req)
+ RF_SparetWait_t *req;
{
- int retcode=1;
- printf("This is supposed to do something useful!!\n"); /* XXX */
-
- return(retcode);
+ int retcode = 1;
+ printf("This is supposed to do something useful!!\n"); /* XXX */
+
+ return (retcode);
}
#endif
@@ -1865,7 +1659,7 @@ raidgetdefaultlabel(raidPtr, rs, lp)
lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
strncpy(lp->d_typename, "raid", sizeof(lp->d_typename));
- lp->d_type = DTYPE_RAID;
+ lp->d_type = DTYPE_RAID;
strncpy(lp->d_packname, "fictitious", sizeof(lp->d_packname));
lp->d_rpm = 3600;
lp->d_interleave = 1;
@@ -1881,18 +1675,17 @@ raidgetdefaultlabel(raidPtr, rs, lp)
lp->d_checksum = dkcksum(rs->sc_dkdev.dk_label);
}
-
/*
* Read the disklabel from the raid device. If one is not present, fake one
* up.
*/
static void
raidgetdisklabel(dev)
- dev_t dev;
+ dev_t dev;
{
- int unit = raidunit(dev);
+ int unit = raidunit(dev);
struct raid_softc *rs = &raid_softc[unit];
- char *errstring;
+ char *errstring;
struct disklabel *lp = rs->sc_dkdev.dk_label;
struct cpu_disklabel *clp = rs->sc_dkdev.dk_cpulabel;
RF_Raid_t *raidPtr;
@@ -1910,10 +1703,10 @@ raidgetdisklabel(dev)
*/
errstring = readdisklabel(RAIDLABELDEV(dev), raidstrategy,
rs->sc_dkdev.dk_label, rs->sc_dkdev.dk_cpulabel);
- if (errstring)
+ if (errstring)
raidmakedisklabel(rs);
else {
- int i;
+ int i;
struct partition *pp;
/*
@@ -1939,7 +1732,6 @@ raidgetdisklabel(dev)
}
}
-
/*
* Take care of things one might want to take care of in the event
* that a disklabel isn't present.
@@ -1962,53 +1754,51 @@ raidmakedisklabel(rs)
lp->d_checksum = dkcksum(lp);
}
-
/*
* Lookup the provided name in the filesystem. If the file exists,
* is a valid block device, and isn't being used by anyone else,
* set *vpp to the file's vnode.
- * You'll find the original of this in ccd.c
+ * You'll find the original of this in ccd.c
*/
int
raidlookup(path, p, vpp)
- char *path;
+ char *path;
struct proc *p;
struct vnode **vpp; /* result */
{
struct nameidata nd;
struct vnode *vp;
struct vattr va;
- int error;
+ int error;
NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path, p);
- if ((error = vn_open(&nd, FREAD|FWRITE, 0)) != 0) {
+ if ((error = vn_open(&nd, FREAD | FWRITE, 0)) != 0) {
#ifdef DEBUG
- printf("RAIDframe: vn_open returned %d\n",error);
+ printf("RAIDframe: vn_open returned %d\n", error);
#endif
return (error);
}
vp = nd.ni_vp;
if (vp->v_usecount > 1) {
VOP_UNLOCK(vp, 0);
- (void)vn_close(vp, FREAD|FWRITE, p->p_ucred, p);
+ (void) vn_close(vp, FREAD | FWRITE, p->p_ucred, p);
return (EBUSY);
}
if ((error = VOP_GETATTR(vp, &va, p->p_ucred, p)) != 0) {
VOP_UNLOCK(vp, 0);
- (void)vn_close(vp, FREAD|FWRITE, p->p_ucred, p);
+ (void) vn_close(vp, FREAD | FWRITE, p->p_ucred, p);
return (error);
}
/* XXX: eventually we should handle VREG, too. */
if (va.va_type != VBLK) {
VOP_UNLOCK(vp, 0);
- (void)vn_close(vp, FREAD|FWRITE, p->p_ucred, p);
+ (void) vn_close(vp, FREAD | FWRITE, p->p_ucred, p);
return (ENOTBLK);
}
VOP_UNLOCK(vp, 0);
*vpp = vp;
return (0);
}
-
/*
* Wait interruptibly for an exclusive lock.
*
@@ -2020,18 +1810,17 @@ static int
raidlock(rs)
struct raid_softc *rs;
{
- int error;
+ int error;
while ((rs->sc_flags & RAIDF_LOCKED) != 0) {
rs->sc_flags |= RAIDF_WANTED;
- if ((error =
- tsleep(rs, PRIBIO | PCATCH, "raidlck", 0)) != 0)
+ if ((error =
+ tsleep(rs, PRIBIO | PCATCH, "raidlck", 0)) != 0)
return (error);
}
rs->sc_flags |= RAIDF_LOCKED;
return (0);
}
-
/*
* Unlock and wake up any waiters.
*/