⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_dagffrd.c

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    (RF_DagNode_t *), allocList);  i = 0;  diskNodes   = &nodes[i]; i += n;  blockNode   = &nodes[i]; i += 1;  commitNode   = &nodes[i]; i += 1;  termNode    = &nodes[i];  i += 1;  RF_ASSERT(i == totalNumNodes);  /* initialize nodes */  switch (type) {    case RF_IO_TYPE_READ:      rf_InitNode(blockNode, rf_wait, RF_FALSE, rf_NullNodeFunc, rf_NullNodeUndoFunc,        NULL, n, 0, 0, 0, dag_h, "Nil", allocList);      rf_InitNode(commitNode, rf_wait, RF_TRUE, rf_NullNodeFunc, rf_NullNodeUndoFunc,        NULL, 1, n, 0, 0, dag_h, "Cmt", allocList);      rf_InitNode(termNode, rf_wait, RF_FALSE, rf_TerminateFunc, rf_TerminateUndoFunc,        NULL, 0, 1, 0, 0, dag_h, "Trm", allocList);      break;    case RF_IO_TYPE_WRITE:      rf_InitNode(blockNode, rf_wait, RF_FALSE, rf_NullNodeFunc, rf_NullNodeUndoFunc,        NULL, 1, 0, 0, 0, dag_h, "Nil", allocList);      rf_InitNode(commitNode, rf_wait, RF_TRUE, rf_NullNodeFunc, rf_NullNodeUndoFunc,        NULL, n, 1, 0, 0, dag_h, "Cmt", allocList);      rf_InitNode(termNode, rf_wait, RF_FALSE, rf_TerminateFunc, rf_TerminateUndoFunc,        NULL, 0, n, 0, 0, dag_h, "Trm", allocList);      break;    default:      RF_PANIC();  }  for (i = 0; i < n; i++) {    RF_ASSERT(pda != NULL);    rf_InitNode(&diskNodes[i], rf_wait, RF_FALSE, doFunc, undoFunc, rf_GenericWakeupFunc,      1, 1, 4, 0, dag_h, name, allocList);    diskNodes[i].params[0].p  = pda;    diskNodes[i].params[1].p  = pda->bufPtr;    /* parity stripe id is not necessary */    diskNodes[i].params[2].v  = 0;    diskNodes[i].params[3].v  = RF_CREATE_PARAM3(RF_IO_NORMAL_PRIORITY, 0, 0, 0);    pda = pda->next;  }  /*   * Connect nodes.   */  /* connect hdr to block node */  RF_ASSERT(blockNode->numAntecedents == 0);  dag_h->succedents[0] = blockNode;  if (type == RF_IO_TYPE_READ) {    /* connecting a nonredundant read DAG */    RF_ASSERT(blockNode->numSuccedents == n);    RF_ASSERT(commitNode->numAntecedents == n);    for (i=0; i < n; i++) {      /* connect block node to each read node */      RF_ASSERT(diskNodes[i].numAntecedents == 1);      blockNode->succedents[i] = &diskNodes[i];      diskNodes[i].antecedents[0] = blockNode;      diskNodes[i].antType[0] = rf_control;      /* connect each read node to the commit node */      RF_ASSERT(diskNodes[i].numSuccedents == 1);      diskNodes[i].succedents[0] = commitNode;      commitNode->antecedents[i] = &diskNodes[i];      commitNode->antType[i] = rf_control;    }    /* connect the commit node to the term node */    RF_ASSERT(commitNode->numSuccedents == 1);    RF_ASSERT(termNode->numAntecedents == 1);    RF_ASSERT(termNode->numSuccedents == 0);    commitNode->succedents[0] = termNode;    termNode->antecedents[0] = commitNode;    termNode->antType[0] = rf_control;  }  else {    /* connecting a nonredundant write DAG */    /* connect the block node to the commit node */    RF_ASSERT(blockNode->numSuccedents == 1);    RF_ASSERT(commitNode->numAntecedents == 1);    blockNode->succedents[0] = commitNode;    commitNode->antecedents[0] = blockNode;    commitNode->antType[0] = rf_control;    RF_ASSERT(commitNode->numSuccedents == n);    RF_ASSERT(termNode->numAntecedents == n);    RF_ASSERT(termNode->numSuccedents == 0);    for (i=0; i < n; i++) {      /* connect the commit node to each write node */      RF_ASSERT(diskNodes[i].numAntecedents == 1);      commitNode->succedents[i] = &diskNodes[i];      diskNodes[i].antecedents[0] = commitNode;      diskNodes[i].antType[0] = rf_control;      /* connect each write node to the term node */      RF_ASSERT(diskNodes[i].numSuccedents == 1);      diskNodes[i].succedents[0] = termNode;      termNode->antecedents[i] = &diskNodes[i];      termNode->antType[i] = rf_control;    }  }}/****************************************************************************** * Create a fault-free read DAG for RAID level 1 * * Hdr -> Nil -> Rmir -> Cmt -> Trm * * The "Rmir" node schedules a read from the disk in the mirror pair with the * shortest disk queue.  the proper queue is selected at Rmir execution.  this * deferred mapping is unlike other archs in RAIDframe which generally fix * mapping at DAG creation time. * * Parameters:  raidPtr   - description of the physical array *              asmap     - logical & physical addresses for this access *              bp        - buffer ptr (for holding read data) *              flags     - general flags (e.g. disk locking)  *              allocList - list of memory allocated in DAG creation *****************************************************************************/static void CreateMirrorReadDAG(  RF_Raid_t             *raidPtr,  RF_AccessStripeMap_t  *asmap,  RF_DagHeader_t        *dag_h,  void                  *bp,  RF_RaidAccessFlags_t   flags,  RF_AllocListElem_t    *allocList,  int                   (*readfunc)(RF_DagNode_t *node)){  RF_DagNode_t *readNodes, *nodes, *blockNode, *commitNode, *termNode;  RF_PhysDiskAddr_t *data_pda = asmap->physInfo;  RF_PhysDiskAddr_t *parity_pda = asmap->parityInfo;  int i, n, totalNumNodes;  n = asmap->numStripeUnitsAccessed;  dag_h->creator = "RaidOneReadDAG";  if (rf_dagDebug) {    printf("[Creating RAID level 1 read DAG]\n");  }  /*   * This dag can not commit until the commit node is reached   * errors prior to the commit point imply the dag has failed.   */  dag_h->numCommitNodes = 1;  dag_h->numCommits = 0;  dag_h->numSuccedents = 1;  /*   * Node count:   * n data reads   * 1 block node   * 1 commit node   * 1 terminator node   */  RF_ASSERT(n > 0);  totalNumNodes = n + 3;  RF_CallocAndAdd(nodes, totalNumNodes, sizeof(RF_DagNode_t),    (RF_DagNode_t *), allocList);  i = 0;  readNodes   = &nodes[i]; i += n;  blockNode   = &nodes[i]; i += 1;  commitNode = &nodes[i]; i += 1;  termNode    = &nodes[i]; i += 1;  RF_ASSERT(i == totalNumNodes);  /* initialize nodes */  rf_InitNode(blockNode, rf_wait, RF_FALSE, rf_NullNodeFunc,    rf_NullNodeUndoFunc, NULL, n, 0, 0, 0, dag_h, "Nil", allocList);  rf_InitNode(commitNode, rf_wait, RF_TRUE, rf_NullNodeFunc,    rf_NullNodeUndoFunc, NULL, 1, n, 0, 0, dag_h, "Cmt", allocList);  rf_InitNode(termNode, rf_wait, RF_FALSE, rf_TerminateFunc,    rf_TerminateUndoFunc, NULL, 0, 1, 0, 0, dag_h, "Trm", allocList);  for (i = 0; i < n; i++) {    RF_ASSERT(data_pda != NULL);    RF_ASSERT(parity_pda != NULL);    rf_InitNode(&readNodes[i], rf_wait, RF_FALSE, readfunc,      rf_DiskReadMirrorUndoFunc, rf_GenericWakeupFunc, 1, 1, 5, 0, dag_h,      "Rmir", allocList);    readNodes[i].params[0].p = data_pda;    readNodes[i].params[1].p = data_pda->bufPtr;    /* parity stripe id is not necessary */    readNodes[i].params[2].p = 0;    readNodes[i].params[3].v = RF_CREATE_PARAM3(RF_IO_NORMAL_PRIORITY, 0, 0, 0);    readNodes[i].params[4].p = parity_pda;    data_pda = data_pda->next;    parity_pda = parity_pda->next;  }  /*   * Connect nodes   */  /* connect hdr to block node */  RF_ASSERT(blockNode->numAntecedents == 0);  dag_h->succedents[0] = blockNode;  /* connect block node to read nodes */  RF_ASSERT(blockNode->numSuccedents == n);  for (i=0; i < n; i++) {    RF_ASSERT(readNodes[i].numAntecedents == 1);    blockNode->succedents[i] = &readNodes[i];    readNodes[i].antecedents[0] = blockNode;    readNodes[i].antType[0] = rf_control;  }  /* connect read nodes to commit node */  RF_ASSERT(commitNode->numAntecedents == n);  for (i=0; i < n; i++) {    RF_ASSERT(readNodes[i].numSuccedents == 1);    readNodes[i].succedents[0] = commitNode;    commitNode->antecedents[i] = &readNodes[i];    commitNode->antType[i] = rf_control;  }  /* connect commit node to term node */  RF_ASSERT(commitNode->numSuccedents == 1);  RF_ASSERT(termNode->numAntecedents == 1);  RF_ASSERT(termNode->numSuccedents == 0);  commitNode->succedents[0] = termNode;  termNode->antecedents[0] = commitNode;  termNode->antType[0] = rf_control;}void rf_CreateMirrorIdleReadDAG(  RF_Raid_t             *raidPtr,  RF_AccessStripeMap_t  *asmap,  RF_DagHeader_t        *dag_h,  void                  *bp,  RF_RaidAccessFlags_t   flags,  RF_AllocListElem_t    *allocList){  CreateMirrorReadDAG(raidPtr, asmap, dag_h, bp, flags, allocList,    rf_DiskReadMirrorIdleFunc);}void rf_CreateMirrorPartitionReadDAG(  RF_Raid_t             *raidPtr,  RF_AccessStripeMap_t  *asmap,  RF_DagHeader_t        *dag_h,  void                  *bp,  RF_RaidAccessFlags_t   flags,  RF_AllocListElem_t    *allocList){  CreateMirrorReadDAG(raidPtr, asmap, dag_h, bp, flags, allocList,    rf_DiskReadMirrorPartitionFunc);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -