disksim_redun.c

来自「disksim是一个非常优秀的磁盘仿真工具」· C语言 代码 · 共 1,296 行 · 第 1/3 页

C
1,296
字号
static void logorg_parity_read_old_sync (logorg *currlogorg, ioreq_event *curr, int numreqs){   int i, j;   depends *depend;   depends *tmpdep;   ioreq_event *temp;   int devno = 1;   depend = (depends *) getfromextraq();   depend->blkno = curr->blkno;   depend->devno = curr->devno;   depend->deps[0] = ioreq_copy(curr);   depend->deps[0]->opid = numreqs;   curr->prev = (ioreq_event *) depend;   depend->numdeps = numreqs;   temp = curr->next;   for (i=1; i<numreqs; i++) {      if (devno == 0) {	 depend->cont = (depends *) getfromextraq();	 depend = depend->cont;      }      depend->deps[devno] = ioreq_copy(temp);      depend->deps[devno]->opid = numreqs;      devno = logorg_modulus_update(1, devno, 10);      temp = temp->next;   }   temp = curr->next;   curr->flags |= READ;   for (i=1; i<numreqs; i++) {      depend = (depends *) ioreq_copy(curr->prev);      depend->next = (depends *) curr->prev;      curr->prev = (ioreq_event *) depend;      depend->blkno = temp->blkno;      depend->devno = temp->devno;      tmpdep = depend->cont;      for (j=0; j<(numreqs/10); j++) {	 depend->cont = (depends *) ioreq_copy((ioreq_event *) tmpdep);	 tmpdep = tmpdep->cont;	 depend = depend->cont;      }      temp->flags |= READ;      temp = temp->next;   }}static void logorg_parity_read_old_nosync (logorg *currlogorg, ioreq_event *curr, int numreqs){   int i;   depends *depend;   depends *tmpdep;   ioreq_event *temp;   int devno = 1;   depend = (depends *) getfromextraq();   depend->blkno = curr->blkno;   depend->devno = curr->devno;   depend->numdeps = numreqs;   depend->next = NULL;   depend->deps[0] = ioreq_copy(curr);   depend->deps[0]->opid = 1;   curr->prev = (ioreq_event *) depend;   curr->flags |= READ;   temp = curr->next;   for (i=1; i<numreqs; i++) {      if (devno == 0) {	 depend->cont = (depends *) getfromextraq();	 depend = depend->cont;      }      tmpdep = (depends *) getfromextraq();      tmpdep->blkno = temp->blkno;      tmpdep->devno = temp->devno;      tmpdep->numdeps = 1;      tmpdep->next = (depends *) curr->prev;      curr->prev = (ioreq_event *) tmpdep;      tmpdep->deps[0] = ioreq_copy(temp);      tmpdep->deps[0]->opid = 2;      depend->deps[devno] = tmpdep->deps[0];      temp->flags |= READ;      devno = logorg_modulus_update(1, devno, 10);      temp = temp->next;   }}int logorg_parity_rotate (logorg *currlogorg, ioreq_event *curr, int numreqs){   int reqs = 2;   if (currlogorg->maptype == IDEAL) {      logorg_parity_rotate_ideal(currlogorg, curr);   } else if (currlogorg->maptype == RANDOM) {      logorg_parity_rotate_random(currlogorg, curr);   } else if (currlogorg->maptype == ASIS) {      switch (currlogorg->rottype) {	 case PARITY_LEFT_SYM:	 case PARITY_LEFT_ASYM:            reqs = logorg_parity_rotate_updates(currlogorg, curr, -1);	    break;	 case PARITY_RIGHT_SYM:	 case PARITY_RIGHT_ASYM:            reqs = logorg_parity_rotate_updates(currlogorg, curr, 1);	    break;	 default:	    fprintf(stderr, "Unknown rottype at logorg_parity_rotate - %d\n", currlogorg->rottype);	    exit(1);      }   } else {      fprintf(stderr, "Unknown maptype at logorg_parity_rotate - %d\n", currlogorg->maptype);      exit(1);   }   if (curr->flags & READ) {      return(1);   }   if (currlogorg->writesync == TRUE) {      logorg_parity_read_old_sync(currlogorg, curr, reqs);   } else {      logorg_parity_read_old_nosync(currlogorg, curr, reqs);   }   return(2*reqs);}static int logorg_join_seqreqs (ioreq_event *reqlist, ioreq_event *curr, int seqgive){   ioreq_event *temp;   ioreq_event *del;   int numreqs = 0;   int distance;   temp = reqlist;   if (temp) {      while (temp->next) {	 distance = temp->next->blkno - temp->blkno - temp->bcount;/*fprintf (outputfile, "In logorg_join_seqreqs, devno %d, blkno %d, bcount %d, read %d, distance %d\n", temp->devno, temp->blkno, temp->bcount, (temp->flags & READ), distance);*/         if (distance < 0) {            fprintf(stderr, "Integrity check failure at logorg_join_seqreqs - blkno %d, bcount %d, blkno %d, read %d\n", temp->blkno, temp->bcount, temp->next->blkno, (temp->flags & READ));            exit(1);         }         if (((temp->flags & READ) == (temp->next->flags & READ)) && (distance <= seqgive)) {            del = temp->next;            temp->next = del->next;            temp->bcount += del->bcount + distance;	    temp->opid |= del->opid;            addtoextraq((event *) del);         } else {            del = temp;            temp = del->next;            del->next = curr->next;            curr->next = del;	    del->time = curr->time;	    del->buf = curr->buf;            numreqs++;         }      }      numreqs++;      temp->next = curr->next;      curr->next = temp;      temp->time = curr->time;      temp->buf = curr->buf;   }   return(numreqs);}static void logorg_parity_table_insert (ioreq_event **head, ioreq_event *curr){   ioreq_event *temp;   if (((*head) == NULL) || (curr->blkno < (*head)->blkno)) {      curr->next = (*head);      (*head) = curr;   } else {      temp = (*head);      while ((temp->next) && (curr->blkno >= temp->next->blkno)) {         temp = temp->next;      }      curr->next = temp->next;      temp->next = curr;   }}static void logorg_parity_table_read_old (logorg *currlogorg, ioreq_event *rowhead, ioreq_event **reqlist, int opid){   ioreq_event *temp;   ioreq_event *newreq;   ioreq_event *prev = NULL;   temp = rowhead;   while (temp) {      newreq = (ioreq_event *) getfromextraq();      newreq->blkno = temp->blkno;      newreq->devno = temp->devno;      newreq->bcount = temp->bcount;      newreq->flags = temp->flags | READ;      newreq->opid = opid;      logorg_parity_table_insert(&reqlist[newreq->devno], newreq);      newreq->prev = prev;      prev = newreq;	/* only the last write (the parity update) must depend on the reads */      if (temp->prev == NULL) {         temp->opid = opid;      }      temp = temp->prev;   }}static void logorg_parity_table_recon (logorg *currlogorg, ioreq_event *rowhead, ioreq_event **reqlist, int stripeno, int unitno, int tableadd, int opid){   ioreq_event *temp;   ioreq_event *newreq;   int entryno;   int minblkno;   int maxblkno;   int lastentry;   int i;   int blkno;   int offset;   temp = rowhead;   if (temp == NULL) {      fprintf(stderr, "Can't have NULL rowhead at logorg_parity_table_recon\n");      exit(1);   }   lastentry = (stripeno + 1) * currlogorg->partsperstripe + stripeno;   while (temp->prev) {      temp = temp->prev;   }   temp->opid = opid;   minblkno = temp->blkno - currlogorg->table[lastentry].blkno - tableadd;   maxblkno = minblkno + temp->bcount;   entryno = stripeno * currlogorg->partsperstripe + stripeno;   for (i = 0; i < unitno; i++) {      newreq = (ioreq_event *) getfromextraq();      newreq->devno = currlogorg->table[entryno].devno;      newreq->blkno = tableadd + minblkno + currlogorg->table[entryno].blkno;      newreq->bcount = maxblkno - minblkno;      newreq->flags = rowhead->flags | READ;      newreq->opid = opid;      logorg_parity_table_insert(&reqlist[newreq->devno], newreq);      entryno++;   }   temp = rowhead;   while (temp->prev) {      blkno = currlogorg->table[entryno].blkno;      offset = temp->blkno - tableadd - blkno;      if (offset > minblkno) {         newreq = (ioreq_event *) getfromextraq();         newreq->devno = temp->devno;         newreq->blkno = tableadd + blkno + minblkno;         newreq->bcount = offset - minblkno;         newreq->flags = temp->flags | READ;	 newreq->opid = opid;         logorg_parity_table_insert(&reqlist[newreq->devno], newreq);      }      if ((offset + temp->bcount) < maxblkno) {         newreq = (ioreq_event *) getfromextraq();         newreq->devno = temp->devno;         newreq->blkno = temp->blkno + temp->bcount;         newreq->bcount = maxblkno - offset - temp->bcount;         newreq->flags = temp->flags | READ;	 newreq->opid = opid;         logorg_parity_table_insert(&reqlist[newreq->devno], newreq);      }      entryno++;      temp = temp->prev;   }   for (; entryno < lastentry; entryno++) {      newreq = (ioreq_event *) getfromextraq();      newreq->devno = currlogorg->table[entryno].devno;      newreq->blkno = tableadd + minblkno + currlogorg->table[entryno].blkno;      newreq->bcount = maxblkno - minblkno;      newreq->flags = rowhead->flags | READ;      newreq->opid = opid;      logorg_parity_table_insert(&reqlist[newreq->devno], newreq);   }}static void logorg_parity_table_dodeps_sync (logorg *currlogorg, ioreq_event *curr, ioreq_event **redunlist, ioreq_event **reqlist){   int i, j;   depends *depend;   depends *tmpdep;   int opid = 0;   int numdeps = 0;   ioreq_event *temp;   ioreq_event *deplist = NULL;   int devno = 1;   for (i=0; i<currlogorg->actualnumdisks; i++) {      temp = redunlist[i];      while (temp) {	 temp->opid = curr->opid;	 opid++;	 if (temp->next == NULL) {	    temp->next = curr->next;	    curr->next = redunlist[i];	    break;	 }	 temp = temp->next;      }      temp = reqlist[i];      while (temp) {	 numdeps++;	 if (temp->next == NULL) {	    temp->next = deplist;	    deplist = reqlist[i];	    break;	 }	 temp = temp->next;      }   }   if (numdeps <= 0) {      fprintf(stderr, "Can't have zero requests at logorg_parity_table_dodeps_sync\n");      exit(1);   }   if (opid == 0) {      curr->prev = NULL;      curr->next = deplist;      return;   }   depend = (depends *) getfromextraq();   depend->blkno = curr->next->blkno;   depend->devno = curr->next->devno;   depend->numdeps = numdeps;   curr->prev = (ioreq_event *) depend;   depend->deps[0] = deplist;   deplist->opid = opid;   temp = deplist->next;   for (i=1; i<numdeps; i++) {      if (devno == 0) {	 depend->cont = (depends *) getfromextraq();	 depend = depend->cont;      }      depend->deps[devno] = temp;      temp->opid = opid;      devno = logorg_modulus_update(1, devno, 10);      temp = temp->next;   }   temp = curr->next->next;   for (i=1; i<opid; i++) {      depend = (depends *) ioreq_copy(curr->prev);      depend->next = (depends *) curr->prev;      curr->prev = (ioreq_event *) depend;      depend->blkno = temp->blkno;      depend->devno = temp->devno;      tmpdep = depend->cont;      for (j=0; j<(numdeps/10); j++) {	 depend->cont = (depends *) ioreq_copy((ioreq_event *) tmpdep);	 tmpdep = tmpdep->cont;	 depend = depend->cont;      }      temp = temp->next;   }}static void logorg_parity_table_dodeps_nosync (logorg *currlogorg, ioreq_event *curr, ioreq_event **redunlist, ioreq_event **reqlist){   int i;   depends *depend;   depends *tmpdep;   ioreq_event *temp;   ioreq_event *del;   ioreq_event *tmpread;   ioreq_event *readlist = NULL;   ioreq_event *deplist = NULL;   int holddep;   for (i=0; i<currlogorg->actualnumdisks; i++) {      temp = redunlist[i];      while (temp) {         depend = (depends *) getfromextraq();         depend->blkno = temp->blkno;         depend->devno = temp->devno;         depend->numdeps = 0;	 depend->next = NULL;	 temp->prev = (ioreq_event *) depend;	 if (temp->next == NULL) {	    temp->next = readlist;	    readlist = redunlist[i];	    break;	 }	 temp = temp->next;      }      temp = reqlist[i];      while (temp) {	 del = temp;	 temp = temp->next;	 if ((redunlist[i] == NULL) && (del->opid == 0)) {	    del->next = curr->next;	    curr->next = del;	 } else {	    del->next = deplist;	    deplist = del;	 }      }   }   if (readlist == NULL) {      if (deplist) {         fprintf(stderr, "Unacceptable condition in logorg_parity_table_dodeps_nosync\n");         exit(1);      }      curr->prev = NULL;      return;   }   temp = deplist;   while (temp) {      holddep = temp->opid;      temp->opid = 0;      tmpread = readlist;      while (tmpread) {	 if ((tmpread->devno == temp->devno) | (holddep & tmpread->opid)) {            tmpdep = (depends *) tmpread->prev;            ASSERT (tmpdep != NULL);            if (tmpdep->numdeps > 0) {	       for (i=0; i<((tmpdep->numdeps-1)/10); i++) {	          tmpdep = tmpdep->cont;	       }	       if ((tmpdep->numdeps % 10) == 0) {	          tmpdep->cont = (depends *) getfromextraq();

⌨️ 快捷键说明

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