summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authoroster <oster@NetBSD.org>2000-01-14 01:00:26 +0000
committeroster <oster@NetBSD.org>2000-01-14 01:00:26 +0000
commit11e019370ed2f672e81c58742c2abbcedbf5e7e9 (patch)
tree35eec046d17ad650b2a3f2942fba727d1783ce0b /sys/dev/raidframe
parentee867c7fdfcc62ba475b2c64da45ef0d8c4dd8d8 (diff)
"fix" a serious problem with RF_AccTraceEntry_t tracerec stuff.
XXX the "fix" is incorrect, but that makes it consistent with some of the other code here. A this point you should *not* be thinking about using this code. (At all.) (And I mean it.)
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_paritylogDiskMgr.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/sys/dev/raidframe/rf_paritylogDiskMgr.c b/sys/dev/raidframe/rf_paritylogDiskMgr.c
index f459c6932d2..13d4d9fb8f6 100644
--- a/sys/dev/raidframe/rf_paritylogDiskMgr.c
+++ b/sys/dev/raidframe/rf_paritylogDiskMgr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_paritylogDiskMgr.c,v 1.7 2000/01/08 01:18:36 oster Exp $ */
+/* $NetBSD: rf_paritylogDiskMgr.c,v 1.8 2000/01/14 01:00:26 oster Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -116,7 +116,7 @@ ReadRegionLog(
*
* NON-BLOCKING */
- RF_AccTraceEntry_t tracerec;
+ RF_AccTraceEntry_t *tracerec;
RF_DagNode_t *rrd_rdNode;
/* create DAG to read region log from disk */
@@ -136,8 +136,9 @@ ReadRegionLog(
printf("set rrd_pda->next to NULL\n");
}
/* initialize DAG parameters */
- bzero((char *) &tracerec, sizeof(tracerec));
- (*rrd_dag_h)->tracerec = &tracerec;
+ RF_Malloc(tracerec,sizeof(RF_AccTraceEntry_t), (RF_AccTraceEntry_t *));
+ bzero((char *) tracerec, sizeof(RF_AccTraceEntry_t));
+ (*rrd_dag_h)->tracerec = tracerec;
rrd_rdNode = (*rrd_dag_h)->succedents[0]->succedents[0];
rrd_rdNode->params[0].p = *rrd_pda;
/* rrd_rdNode->params[1] = regionBuffer; */
@@ -161,7 +162,7 @@ WriteCoreLog(
RF_PhysDiskAddr_t ** fwr_pda)
{
RF_RegionId_t regionID = log->regionID;
- RF_AccTraceEntry_t tracerec;
+ RF_AccTraceEntry_t *tracerec;
RF_SectorNum_t regionOffset;
RF_DagNode_t *fwr_wrNode;
@@ -184,8 +185,9 @@ WriteCoreLog(
(*fwr_pda)->numSector = raidPtr->numSectorsPerLog;
/* initialize DAG parameters */
- bzero((char *) &tracerec, sizeof(tracerec));
- (*fwr_dag_h)->tracerec = &tracerec;
+ RF_Malloc(tracerec,sizeof(RF_AccTraceEntry_t), (RF_AccTraceEntry_t *));
+ bzero((char *) tracerec, sizeof(RF_AccTraceEntry_t));
+ (*fwr_dag_h)->tracerec = tracerec;
fwr_wrNode = (*fwr_dag_h)->succedents[0]->succedents[0];
fwr_wrNode->params[0].p = *fwr_pda;
/* fwr_wrNode->params[1] = log->bufPtr; */
@@ -213,7 +215,7 @@ ReadRegionParity(
*
* NON-BLOCKING */
- RF_AccTraceEntry_t tracerec;
+ RF_AccTraceEntry_t *tracerec;
RF_DagNode_t *prd_rdNode;
/* create DAG to read region parity from disk */
@@ -234,8 +236,9 @@ ReadRegionParity(
printf("set prd_pda->next to NULL\n");
}
/* initialize DAG parameters */
- bzero((char *) &tracerec, sizeof(tracerec));
- (*prd_dag_h)->tracerec = &tracerec;
+ RF_Malloc(tracerec,sizeof(RF_AccTraceEntry_t), (RF_AccTraceEntry_t *));
+ bzero((char *) tracerec, sizeof(RF_AccTraceEntry_t));
+ (*prd_dag_h)->tracerec = tracerec;
prd_rdNode = (*prd_dag_h)->succedents[0]->succedents[0];
prd_rdNode->params[0].p = *prd_pda;
prd_rdNode->params[1].p = parityBuffer;
@@ -263,7 +266,7 @@ WriteRegionParity(
*
* NON-BLOCKING */
- RF_AccTraceEntry_t tracerec;
+ RF_AccTraceEntry_t *tracerec;
RF_DagNode_t *pwr_wrNode;
/* create DAG to write region log from disk */
@@ -278,8 +281,9 @@ WriteRegionParity(
rf_MapRegionParity(raidPtr, regionID, &((*pwr_pda)->row), &((*pwr_pda)->col), &((*pwr_pda)->startSector), &((*pwr_pda)->numSector));
/* initialize DAG parameters */
- bzero((char *) &tracerec, sizeof(tracerec));
- (*pwr_dag_h)->tracerec = &tracerec;
+ RF_Malloc(tracerec,sizeof(RF_AccTraceEntry_t), (RF_AccTraceEntry_t *));
+ bzero((char *) tracerec, sizeof(RF_AccTraceEntry_t));
+ (*pwr_dag_h)->tracerec = tracerec;
pwr_wrNode = (*pwr_dag_h)->succedents[0]->succedents[0];
pwr_wrNode->params[0].p = *pwr_pda;
/* pwr_wrNode->params[1] = parityBuffer; */
@@ -552,6 +556,7 @@ rf_ParityLoggingDiskManager(RF_Raid_t * raidPtr)
{
RF_ParityLog_t *reintQueue, *flushQueue;
int workNeeded, done = RF_FALSE;
+ int s;
/* Main program for parity logging disk thread. This routine waits
* for work to appear in either the flush or reintegration queues and
@@ -560,6 +565,8 @@ rf_ParityLoggingDiskManager(RF_Raid_t * raidPtr)
*
* BLOCKING */
+ s = splbio();
+
RF_LOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex);
/*
@@ -598,7 +605,7 @@ rf_ParityLoggingDiskManager(RF_Raid_t * raidPtr)
/* empty flushQueue, using free'd log buffers to
* process bufTail */
if (flushQueue)
- FlushLogsToDisk(raidPtr, flushQueue);
+ FlushLogsToDisk(raidPtr, flushQueue);
/* empty reintQueue, flushing from reintTail as we go */
if (reintQueue)
@@ -641,6 +648,8 @@ rf_ParityLoggingDiskManager(RF_Raid_t * raidPtr)
RF_UNLOCK_MUTEX(raidPtr->parityLogDiskQueue.mutex);
RF_SIGNAL_COND(raidPtr->parityLogDiskQueue.cond);
+ splx(s);
+
/*
* In the NetBSD kernel, the thread must exit; returning would
* cause the proc trampoline to attempt to return to userspace.