|
|
1.1 ! root 1: #define _POSIX_SOURCE ! 2: #include <stddef.h> ! 3: #include <stdlib.h> ! 4: #include <unistd.h> ! 5: #include <stdio.h> ! 6: #include <string.h> ! 7: #include <errno.h> ! 8: #include <time.h> ! 9: #include "jukeface.h" ! 10: #include "jukebox.h" ! 11: ! 12: static j_empty_drive(Jukebox *, long tlimit, char *buf); ! 13: ! 14: j_load(Jukebox *j, char *vol_id, char *buf, long tlimit) ! 15: { ! 16: int side; ! 17: int n, sh, dr; ! 18: char disk_to_load[256]; ! 19: struct lun *l; ! 20: ! 21: if(j_rdshelves(j, buf)) /* read in shelf names */ ! 22: return(-1); ! 23: /* ! 24: be careful. due to a prom change the shelf indicator ! 25: is now off when IN a drive. so do the drive status AFTER ! 26: the shelf status. ! 27: */ ! 28: if(j_shstatus(j, buf)) /* get the jukebox status */ ! 29: return(-1); ! 30: if(j_drstatus(j, buf)) /* get the jukebox status */ ! 31: return(-1); ! 32: /* now check which side we want */ ! 33: n = strlen(vol_id); ! 34: strcpy(disk_to_load, vol_id); ! 35: if(disk_to_load[n-1] == 'a') ! 36: side = SIDEA; ! 37: else if(disk_to_load[n-1] == 'b') ! 38: side = SIDEB; ! 39: else { ! 40: sprintf(buf, "vol_id '%s' must end in a or b", vol_id); ! 41: return(-1); ! 42: } ! 43: disk_to_load[n-1] = 0; ! 44: /* which shelf is that? */ ! 45: sh = j_shelfof(j, disk_to_load); ! 46: if(sh < 0){ ! 47: sprintf(buf, "can't find vol_id %s", disk_to_load); ! 48: return(-1); ! 49: } ! 50: while(tlimit >= 0){ ! 51: for(n = 0; n < j->nluns; n++){ ! 52: l = &j->luns[n]; ! 53: if(l->shelf == sh){ ! 54: if((l->side == side) && (n < j->nworms)) ! 55: return(n); ! 56: if(l->spunup) ! 57: goto await; ! 58: if(j_dr_to_sh(n, -1, 0, buf)) ! 59: return(-1); ! 60: if(j_drstatus(j, buf)) /* get the jukebox status */ ! 61: return(-1); ! 62: break; ! 63: } ! 64: } ! 65: /* disk is available */ ! 66: dr = j_empty_drive(j, tlimit, buf); ! 67: if(dr < 0){ ! 68: sprintf(buf, "can't find a free drive"); ! 69: return(-1); ! 70: } ! 71: if(j_sh_to_dr(sh, side, dr, buf) < 0) ! 72: return(-1); ! 73: return(dr); ! 74: await: ! 75: sleep(10); ! 76: tlimit -= 10; ! 77: if(j_drstatus(j, buf)) /* get the jukebox status */ ! 78: return(-1); ! 79: } ! 80: sprintf(buf, "disk '%s' busy", disk_to_load); ! 81: return(-1); ! 82: } ! 83: ! 84: static ! 85: j_empty_drive(Jukebox *j, long tlimit, char *buf) ! 86: { ! 87: int i, tstop; ! 88: ! 89: tstop = time((long *)0) + tlimit; ! 90: while(time((long *)0) <= tstop){ ! 91: /* look for empty drives */ ! 92: for(i = 0; i < j->nworms; i++) ! 93: if(!j->luns[i].occupied) ! 94: return(i); ! 95: /* look for spun down drives */ ! 96: for(i = 0; i < j->nworms; i++){ ! 97: if(!j->luns[i].spunup){ ! 98: if(j_dr_to_sh(i, -1, SIDEA, buf)) ! 99: return(-1); ! 100: else ! 101: return(i); ! 102: } ! 103: } ! 104: sleep(10); ! 105: if(j_drstatus(j, buf)) /* get the jukebox status */ ! 106: return(-1); ! 107: } ! 108: return(-1); ! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.